JAVA框架:hibernate
一:介绍
hibernate是java中的dao层,即和持久层打交道。底层也是数据库驱动、连接等。他也有orm,类和数据库的映射。
二、部署
下载地址:https://sourceforge.net/projects/hibernate/?source=typ_redirect
1)包介绍:
2:)创建数据库
1 create table customer (id BIGINT NOT NULL AUTO_INCREMENT primary key,name varchar(25),ipone_number varchar(40) );
3)创建hibernate配置文件
1)javabean文件
1 package jd.com.hibernatepro; 2 3 public class Customer { 4 public Customer(){}; 5 private Long id; 6 private String name; 7 private String ipone_number; 8 9 public void setId(Long id) { 10 this.id = id; 11 } 12 13 public void setIpone_number(String ipone_number) { 14 this.ipone_number = ipone_number; 15 } 16 17 public void setName(String name) { 18 this.name = name; 19 } 20 21 public Long getId() { 22 return id; 23 } 24 25 public String getIpone_number() { 26 return ipone_number; 27 } 28 29 public String getName() { 30 return name; 31 } 32 }
2)创建映射文件(Customer.hbm.xml)
名字没有强制要求,但是一般会起类名.hbm(hibernate mapping).xml
配置文件内容:
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 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 <!--配置类和表结构映射--> 7 <class name="jd.com.hibernatepro.Customer" table="customer"> 8 <!--配置id name是javabean属性column是表的属性 属性纸一样的话可以省略column --> 9 <id name="id" column="id"> 10 <!--主键生成策略 native主键采取的本地策略 递增策略--> 11 <!--注意语法 xml 不是<generator></generator--> 12 <generator class="native"/> 13 </id> 14 <!--配置其他属性--> 15 <property name="name"/> 16 <property name="ipone_number"/> 17 </class> 18 19 </hibernate-mapping>
其中约束:
从WEB-INF/lib/hibernate-core-5.0.7.Final.jar 中的拷贝
其中
1是hibernate的核心配置文件的约束查找文件。
2是映射配置文件的约束查找文件。
我们这边选择3.0的
3)创建核心配置文件: 文件名称必须是hibernate.cfg
约束拷贝如上。
内容:
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 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 <!--记住先配置session-factory标签一个数据库对应一个session-factory标签--> 6 <hibernate-configuration> 7 <session-factory> 8 <!--必须要配置的参数是5个 4个是连接数据库串 1个是数据库方言--> 9 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 10 <property name="hibernate.connection.url">jdbc:mysql://192.168.147.145:3306/day13</property> 11 <property name="hibernate.connection.username">admin</property> 12 <!--方言 告诉hibernate使用是 那个数据库类型--> 13 <property name="hibernate.connection.password">123</property> 14 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 15 <mapping resource="jd/com/hibernatepro/Customer.hbm.xml"/> 16 </session-factory> 17 </hibernate-configuration>
需要注意:
引用配置配置文件:<mapping resource="jd/com/hibernatepro/Customer.hbm.xml"/> 在windows的时候是转义符\需要改成斜杠/。
还有核心配置文件的位置需要在src下面。
hibernate配置完了。
4)测试代码:
使用hibernate的步骤:
1 * 使用hibernate的步骤: 2 * 1)先加载配置文件。 3 *2)创建sessionFactory对象,生成session对象(工厂方法主要是生成对象)。 4 * 3)创建session对象(数据库会话对象) 5 * 4)开启事务。 6 * 5)编写保存代码。 7 * 6)提交事务。 8 * 7)释放资源。
代码:
1 package jd.com.test; 2 3 4 import jd.com.hibernatepro.Customer; 5 import org.hibernate.Session; 6 import org.hibernate.SessionFactory; 7 import org.hibernate.Transaction; 8 import org.hibernate.cfg.Configuration; 9 import org.junit.Test; 10 11 12 public class TT { 13 @Test 14 public void test(){ 15 /** 16 * 使用hibernate的步骤: 17 * 1)先加载配置文件。 18 *2)创建sessionFactory对象,生成session对象(工厂方法主要是生成对象)。 19 * 3)创建session对象(数据库会话对象) 20 * 4)开启事务。 21 * 5)编写保存代码。 22 * 6)提交事务。 23 * 7)释放资源。 24 */ 25 //先加载配置文件。 26 Configuration configuration=new Configuration(); 27 //加载配置文件 28 configuration.configure(); 29 //创建sessionFactory对象 30 SessionFactory sessionFactory=configuration.buildSessionFactory(); 31 //创建session对象 32 Session session=sessionFactory.openSession(); 33 34 //开启事务。 35 Transaction transaction=session.beginTransaction(); 36 37 //编写保存代码 38 Customer customer=new Customer(); 39 customer.setIpone_number("110"); 40 customer.setName("tom"); 41 //数据保存 42 session.save(customer); 43 //提交事务。 44 transaction.commit(); 45 46 //释放资源 47 session.close(); 48 49 } 50 51 }
查看数据库:
1 mysql> select * from customer; 2 +----+------+--------------+ 3 | id | name | ipone_number | 4 +----+------+--------------+ 5 | 1 | tom | 110 | 6 +----+------+--------------+ 7 1 row in set (0.00 sec)
测试完成。
核心配置文件可选配置:
sql语句控制台和日志输出(SQL in log and console)。
1 <!--可选配置--> 2 <!--输出sql语句--> 3 <property name="hibernate.show_sql">true</property> 4 <!--sql语句格式化--> 5 <property name="hibernate.format_sql">true</property>
创建表和添加值以及添加字段。
hibernate.hbm2ddl.auto update 如果表不存在他创建,如果存在插入值。可以添加额外字段。
添加额外字段需要在映射文件和javabean里添加相应的配置。
1 <!--update--> 2 <property name="hibernate.hbm2ddl.auto">update</property>
这个比较常用。
不要用
hibernate.hbm2ddl.auto create-drop 无论存不存在都建 在删。
hibernate.hbm2ddl.auto create 每次都创建 存在先drop在创建。会把之前数据和表删除。。
三、方法介绍
sessionFactory 和session。
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
所以在项目中sessionfactory不需要释放。一个数据库一个sessionfactory。
基于上面写一个工具类:
1 package jd.com.test; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.cfg.Configuration; 6 7 public class hibernateUtils { 8 private final static Configuration CONFIURATION; 9 private final static SessionFactory SESSIONFACTORY; 10 static { 11 CONFIURATION=new Configuration().configure(); 12 SESSIONFACTORY=CONFIURATION.buildSessionFactory(); 13 } 14 public static Session getSession(){ 15 return SESSIONFACTORY.openSession(); 16 } 17 }
session:注意的是Session对象是非线程安全的。所有每次操作就创建一个session 使用完就释放!
session的方法:
* save(obj) 保存数据。
* delete(obj) 删除数据。
* get(Class,id) 获取数据。
* update(obj) 更新数据。
* saveOrUpdate(obj) -- 保存或者修改(如果没有数据,保存数据。如果有,修改数据)
* createQuery() -- HQL语句的查询的方式
我们在操作数据的时候,要遵循先查询在删除、更新等操作。
1 @Test 2 public void Select(){ 3 Session session=hibernateUtils.getSession(); 4 Transaction transaction=session.beginTransaction(); 5 Customer customer=new Customer(); 6 //第一个参数是javabean的class对象,第二个参数是表中的id序列号。get方法只能返回一个查询结果。 7 Customer c=session.get(Customer.class,2L); 8 System.out.println(c); 9 //提交事务。 10 transaction.commit(); 11 12 //释放资源 13 session.close(); 14 } 15 16 @Test 17 public void Del(){ 18 Session session=hibernateUtils.getSession(); 19 Transaction transaction=session.beginTransaction(); 20 Customer customer=new Customer(); 21 //第一个参数是javabean的class对象,第二个参数是表中的id序列号。get方法只能返回一个查询结果。 22 Customer c=session.get(Customer.class,3L); 23 session.delete(c); 24 //提交事务。 25 transaction.commit(); 26 27 //释放资源 28 session.close(); 29 } 30 @Test 31 public void Update(){ 32 Session session=hibernateUtils.getSession(); 33 Transaction transaction=session.beginTransaction(); 34 Customer customer=new Customer(); 35 //第一个参数是javabean的class对象,第二个参数是表中的id序列号。get方法只能返回一个查询结果。 36 Customer c=session.get(Customer.class,1L); 37 c.setName("ok"); 38 session.update(c); 39 //提交事务。 40 transaction.commit(); 41 42 //释放资源 43 session.close(); 44 } 45 @Test 46 public void SavUp(){ 47 Session session=hibernateUtils.getSession(); 48 Transaction transaction=session.beginTransaction(); 49 Customer customer=new Customer(); 50 //第一个参数是javabean的class对象,第二个参数是表中的id序列号。get方法只能返回一个查询结果。 51 Customer c=new Customer(); 52 c.setIpone_number("120"); 53 c.setName("oop"); 54 session.saveOrUpdate(c); 55 //提交事务。 56 transaction.commit(); 57 //释放资源 58 session.close(); 59 } 60 @Test 61 public void QuerY(){ 62 Session session=hibernateUtils.getSession(); 63 Transaction transaction=session.beginTransaction(); 64 Query query=session.createQuery("from Customer"); 65 List customers=query.list();//查询所有数据 66 for (Object c:customers 67 ) { 68 System.out.println(c); 69 } 70 //提交事务。 71 transaction.commit(); 72 //释放资源 73 session.close(); 74 } 75 }