Hibernate基本CRUD

1 hibernate 框架介绍

冬眠:开发的代码基本不变。

1.1回顾jdbc

Java提供的标准的数据访问的API

作用:完成应用程序java程序中的数据和db中的数据进行交换。

工作过程:

A 加载驱动

B建立连接

C定义sql,发生sql语句

D执行sql语句获得执行结果

E处理返回结果

F关闭资源

1.2 ORM对象关系映射

将大象保存数据库?

JAVA:

1 定义大象类

2定义类的属性

3创建对象

DB:

1 创建表

2定义表中的字段

3 插入记录(一行)

将大象保存到java程序?                                                                                     

ORM:

面向对象的java语言和关系型数据库之间的对应关系

类----表

类属性----表中的字段

对象----数据库的记录

1.3hibernate实现机制

 

Src:hibernate.cfg.xml

描述数据的操作环境

 Hibernate通过对jdbc的封装,以orm对象关系映射为基础,让程序员以完全面向对象的思想,实现对数据库的crud操作。在使用hibernate进行数据库的操作的时候,程序员不需要考虑sql语句的开发 

2 Hello Hhibernate

2.1 新建java项目

导入jar包

2.2 建立hibernate的主配置文件

在src目录下,建立hibernate.cfg.xml

 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="connection.driver_class">com.mysql.jdbc.Driver</property>
 9         <!-- jdbc:mysql://localhost:3306/1106 -->
10         <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
11         <property name="connection.username">root</property>
12         <property name="connection.password">1111</property>
13         <!-- 配置hibernate操作的数据库对应的方言 hjibernate在操作数据库的过程中,需要将普通话,翻译为特定数据对应的方言sql语句,hibernate开发的应用程序 
14             可以在不同的数据库上进行移植。 -->
15         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
16         <!-- 配置数据相关的其他属性 -->
17         <!-- hibenrate生产的sql语句是否在控制台进行打印 -->
18         <property name="show_sql">true</property>
19         <!-- 是否将产生的sql语句进行格式化 -->
20         <property name="format_sql">true</property>
21         <!-- 配置hibenrate的正向工程: hibernate的反向工程:由数据库中的表,产生java程序中的类 hibenrate的正向工程:由java中的类,产生数据库中对应的表 
22             upate:如果数据库中存在某个java类对应的表,检查java类中的属性是否和数据库中的表字段一致,如果不一致进行更新 如果数据库中不存在表,会自动创建表。 -->
23         <property name="hbm2ddl">update</property>
24         <!-- 通过主配置文件,加载pojo的映射文件 -->
25         <mapping resource="org/guangsoft/pojo/Pet.hbm.xml" />
26     </session-factory>
27 </hibernate-configuration> 

2.3建立java类(实体类)

建立pojo类

 1 package org.guangsoft.pojo;
 2 /***
 3  * 
 4  * 定义宠物的pojo类:简单的java类
 5  * 
 6  * ***/
 7 public class Pet
 8 {
 9     private Integer pid;
10     private String pname;
11     private String ptype;
12     private String color;
13     public Integer getPid()
14     {
15         return pid;
16     }
17     public void setPid(Integer pid)
18     {
19         this.pid = pid;
20     }
21     public String getPname()
22     {
23         return pname;
24     }
25     public void setPname(String pname)
26     {
27         this.pname = pname;
28     }
29     public String getPtype()
30     {
31         return ptype;
32     }
33     public void setPtype(String ptype)
34     {
35         this.ptype = ptype;
36     }
37     public String getColor()
38     {
39         return color;
40     }
41     public void setColor(String color)
42     {
43         this.color = color;
44     }
45 }

2.4 建立pojo的映射文件

必须和pojo类放入同一个包中。

 

 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 <!-- 描述java中的类和数据库的表映射关系 package:指定pojo所在的包 -->
 6 <hibernate-mapping package="org.guangsoft.pojo">
 7     <!-- 描述类和表的关系 -->
 8     <class name="Pet" table="t_pet">
 9         <!-- 描述java对象的标识和数据库中的主键的对应关系 name:属性名 column:数据库的列表 type:属性的数据类型 -->
10         <id name="pid" column="pid" type="java.lang.Integer">
11             <!-- native:pid这一列在数据库中管理方式: 如:mysql 会自动使pid自增 oracle:会为该列产生一个序列 -->
12             <generator class="native"></generator>
13         </id>
14         <!-- 其他属性:简单属性 name:属性名 column:数据库的列表 type:属性的数据类型 -->
15         <property name="pname" column="pname" type="java.lang.String"></property>
16         <property name="ptype" column="ptype" type="java.lang.String"></property>
17         <property name="color" column="color" type="java.lang.String"></property>
18     </class>
19 </hibernate-mapping>

2.5使用Hibernate的API

建立测试类,访问数据库

 1 package org.guangsoft.test;
 2 import java.io.Serializable;
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.Transaction;
 6 import org.hibernate.cfg.Configuration;
 7 import org.junit.Test;
 8 import org.guangsoft.pojo.Pet;
 9 public class TestHibernate {
10     /***
11      * 添加一个宠物信息,为模板代码
12      * 单元测试:
13      * @Test
14      * 在定义单元测试方法的时候,方法不能有参数和返回值
15      * ***/
16     @Test
17     public void addPet()
18     {
19         //1 创建Configuration对象,用来加载hibernate的配置文件
20         Configuration  cfg = new Configuration();
21         //2加载配置文件
22         cfg.configure("hibernate.cfg.xml");
23         //3通过cfg构造一个会话工厂对象
24         SessionFactory sf=cfg.buildSessionFactory();
25         //4获得数据库的会话对象,和数据库的连接
26         Session session = sf.openSession();
27         //5开始事务
28         Transaction tr=session.beginTransaction();
29         //6进行数据库的curd操作
30         Pet pet = new Pet();
31         pet.setPname("奥巴马");
32         pet.setColor("黑色");
33         pet.setPtype("白头鹰");
34               //返回值为当前增加的记录的主键值                                     
35         Serializable ser=session.save(pet);
36         System.out.println("ser="+ser);
37         //7提交事务
38         tr.commit();
39         //8释放资源
40         session.close();
41     }
42

3 hibernate的基本操作(curd)

3.1 准备工作

建立项目,加入jar

建立hibernate.cfg.xml

建立pojo类和对应的映射文件

3.2 定义Dao接口

 1 package org.guangsoft.dao;
 2 import java.util.List;
 3 import org.guangsoft.pojo.Student;
 4 /***
 5  * 
 6  * 学生表的crud操作定义
 7  * 
 8  * ***/
 9 public interface StudentDao
10 {
11     // 添加学生信息
12     public void saveStudent(Student stu);
13     // 删除学生信息
14     public void deleteStudent(Student stu);
15     // 修改学生信息
16     public void updateStudent(Student stu);
17     // 单条查询
18     public Student selStudentBySno(Integer sno);
19     // 查询所有学生信息
20     public List<Student> selStudentAll();
21 }

3.3建立接口的实现类

  1 package org.guangsoft.dao.impl;
  2 import java.util.List;
  3 import org.hibernate.Session;
  4 import org.hibernate.SessionFactory;
  5 import org.hibernate.Transaction;
  6 import org.hibernate.cfg.Configuration;
  7 import org.guangsogt.dao.StudentDao;
  8 import org.guangsoft.pojo.Student;
  9 public class StudentDaoImpl implements StudentDao
 10 {
 11     /**
 12      * 
 13      * 通过静态代码块加载配置文件
 14      * 
 15      * ****/
 16     static SessionFactory sf = null;
 17     static
 18     {
 19         // 1 创建Configuration对象,用来加载hibernate的配置文件
 20         Configuration cfg = new Configuration();
 21         // 2加载配置文件
 22         cfg.configure("hibernate.cfg.xml");
 23         // 3通过cfg构造一个会话工厂对象
 24         sf = cfg.buildSessionFactory();
 25     }
 26     @Override
 27     public void saveStudent(Student stu)
 28     {
 29         // TODO Auto-generated method stub
 30         // 获得数据库的会话对象
 31         Session session = sf.openSession();
 32         // 打开事务操作
 33         Transaction tr = session.beginTransaction();
 34         // 添加数据
 35         session.save(stu);
 36         // 提交事务
 37         tr.commit();
 38         // 关闭资源
 39         session.close();
 40     }
 41     @Override
 42     public void deleteStudent(Student stu)
 43     {
 44         // TODO Auto-generated method stub
 45         // 1
 46         Session session = sf.openSession();
 47         // 2
 48         Transaction tr = session.beginTransaction();
 49         // 3
 50         session.delete(stu);
 51         // 4
 52         tr.commit();
 53         // 5
 54         session.close();
 55     }
 56     @Override
 57     public void updateStudent(Student stu)
 58     {
 59         // TODO Auto-generated method stub
 60         // 1
 61         Session session = sf.openSession();
 62         // 2
 63         Transaction tr = session.beginTransaction();
 64         // 3
 65         session.update(stu);
 66         /***
 67          * 
 68          * 如果传入的对象的唯一标识是null,那对数据库进行保存操作
 69          * 
 70          * 如果传入的对象的唯一标识不是null,会进行更新操作,如果不存在
 71          * 
 72          * **/
 73         // session.saveOrUpdate(stu);
 74         // 4
 75         tr.commit();
 76         // 5
 77         session.close();
 78     }
 79     /**
 80      * 
 81      * 单条查询
 82      * 
 83      * ***/
 84     @Override
 85     public Student selStudentBySno(Integer sno)
 86     {
 87         // TODO Auto-generated method stub
 88         // 1 session
 89         Session session = sf.openSession();
 90         // 2 查询操作事务是可以不需要的
 91         // 3查询操作:参数1:需要查询的类对应的clas文件 参数2:查询条件(唯一标识)
 92         Object obj = session.get(Student.class, sno);
 93         return (Student) obj;
 94     }
 95     /*** 多条查询 ***/
 96     @Override
 97     public List<Student> selStudentAll()
 98     {
 99         // TODO Auto-generated method stub
100         // 1 session
101         Session session = sf.openSession();
102         // 2(通过hibernate提供的查询语句进行查询)
103         String hql = "from Student";
104         // 3执行hql语句
105         return session.createQuery(hql).list();
106     }
107 }

3.4 建立测试类

测试基本的crud操作

 

 1 package org.guangsoft.test;
 2 import java.util.List;
 3 import org.junit.Before;
 4 import org.junit.Test;
 5 import org.guangsoft.dao.StudentDao;
 6 import org.guangsoft.dao.impl.StudentDaoImpl;
 7 import org.guangsoft.pojo.Student;
 8 public class TestCrud
 9 {
10     // 声明Dao变量
11     StudentDao dao;
12     /***
13      * 
14      * init方法在所有加@Test注解的方法执行之前,会自动执行。
15      * 
16      * ***/
17     @Before
18     public void init()
19     {
20         dao = new StudentDaoImpl();
21     }
22     /**
23      * 
24      * 测试增加学生的功能
25      * 
26      * ***/
27     @Test
28     public void testSaveStudent()
29     {
30         Student stu = new Student();
31         stu.setSname("王岐山");
32         stu.setAddress("中南海");
33         stu.setBirthday("1956-10-10");
34         dao.saveStudent(stu);
35     }
36     /***
37      * 
38      * 
39      * 
40      * 测试更新功能
41      * 
42      * ***/
43     @Test
44     public void testUpdateStudent()
45     {
46         Student stu = new Student();
47         // 如果给定的id在数据库没有对应的记录,抛出异常
48         stu.setSno(14);
49         stu.setSname("特朗普");
50         stu.setAddress("白宫");
51         stu.setBirthday("1990-10-10");
52         dao.updateStudent(stu);
53     }
54     /***
55      * 
56      * 进行单条查询
57      * 
58      * ***/
59     @Test
60     public void testSelectStudentBySno()
61     {
62         Student s = dao.selStudentBySno(4);
63         System.out.println("-----" + s.getSno() + "	" + s.getSname() + "	"
64                 + s.getAddress() + "	" + s.getBirthday());
65     }
66     /***
67      * 
68      * 测试多条查询
69      * 
70      * ***/
71     @Test
72     public void testSelectStudentAll()
73     {
74         List<Student> list = dao.selStudentAll();
75         for (Student s : list)
76         {
77             System.out.println("-----" + s.getSno() + "	" + s.getSname()
78                     + "	" + s.getAddress() + "	" + s.getBirthday());
79         }
80     }
81     /***
82      * 
83      * 测试删除
84      * 
85      * **/
86     @Test
87     public void testDeleteStudent()
88     {
89         // 创建了对象,自己封装了id属性的值
90         /*
91          * Student stu = new Student();
92          * 
93          * stu.setSno(4);
94          */
95         // 删除之前,先进行查询操作
96         Student stu = dao.selStudentBySno(3);
97         dao.deleteStudent(stu);
98     }
99

4 crud操作总结

总结API:对象

Configuration :加载hibernate的配置文件。

SessionFactory:会话工厂,在实际的程序也只存在一个对象。

Session:用来操作数据库的会话对象,产生事务对象

Transaction:事务控制对象

      Session方法

           BeginTransaction()  开始事务

           Save()

           saveOrUpdate()

           delete()

           update()

           get()/load();

           Query q = createQuery()

           q.list()

           //session.createSQLQuery(arg0)

Query:执行数据库的查询操作,负责执行HQL语句

原文地址:https://www.cnblogs.com/guanghe/p/6093078.html