Hibernate笔记1
Posted 胡广勤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate笔记1相关的知识,希望对你有一定的参考价值。
一.Hibernate概述
Hibernate是一个实现了ORM思想的,开源的,轻量级的,内部封装了JDBC操作的持久层框架.
实现了ORM思想的:不再重点关注sql语句的编写
开源的:开放源代码的
轻量级的:消耗的资源少(内存),依赖的jar包比较少
注:ORM思想(O:object R:relation M:mapping--对象关系映射)
目的:操作实体类就相当于操作数据库表
条件:1.创建实体类和表的映射关系
2.创建属性和字段的映射关系
二.环境搭建
1.导入jar包:必选/log4j/mysql驱动包
2.编写映射关系文件:实体类.hbm.xml,放在实体类包下
映射关系文件内容:
(1)实体类与sql表的关系
(2)实体类属性与sql表字段的关系
模板:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <!-- 1.创建实体类与表的映射关系 --> 7 <!-- 8 lazy:配置懒加载 9 true:使用懒加载(使用时才发送sql语句); 10 false:立即加载; 11 --> 12 <class name="linkman.Linkman" table="cst_linkman" lazy="false"> 13 <!-- 2.创建属性与字段值的映射关系 --> 14 <!--2.1配置主键 --> 15 <id name="lkmId" column="lkm_id"> 16 <generator class="native"></generator> 17 </id> 18 <!--2.2其它属性与字段 --> 19 <property name="lkmName" column="lkm_name"></property> 20 <property name="lkmGender" column="lkm_gender"></property> 21 <property name="lkmPhone" column="lkm_phone"></property> 22 <property name="lkmMobile" column="lkm_mobile"></property> 23 <property name="lkmEmail" column="lkm_email"></property> 24 <property name="lkmPosition" column="lkm_position"></property> 25 <property name="lkmMemo" column="lkm_memo"></property> 26 </class> 27 </hibernate-mapping>
3.编写hibernate核心配置文件:hibernate.cfg.xml,放在src包下
核心配置文件内容(顺序不能变):
(1)数据库配置信息;
(2)hibernate基本配置信息;
(3)映射关系文件的位置
模板:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!--数据库配置 --> 8 <!-- 9 hibernate.hbm2ddl.auto : hibernate生成数据定义语言 10 数据库的建表语句,使用hibernate自动创建数据库表 11 create-drop :程序开始的时候创建表(有表删表,再创建,没表直接创建),程序结束的时候删除表 12 create : 有表现删除再创建表,没表直接创建 13 update :没表创建表,有表的话如果映射关系发生了变化,更新表 14 validate :不会创建表,验证映射文件的配置,如果映射文件配置发生了变化,抛出异常 15 --> 16 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 17 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 18 <property name="hibernate.connection.url">jdbc:mysql:///cst_linkman</property> 19 <property name="hibernate.connection.username">root</property> 20 <property name="hibernate.connection.password">root</property> 21 <!--hibernate基本配置 --> 22 <property name="hibernate.hbm2ddl.auto">update</property> 23 <property name="hibernate.show_sql">true</property> 24 <property name="hibernate.format_sql">true</property> 25 <!--指定映射文件位置 --> 26 <mapping resource="linkman/Linkman.hbm.xml"/> 27 </session-factory> 28 </hibernate-configuration>
附:关于使用Eclipse软件编写以上两种配置文件的自动提示相关问题:
1.配置Eclipse:
菜单栏:window-->preferences-->XML-->Catalog,选中User Specified Entries,单击Add,选择File System,选中dtd文件(hibernate-configuration-3.0.dtd或者hibernate-mapping-3.0.dtd)的路径;Key Type选择uri,将对应的dtd文件中的uri(http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd或者http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd)复制进去即可;重启Eclipse,输入标签<>即可自动提示;
2.关于标签内属性的提示,需按快捷键alt+/
三.Hibernate使用步骤:七步
1.加载配置文件--Configuration
2.构建sessionFactory--cfg.buildSessionFactory
3.打开新的session--factory.openSession
4.开启事务--tx.beginTransaction
5.CRUD
6.提交事务--tx.commit
7.释放资源--session.close()/factory.close()(若使用工具类,factory不能释放)
工具类:HibernateUtils
1 //使用静态代码块创建factory,仅在启动时创建一次,提高效率 2 import org.hibernate.Session; 3 import org.hibernate.SessionFactory; 4 import org.hibernate.cfg.Configuration; 5 public class HibernateUtils { 6 private static SessionFactory factory; 7 static { 8 // 加载配置文件 9 Configuration cfg = new Configuration(); 10 cfg.configure(); 11 // 构建sessionFactory 12 factory = cfg.buildSessionFactory(); 13 } 14 public static Session getSession() { 15 return factory.openSession(); 16 } 17 }
============================================================
举例:
1.创建sql表
2.创建实体类
3.编写映射关系文件:Linkman.hbm.xml
4.编写hibernate配置文件:hibernate.cfg.xml
5.编写工具类
6.编写执行代码
------------------------------------------------------------
1.创建sql表
1 CREATE TABLE `cst_linkman` ( 2 `lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT ‘联系人编号(主键)‘, 3 `lkm_name` varchar(16) DEFAULT NULL COMMENT ‘联系人姓名‘, 4 `lkm_gender` varchar(10) DEFAULT NULL COMMENT ‘联系人性别‘, 5 `lkm_phone` varchar(16) DEFAULT NULL COMMENT ‘联系人办公电话‘, 6 `lkm_mobile` varchar(16) DEFAULT NULL COMMENT ‘联系人手机‘, 7 `lkm_email` varchar(64) DEFAULT NULL COMMENT ‘联系人邮箱‘, 8 `lkm_position` varchar(16) DEFAULT NULL COMMENT ‘联系人职位‘, 9 `lkm_memo` varchar(512) DEFAULT NULL COMMENT ‘联系人备注‘, 10 PRIMARY KEY (`lkm_id`) 11 ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
2.创建实体类
1 public class Linkman { 2 private Long lkmId;// 联系人编号(主键) 3 private String lkmName;// 姓名 4 private String lkmGender;// 性别 5 private String lkmPhone;// 办 公电话 6 private String lkmMobile;// 手机 7 private String lkmEmail;// 邮箱 8 private String lkmPosition;// 职位 9 private String lkmMemo;// 备注 10 // getter/setter 11 public Long getLkmId() { 12 return lkmId; 13 } 14 15 public void setLkmId(Long lkmId) { 16 this.lkmId = lkmId; 17 } 18 19 public String getLkmName() { 20 return lkmName; 21 } 22 23 public void setLkmName(String lkmName) { 24 this.lkmName = lkmName; 25 } 26 27 public String getLkmGender() { 28 return lkmGender; 29 } 30 31 public void setLkmGender(String lkmGender) { 32 this.lkmGender = lkmGender; 33 } 34 35 public String getLkmPhone() { 36 return lkmPhone; 37 } 38 39 public void setLkmPhone(String lkmPhone) { 40 this.lkmPhone = lkmPhone; 41 } 42 43 public String getLkmMobile() { 44 return lkmMobile; 45 } 46 47 public void setLkmMobile(String lkmMobile) { 48 this.lkmMobile = lkmMobile; 49 } 50 51 public String getLkmEmail() { 52 return lkmEmail; 53 } 54 55 public void setLkmEmail(String lkmEmail) { 56 this.lkmEmail = lkmEmail; 57 } 58 59 public String getLkmPosition() { 60 return lkmPosition; 61 } 62 63 public void setLkmPosition(String lkmPosition) { 64 this.lkmPosition = lkmPosition; 65 } 66 67 public String getLkmMemo() { 68 return lkmMemo; 69 } 70 71 public void setLkmMemo(String lkmMemo) { 72 this.lkmMemo = lkmMemo; 73 } 74 75 // toString 76 @Override 77 public String toString() { 78 return "Linkman [lkmId=" + lkmId + ", lkmName=" + lkmName + ", lkmGender=" + lkmGender + ", lkmPhone=" 79 + lkmPhone + ", lkmMobile=" + lkmMobile + ", lkmEmail=" + lkmEmail + ", lkmPosition=" + lkmPosition 80 + ", lkmMemo=" + lkmMemo + "]"; 81 } 82 83 } 84
3.编写映射关系文件:Linkman.hbm.xml--放在实体类所在包下
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 6 <hibernate-mapping> 7 <!-- 1.创建实体类与表的映射关系 --> 8 <class name="linkman.Linkman" table="cst_linkman"> 9 <!-- 2.创建属性与字段值的映射关系 --> 10 <!--2.1配置主键 --> 11 <id name="lkmId" column="lkm_id"> 12 <generator class="native"></generator> 13 </id> 14 <!--2.2其它属性与字段 --> 15 <property name="lkmName" column="lkm_name"></property> 16 <property name="lkmGender" column="lkm_gender"></property> 17 <property name="lkmPhone" column="lkm_phone"></property> 18 <property name="lkmMobile" column="lkm_mobile"></property> 19 <property name="lkmEmail" column="lkm_email"></property> 20 <property name="lkmPosition" column="lkm_position"></property> 21 <property name="lkmMemo" column="lkm_memo"></property> 22 </class> 23 </hibernate-mapping>
4.编写hibernate配置文件:hibernate.cfg.xml--放在src下
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!--数据库配置 --> 8 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 9 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 10 <property name="hibernate.connection.url">jdbc:mysql:///cst_linkman</property> 11 <property name="hibernate.connection.username">root</property> 12 <property name="hibernate.connection.password">root</property> 13 <!--hibernate基本配置 --> 14 <property name="hibernate.hbm2ddl.auto">update</property> 15 <property name="hibernate.show_sql">true</property> 16 <property name="hibernate.format_sql">true</property> 17 <!--指定映射文件位置 --> 18 <mapping resource="linkman/Linkman.hbm.xml"/> 19 </session-factory> 20 </hibernate-configuration>
5.编写工具类
1 import org.hibernate.Session; 2 import org.hibernate.SessionFactory; 3 import org.hibernate.cfg.Configuration; 4 5 public class HibernateUtils { 6 private static SessionFactory factory; 7 8 static { 9 // 加载配置文件 10 Configuration cfg = new Configuration(); 11 cfg.configure(); 12 // 构建sessionFactory 13 factory = cfg.buildSessionFactory(); 14 } 15 16 public static Session getSession() { 17 return factory.openSession(); 18 } 19 20 } 21
6.编写执行代码--增删改
1 package demo; 2 3 import org.hibernate.Session; 4 import org.hibernate.Transaction; 5 import org.junit.Test; 6 7 import linkman.Linkman; 8 import utils.HibernateUtils; 9 10 public class Demo02 { 11 // 增加 12 @Test 13 public void add() { 14 // 利用工具类获取session 15 Session session = HibernateUtils.getSession(); 16 // 开启事务 17 Transaction tx = session.beginTransaction(); 18 // crud/ 19 Linkman man = new Linkman(); 20 man.setLkmName("Jack"); 21 session.save(man); 22 // 提交事务 23 tx.commit(); 24 // 释放资源 25 session.close(); 26 27 } 28 29 // 修改id=2的名字为rose,id一定要正确,否则报空指针 30 @Test 31 public void modify() { 32 // 获取session 33 Session session = HibernateUtils.getSession(); 34 // 开启事务 35 Transaction tx = session.beginTransaction(); 36 // 修改 37 Linkman man = session.get(Linkman.class, 2L); 38 man.setLkmName("Rose"); 39 // 提交事务 40 tx.commit(); 41 // 释放资源 42 session.close(); 43 } 44 45 //删除 46 @Test 47 public void del() { 48 // 获取session 49 Session session = HibernateUtils.getSession(); 50 // 开启事务 51 Transaction tx = session.beginTransaction(); 52 // crud-del 53 Linkman man = session.get(Linkman.class, 2L); 54 session.delete(man); 55 // 提交事务 56 tx.commit(); 57 // 释放 58 session.close(); 59 } 60 } 61
以上是关于Hibernate笔记1的主要内容,如果未能解决你的问题,请参考以下文章