Hibernate的基础入门--笔记(一)
1、三层架构是什么?
web层 表现层
MVC是表现层的一个设计模型。
service层 业务层
dao层 持久层
明确:
Hibernate它是一个持久层(DAO层)框架
2、操作数据库的方式
JDBC:痛苦
1 //保存一个学生 2 Student s = new Student(); 3 String sql = "insert into student(name,gender)values(?,?)"; 4 Connection conn = getConnection(); 5 PreparedStatement pstm = conn.prepareStatement(sql); 6 pstm.setString(1,s.getName()); 7 pstm.setString(2,s.getGender()); 8 pstm.executeUpdate(); 9 //查询学生信息 10 String sql = "select * from student"; 11 Connection conn = getConnection(); 12 PreparedStatement pstm = conn.prepareStatement(sql); 13 ResultSet rs = pstm.executeQuery(); 14 List<Student> students = new ArrayList<Student>(); 15 while(rs.next()){ 16 Student s = new Student(); 17 int id = rs.getInt("id"); 18 s.setId(id); 19 s.setName(rs.getString("name")); 20 s.setGender(rs.getString("gender")); 21 students.add(s); 22 }
DBUtils:麻烦
1 //保存一个学生 2 Student s = new Student(); 3 QueryRunner qr = new QueryRunner(dataSource); 4 String sql = "insert into student(name,gender)values(?,?)"; 5 qr.update(sql,s.getName(),s.getGender()); 6 //查询学生 7 QueryRunner qr = new QueryRunner(dataSource); 8 String sql = "select * from student"; 9 List list = qr.query(sql,new BeanListHandler<Student>(Student.class)); 10 11 table: 12 create table student( 13 s_id int primary key auto_increment, 14 s_name varchar(200), 15 s_gender varchar(10) 16 ); 17 Class 18 public class Student implements Serializable{ 19 private int id; 20 private String name; 21 private String gender; 22 23 //getter and setter 24 }
3、你想怎么操作数据库?
想:
session.save(s);==========>存到数据库表里 解析XML文件,生成SQL语句,发送到数据库。数据库只认识SQL。
session.get(id);==========>从数据库表中查询
query.list();
4、建立表和实体类之间的对应关系
如何建立?
通过配置文件
你会的配置文件
xml
properties
选择XML
因为它可以描述层级关系
配置文件的内容:
实体类和表的对应关系
实体类中属性和表中字段的对应关系
5、ORM
Object Relational Mapping
对象 关系 映射
它就是通过配置文件建立起来实体和表之间的对应关系,从而可以操作实体就直接操作了数据库表
6、Hibernate
它是一个开源的,轻量级企业级ORM框架。
解决的是持久层的完整操作。
7、搭建hibernate的开发环境
使用的示例:
CRM:客户关系管理系统
Hibernate的开发包:
documentation
jar包
project
步骤:
a、导入必备的13个jar包
required:9个
log4j相关:3个
数据库驱动:1个
b、创建映射配置文件
在实体类所在的包下创建一个xml文件
命名规则:实体类名称.hbm.xml
示例:
/** * 客户的实体类 * */ public class Customer implements Serializable { private Long custId; private String custName; private String custSource; private String custIndustry; private String custLevel; private String custAddress; private String custPhone; public Long getCustId() { return custId; } public void setCustId(Long custId) { this.custId = custId; } public String getCustName() { return custName; } public void setCustName(String custName) { this.custName = custName; } public String getCustSource() { return custSource; } public void setCustSource(String custSource) { this.custSource = custSource; } public String getCustIndustry() { return custIndustry; } public void setCustIndustry(String custIndustry) { this.custIndustry = custIndustry; } public String getCustLevel() { return custLevel; } public void setCustLevel(String custLevel) { this.custLevel = custLevel; } public String getCustAddress() { return custAddress; } public void setCustAddress(String custAddress) { this.custAddress = custAddress; } public String getCustPhone() { return custPhone; } public void setCustPhone(String custPhone) { this.custPhone = custPhone; } @Override public String toString() { return "Customer [custId=" + custId + ", custName=" + custName + ", custSource=" + custSource + ", custIndustry=" + custIndustry + ", custLevel=" + custLevel + ", custAddress=" + custAddress + ", custPhone=" + custPhone + "]"; } }
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- 导入约束(dtd约束) 3 在hibernate的核心jar包中:hibernate-mapping-3.0.dtd中 4 明确: 5 此配置文件中只包含:实体类和表的对应关系,已经实体类中属性和表中字段的对应关系 6 --> 7 <!DOCTYPE hibernate-mapping PUBLIC 8 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 9 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 10 <hibernate-mapping package="com.XXX.domain"><!-- hibernate-mapping中的package属性:用于导入包。之后再出现类是此包中的都可以省略 --> 11 <!-- class标签: 12 作用:用于建立实体类和表的对应关系 13 属性: 14 name:实体类的名称。如果在根标签上没有导包,此处需要写全限定类名 15 table:指定数据库表的名称 16 --> 17 <class name="Customer" table="cst_customer"> 18 <!-- id标签: 19 作用:用于映射主键字段 20 属性: 21 name:指定的是实体类中属性的名称。找的是get/set方法后面的部分,首字母转小写。 22 column:指定的是数据库表的列名 23 --> 24 <id name="custId" column="cust_id"> 25 <!-- genrator标签: 26 作用:配置主键生成策略。 27 属性: 28 class:指定策略的取值 29 取值之一: 30 native:使用本地数据库自动增长的能力 31 --> 32 <generator class="native"></generator> 33 </id> 34 <!-- property标签: 35 作用:映射其他字段 36 属性: 37 name:用于指定实体类中属性的名称.找的也是get/set方法后面的部分,首字母转小写。 38 column:用于指定表中列的名称 39 --> 40 <property name="custName" column="cust_name"></property> 41 <property name="custIndustry" column="cust_industry"></property> 42 <property name="custSource" column="cust_source"></property> 43 <property name="custLevel" column="cust_level"></property> 44 <property name="custAddress" column="cust_address"></property> 45 <property name="custPhone" column="cust_phone"></property> 46 </class> 47 </hibernate-mapping>
c、编写主配置文件
在类的根路径下创建一个xml文件
命名规则:hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- 导入dtd约束: 约束位置:hibernate-configuration-3.0.dtd中 --> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <!-- 配置session工厂 SessionFactory:生产Session Session是干嘛的: 它就是hibernate中操作数据库的核心对象了。 创建Session工厂必备的3组信息 1、连接数据库的信息 2、hibernate相关的配置 3、指定映射文件所在位置 --> <session-factory> <!-- 1、连接数据库的信息 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">1234</property> <!-- 2、hibernate的基本配置 --> <!-- 数据库的方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 是否显示sql语句在控制台 --> <property name="hibernate.show_sql">true</property> <!-- 是否格式化sql语句 --> <property name="hibernate.format_sql">true</property> <!-- 生成DDL语句的策略 SQL结构化查询语言:一共有6个部分 DDL:数据定义语言 Date Definition Language DML:数据操作语言 Data Manipulation Language DQL:数据查询语言 Data Query Language DCL:数据控制语言 Data Control Language CCL:指针控制语言 Cursor Control Language TPL:事务处理语言 Transaction Processing Language 取值update的含义: 检查表结构和映射配置文件的变化,如果不一致,更新表结构 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 3、映射文件的位置 --> <mapping resource="com/XXX/domain/Customer.hbm.xml"/> </session-factory> </hibernate-configuration>
8、入门案例
需求:保存一个客户到数据库中
1 /** 2 * 入门案例: 3 * 保存客户 4 * @author zhy 5 * 6 */ 7 public class HibernateDemo1 { 8 9 /** 10 * 步骤分析: 11 * 1、加载主配置文件 12 * 2、根据主配置文件构建SessionFactory 13 * 3、使用工厂生产一个新的Session对象 14 * 4、开启事务 15 * 5、执行保存操作 16 * 6、提交事务 17 * 7、释放资源 18 */ 19 @Test 20 public void testAdd(){ 21 Customer c = new Customer(); 22 c.setCustName("中关村"); 23 c.setCustIndustry("xxx"); 24 c.setCustSource("网络"); 25 c.setCustLevel("VIP客户"); 26 c.setCustAddress("北京"); 27 c.setCustPhone("010-98234832"); 28 29 //1.加载主配置文件 30 Configuration cfg = new Configuration(); 31 cfg.configure(); 32 //2.根据主配置文件构建SessionFactory 33 SessionFactory factory = cfg.buildSessionFactory(); 34 //3.使用工厂生产一个新的Session 35 Session session = factory.openSession();//注意:openSession()永远都是一个新的 36 //4.使用session获取事务对象,开启事务 37 Transaction tx = session.beginTransaction(); 38 //5.执行保存操作 39 session.save(c);//=========>解析xml,生产sql语句,发送给数据库,执行保存。 40 //6.提交事务 41 tx.commit(); 42 //7.释放资源 43 session.close(); 44 factory.close(); 45 } 46 }
9、常用对象详解
1 /** 2 * Configuration: **使用 3 * 作用:就是用于加载主配置文件的。 4 * 常用方法: 5 * 默认构造函数:它只能加载类的根路径下,名称为hibernate.properties的配置文件。不能加载xml 6 * configure():它用于加载类的根路径下,名称为hibernate.cfg.xml的配置文件。 7 * buildSessionFactory():根据配置文件,构建SessionFactory 8 * addResource(String url);指定映射文件的位置 9 * addClass(Class clazz);指定实体类的字节码 10 * 11 * SessionFactory ****重要 12 * 作用:就是用于创建Session的 13 * 常用方法: 14 * openSession():每次都是生成一个新的Session 15 * 细节: 16 * 它维护了很多信息: 17 * 连接数据库的信息 18 * hibernate的基本配置 19 * 映射文件的位置,以及映射文件中的配置 20 * 一些预定义的SQL语句(这些语句都是通用的) 比如:全字段保存,根据id的全字段更新,根据id的全字段查询,根据id的删除等等。 21 * hibernate的二级缓存(了解) 22 * 特性: 23 * 它是一个线程安全的对象,所有由该工厂生产的Session都共享工厂中维护的数据。 24 * SessionFactory的使用原则: 25 * 由于它维护了很多信息,所以创建和销毁会消耗很多资源,所以不应该反复的创建和销毁。 26 * 原则就是:一个应用应该只有一个SessionFactory。在应用加载时创建,应用卸载时销毁。 27 * 28 * Session 非常重要 29 * 作用:就是用于跟数据库交互。包含了增删改查以及获取事务对象。 30 * 常用方法: 31 * save(Object entity); :保存一个实体到数据库 32 * update(Object entity);:更新一个实体 33 * delete(Object entity);:删除一个实体 34 * get(Class clazz,Serializable id);:根据id查询一个实体。参数的含义:Class表示要查询的实体类字节码。Serializable就是查询的条件。 35 * beginTransaction();:开启事务,并返回事务对象 36 * createQuery(String hql);:获取一个查询对象,用于查询所有。 37 * HQL:hibernate query language 38 * 含义:hibernate的查询语句。和SQL的区别:把数据表名称用实体类名称替换,把数据库表中的列用实体类中的属性替换,所写的SQL语句就是HQL。 39 * 细节: 40 * 由于SessionFactory已经维护了很多数据,所以Session就维护较少的内容。 41 * 它是一个轻量级对象。并且:它不是线程安全的!!!!!!! 42 * 它维护了hibernate的一级缓存(关于一级缓存的问题都是明天的内容)。 43 * 它的反复创建销毁不会消耗太多资源。 44 * 使用原则: 45 * 每个线程都只有一个Session对象。 46 * 47 * Transaction 了解 48 * 作用:就是用于控制事务的 49 * 常用方法: 50 * commit():提交事务 51 * rollback():回滚事务 52 */
10、抽取Hibernate工具类
HibernateUtil.java
明确:
hibernate把所有可以预见的异常都转成了运行时异常
1 /** 2 * hibernate的工具类 3 * 4 */ 5 public class HibernateUtil { 6 7 private static SessionFactory factory; 8 //使用静态代码块 9 //hibernate把所有可以预见的异常都转成了运行时异常 10 static{ 11 try { 12 //读取配置文件 13 Configuration cfg = new Configuration(); 14 cfg.configure(); 15 factory = cfg.buildSessionFactory(); 16 } catch (Exception e) { 17 throw new ExceptionInInitializerError("初始化Session工厂失败!"); 18 } 19 } 20 21 /** 22 * 获取一个新的Session 23 * @return 24 */ 25 public static Session openSession(){ 26 return factory.openSession(); 27 } 28 29 }
编码模板
1 /** 2 * 测试工具类 3 * @author zhy 4 * 5 */ 6 public class HibernateDemo3 { 7 8 /** 9 * 使用hibernate工具类 10 */ 11 @Test 12 public void testAdd(){ 13 Customer c = new Customer(); 14 c.setCustName("TBD"); 15 c.setCustIndustry("办公"); 16 c.setCustSource("网络"); 17 c.setCustLevel("VIP客户"); 18 c.setCustAddress("昌平区"); 19 c.setCustPhone("010-98234832"); 20 21 22 //1.使用工具类获取一个Session 23 Session session = HibernateUtil.openSession(); 24 //2.使用session获取事务对象,开启事务 25 Transaction tx = session.beginTransaction(); 26 //3.执行保存操作 27 session.save(c); 28 //4.提交事务 29 tx.commit(); 30 //5.释放资源 31 session.close(); 32 } 33 34 35 /** 36 * hibernate的编码模板 37 */ 38 @Test 39 public void testAdd2(){ 40 Customer c = new Customer(); 41 c.setCustName("TBD"); 42 c.setCustIndustry("办公"); 43 c.setCustSource("网络"); 44 c.setCustLevel("VIP客户"); 45 c.setCustAddress("昌平区"); 46 c.setCustPhone("010-98234832"); 47 48 Session session = null; 49 Transaction tx = null; 50 try{ 51 //1.使用工具类获取一个Session 52 session = HibernateUtil.openSession(); 53 //2.使用session获取事务对象,开启事务 54 tx = session.beginTransaction(); 55 //3.执行保存操作 56 session.save(c); 57 //4.提交事务 58 tx.commit(); 59 }catch(Exception e){ 60 //5.回滚事务 61 tx.rollback(); 62 e.printStackTrace(); 63 }finally{ 64 //6.释放资源 65 session.close(); 66 } 67 } 68 69 70 }
11、hibernate的CRUD操作
HibernateDemo4.java
1 /** 2 * Hibernate的CRUD操作 3 * 4 */ 5 public class HibernateDemo4 { 6 7 /** 8 * 保存 9 */ 10 @Test 11 public void testAdd(){ 12 Customer c = new Customer(); 13 c.setCustName("天安门"); 14 c.setCustIndustry("景点"); 15 c.setCustSource("网络"); 16 c.setCustLevel("VIP客户"); 17 c.setCustAddress("长安街"); 18 c.setCustPhone("010-98234832"); 19 20 21 //1.使用工具类获取一个Session 22 Session session = HibernateUtil.openSession(); 23 //2.使用session获取事务对象,开启事务 24 Transaction tx = session.beginTransaction(); 25 //3.执行保存操作 26 session.save(c); 27 //4.提交事务 28 tx.commit(); 29 //5.释放资源 30 session.close(); 31 } 32 33 /** 34 * 根据id查询一个实体 35 */ 36 @Test 37 public void testFindById(){ 38 //1.使用工具类获取一个Session 39 Session session = HibernateUtil.openSession(); 40 //2.使用session获取事务对象,开启事务 41 Transaction tx = session.beginTransaction(); 42 //3.执行根据id查询 43 Customer c = session.get(Customer.class, 1L); 44 System.out.println(c); 45 //4.提交事务 46 tx.commit(); 47 //5.释放资源 48 session.close(); 49 } 50 51 /** 52 * 更新 53 */ 54 @Test 55 public void testUpdate(){ 56 //1.使用工具类获取一个Session 57 Session session = HibernateUtil.openSession(); 58 //2.使用session获取事务对象,开启事务 59 Transaction tx = session.beginTransaction(); 60 //3.执行根据id查询 61 Customer c = session.get(Customer.class, 1L); 62 c.setCustName("Java"); 63 session.update(c); 64 //4.提交事务 65 tx.commit(); 66 //5.释放资源 67 session.close(); 68 } 69 70 /** 71 * 删除 72 */ 73 @Test 74 public void testDelete(){ 75 //1.使用工具类获取一个Session 76 Session session = HibernateUtil.openSession(); 77 //2.使用session获取事务对象,开启事务 78 Transaction tx = session.beginTransaction(); 79 //3.执行根据id查询 80 Customer c = session.get(Customer.class, 1L); 81 82 session.delete(c); 83 //4.提交事务 84 tx.commit(); 85 //5.释放资源 86 session.close(); 87 } 88 89 /** 90 * 查询所有 91 */ 92 @Test 93 public void testFindAll(){ 94 //1.使用工具类获取一个Session 95 Session session = HibernateUtil.openSession(); 96 //2.使用session获取事务对象,开启事务 97 Transaction tx = session.beginTransaction(); 98 //3.获取Query对象 99 Query query = session.createQuery("from Customer");//参数是一个HQL语句。hibernate query language 100 List list = query.list(); 101 for(Object o : list){ 102 System.out.println(o); 103 } 104 //4.提交事务 105 tx.commit(); 106 //5.释放资源 107 session.close(); 108 } 109 }
持久层总图:

导入DTD:


浙公网安备 33010602011771号