hibernate简单实现连接数据库,并实现数据的操作

1:创建实体类

 1 package com.yinfu.entity;
 2 
 3 public class User {
 4 
 5     private int id;
 6     private String username;
 7     private String password;
 8     private String address;
 9     public int getId() {
10         return id;
11     }
12     public void setId(int id) {
13         this.id = id;
14     }
15     public String getUsername() {
16         return username;
17     }
18     public void setUsername(String username) {
19         this.username = username;
20     }
21     public String getPassword() {
22         return password;
23     }
24     public void setPassword(String password) {
25         this.password = password;
26     }
27     public String getAddress() {
28         return address;
29     }
30     public void setAddress(String address) {
31         this.address = address;
32     }
33     
34 }
User.Java

2:创建实体类与数据库表对应的配置文件:

 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 <!-- 
 7     配置类和表的对应
 8     class标签
 9     name属性:实体类全类名
10     table属性:数据库表名称,用hibernate不需要自己创建表,他可以根据配置文件自动生成数据库表
11  -->
12  <class name="com.yinfu.entity.User" table="t_user">
13      <!-- 
14          配置实体类ID与表中的ID进行对应
15          hibernate要求实体类属性有一个唯一值
16          hibernate要求表有作为唯一值得字段
17       -->
18       <!--id标签
19            name属性:实体类中的id名称
20            column属性:表字段中的id名称
21        -->
22        <id name="id" column="id">
23            <!-- 设置数据库表的增长策略
24                native:生成表id值就是主键自增长
25             -->
26            <generator class="native"></generator>
27        </id>
28        <!-- 配置其他属性和表的字段的对应
29                name属性:实体类中的属性名
30                column属性:表中的字段名
31         -->
32        <property name="username" column="username"></property>
33        <property name="password" column="password"></property>
34        <property name="address" column="address"></property>
35  </class>
36 </hibernate-mapping>
User.hbm.xml

3:hibernate核心配置文件(1.数据库信息,2.hibernate信息,3.实体类与数据库映射的配置文件注入信息)

此配置文件文件名和位置是固定的:文件名: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 <!-- 此配置文件的文件名和位置是固定的的
 7     文件名:hibernate.cfg.xml
 8     位置:要写在src文件中
 9  -->
10     <session-factory>
11         <!-- 第一部分:配置数据库信息 -->
12         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
13         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
14         <property name="hibernate.connection.username">root</property>
15         <property name="hibernate.connection.password">song12345</property>
16         
17         <!-- 第二部分:配置hibernate信息(可有可无) -->
18         <!-- 输出底层的SQL语句 -->
19         <property name="hibernate.show_sql">true</property>
20         <!-- 对底曾语句进行格式化 -->
21         <property name="hibernate.format_sql">true</property>
22         <!-- hibernate帮创建表,需要配置
23             update:如果有表就更新,没有表就创建
24          -->
25         <property name="hibernate.hbm2ddl.auto">update</property>
26         <!-- 配置数据库的方言 
27             识别不同数据库中的特有的语句和关键字
28             比如:分页查询
29                     MySQL关键字是limit
30                     oracle中的使用的是top-n分析中的rownum
31         -->
32         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
33         <!-- 指定线程管理方式,与本地线程进行绑定,实现单线程操作 -->
34         <property name="hibernate.current_session_context_class">thread</property>
35     
36         <!-- 第三部分:把映射文件放到核心配置文件中 -->
37         <mapping resource="com/yinfu/entity/User.hbm.xml"/>
38     
39     </session-factory>
40     
41 </hibernate-configuration>
hibernate.cfg.xml

4:用Junit进行简单测试:

 1 package com.yinfu.test;
 2 
 3 import static org.junit.Assert.*;
 4 
 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 import com.yinfu.entity.User;
12 import com.yinfu.utils.HibernateUtils;
13 
14 public class HibernateTest {
15 
16     @Test
17     public void test() {
18         //1.加载hibernate核心配置文件
19         //只会到src下去寻找hibernate的核心配置文件
20         Configuration cfg = new Configuration();
21         cfg.configure();
22         //2.创建sessionFactory对象
23         //读取hibernate核心配置文件内容,根据configuration对象创建sessionFactory对象
24         //在这过程中,根据映射关系,在相应数据库中把表创建
25         SessionFactory sessionFactory = cfg.buildSessionFactory();
26         //3.根据sessionFactory得到session对象
27         //类似于jdbc中的connection链接
28         Session session = sessionFactory.openSession();
29         //4.开启事务
30         Transaction tx = session.beginTransaction();
31         //5.逻辑代码实现crud操作
32         //session中有:增加:save方法   修改:update  删除:delete方法    根据ID查询:get方法
33         User user = new User();
34         user.setUsername("李四");
35         user.setPassword("12345");
36         user.setAddress("韩国");
37         session.save(user);
38         //6.提交事务
39         tx.commit();
40         //7.释放资源
41         session.close();
42         sessionFactory.close();
43         
44     }
45 }
test

4.1,将创建SessionFactory对象的代码提出来,放到static静态代码块中,当此类加载的时候只创建一个对象,并重复使用此对象,能够进行优化

首先创建Utils工具类:

 1 package com.yinfu.utils;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.cfg.Configuration;
 6 
 7 //工具类
 8 public class HibernateUtils {
 9 
10     private final static Configuration cfg;
11     private final static SessionFactory sessionFactory;
12     
13     //用静态代码块来实现对象只在类加载的时候创建一次(静态代码块只执行一次)
14     static{
15         //创建configuration对象,
16         cfg = new Configuration();
17         cfg.configure();
18         //根据Configuration对象创建sessionFactory对象
19         sessionFactory = cfg.buildSessionFactory();
20     }
21     
22     //返回与本地线程绑定的session
23     public static Session getSession(){
24         return sessionFactory.getCurrentSession();
25     }
26     
27     //创建一个方法用于返回sessionFactory对象
28     public static SessionFactory getSessionFactory(){
29         return sessionFactory;
30     }
31     
32     
33 }
HibernateUtils

然后创建测试类:

 1 package com.yinfu.test;
 2 
 3 import static org.junit.Assert.*;
 4 
 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 import com.yinfu.entity.User;
12 import com.yinfu.utils.HibernateUtils;
13 
14 public class HibernateTest {
15     @Test
16     public void testStatic() {
17         //利用工具类得到与本地线程绑定的session
18         Session session = HibernateUtils.getSession();
19         //4.开启事务
20         Transaction tx = session.beginTransaction();
21         //5.逻辑代码
22         //增加方法:
23         //此user为瞬时态数据(user中没有id,与session无关)
24         User user = new User();
25         user.setUsername("赵六");
26         user.setPassword("12345");
27         user.setAddress("玛雅文明");
28         session.save(user);
29         
30         //根据ID查询:
31         //第一个参数:实体类的类对象。第二个参数:id值
32         //此user为持久态数据(有id,与session有关)
33 //        User user = session.get(User.class, 1);
34 //        System.out.println(user);
35         
36         //修改方法:
37 //        User user = session.get(User.class, 1);
38 //        user.setUsername("张三");
39 //        session.update(user);
40         
41         //删除方法:
42         //第一种:
43 //        User user = session.get(User.class, 1);
44 //        session.delete(user);
45         //第二种:
46 //        User user = new User();
47 //        user.setId(2);
48 //        session.delete(user);
49         
50         //6.提交事务
51         tx.commit();
52         //7.释放资源
53         session.close();
54         
55     }
56 
57 }
test

由于在工具类中将session与当前线程进行了绑定,执行结果正确了,但是会有一个异常,这个异常是由于当session与本地线程进行绑定之后,session会随着线程的结束而自动关闭,不在需要手动进行session关闭,当还有session.close()方法的时候回报此异常。

 数据的三种状态:

1:瞬时态数据(没有ID,与session无关):

User user = new User();
user.setUsername("赵六");
user.setPassword("12345");
user.setAddress("玛雅文明");

2:脱管状态:(有id,与session无关)

User user = new User();

user.setId(1);

3:持久态数据:(有id,与session有关)

User user = session.get(User.class, 1);

原文地址:https://www.cnblogs.com/lubolin/p/7761551.html