Hibernate的四种查询方式(主键查询,HQL查询,Criteria查询,本地sql查询)和修改和添加

Hibernate的添加,修改,查询(三种查询方式)的方法:

案例演示:

1:第一步,导包,老生常谈了都是,省略;

2:第二步,创建数据库和数据表,表结构如下所示:

3:第三步创建实体类User.java

 1 package com.bie.po;
 2 /** 
 3 * @author BieHongLi 
 4 * @version 创建时间:2017年3月8日 下午5:17:23 
 5 * 
 6 */
 7 public class User {
 8 
 9     private int id;
10     private String name;
11     private String password;
12     private String email;
13     private String phone;
14     public int getId() {
15         return id;
16     }
17     public void setId(int id) {
18         this.id = id;
19     }
20     public String getName() {
21         return name;
22     }
23     public void setName(String name) {
24         this.name = name;
25     }
26     public String getEmail() {
27         return email;
28     }
29     public void setEmail(String email) {
30         this.email = email;
31     }
32     public String getPhone() {
33         return phone;
34     }
35     public void setPhone(String phone) {
36         this.phone = phone;
37     }
38     public String getPassword() {
39         return password;
40     }
41     public void setPassword(String password) {
42         this.password = password;
43     }
44     @Override
45     public String toString() {
46         return "User [id=" + id + ", name=" + name + ", password=" + password + ", email=" + email + ", phone=" + phone
47                 + "]";
48     }
49     
50     
51 }

4:第四步,完成实体类的属性和数据表字段的映射,映射的.xml如下所示,前面的博客已经介绍如何写这个映射,这里略过;

 1 <?xml version="1.0"?>
 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 package="com.bie.po"> 
 7     <!-- 操作条件:
 8         1:对象与表
 9         2:属性与字段的对应
10         3:类型的对应,类型默认采用属性的类型,type不写的话
11      -->
12     <class name="User" table="user">
13         <!-- 主键,映射 -->
14         <id name="id" column="id">
15             <generator class="native"></generator>
16         </id>
17         
18         <!-- 非主键,映射 -->
19         <property name="name" column="name"></property>
20         <property name="password" column="password"></property>
21         <property name="email" column="email"></property>
22         <property name="phone" column="phone"></property>
23         
24         
25     </class>
26 
27 </hibernate-mapping>

5:映射之后写Hibernate的配置文件,配置文件如下所示:

 1 <!DOCTYPE hibernate-configuration PUBLIC
 2     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 3     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 4 
 5 <hibernate-configuration>
 6     <session-factory>
 7         <!-- 
 8             1:数据连接配置
 9             2:加载所有的映射(*.hbm.xml)
10          -->
11          
12          <!-- 1:数据连接配置 -->
13          <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
14          <property name="hibernate.connection.url">jdbc:mysql:///test</property>
15          <property name="hibernate.connection.username">root</property>
16          <property name="hibernate.connection.password">123456</property>
17          <!-- mysql数据库的方言 -->
18          <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
19          
20          <property name="hibernate.show_sql">true</property>
21          
22          <!-- 2:加载所有的映射(*.hbm.xml) -->
23          <mapping resource="com/bie/po/User.hbm.xml"/>
24          
25     </session-factory>
26 </hibernate-configuration>

6:完成上面的之后写测试的类即可;

  6.1:首先实现Hibernate的插入操作《session.save(user)》:

      核心代码:

           //获取加载配置文件的管理类对象                   Configuration config=new Configuration();                   //默认加载src/hibernate.cfg.xml文件                   config.configure();                  //创建session的工厂文件                  SessionFactory sf=config.buildSessionFactory();                 //创建session(代表一个会话,与数据库连接的会话)                 Session session=sf.openSession();                 //开启事务                 Transaction tx=session.beginTransaction();                 //保存到数据库                 session.save(user);                 //提交事务                 tx.commit();                 //关闭                 session.close();                 //sessionFactory关闭                sf.close();

源码如下所示:

 1 package com.bie.test;
 2 
 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 
 9 import com.bie.po.User;
10 
11 /** 
12 * @author BieHongLi 
13 * @version 创建时间:2017年3月8日 下午5:28:35 
14 * 
15 */
16 public class HelloTest {
17 
18     @Test
19     public void testHello(){
20         //对象
21         User user=new User();
22         user.setName("张三");
23         user.setPassword("123456");
24         user.setEmail("1748741329@qq.com");
25         user.setPhone("15236083005");
26         
27         //获取加载配置文件的管理类对象
28         Configuration config=new Configuration();
29         //默认加载src/hibernate.cfg.xml文件
30         config.configure();
31         //创建session的工厂文件
32         SessionFactory sf=config.buildSessionFactory();
33         //创建session(代表一个会话,与数据库连接的会话)
34         Session session=sf.openSession();
35         //开启事务
36         Transaction tx=session.beginTransaction();
37         //保存到数据库
38         session.save(user);
39         //提交事务
40         tx.commit();
41         //关闭
42         session.close();
43         //sessionFactory关闭
44         sf.close();
45     
46         
47     }
48 }

演示效果如下所示:

6.2:实现Hibernate的修改操作,核心代码《session.saveOrUpdate(user);   session.update(user);这个就不演示了,用法一样,将他们替换一下即可,只是saveOrUpdate更加强大的说》:

       session.saveOrUpdate(user);

      这个实现的是如果没有实体类的编号就执行保存操作,如果有实体类的编号就执行修改操作;

        设计Hibernate框架的人太TMD有才了,当然这是夸赞,大大简化了我们对数据库的操作,必须赞一个;

源码如下所示:

 1 package com.bie.test;
 2 
 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 
 9 import com.bie.po.User;
10 
11 /** 
12 * @author BieHongLi 
13 * @version 创建时间:2017年3月8日 下午5:28:35 
14 * 
15 */
16 public class HelloTest2 {
17 
18     //SessionFactory代表整个配置文件,所以没必要加载多次,放到全局即可
19     private static SessionFactory sf;
20     static{
21         //1:创建配置管理类对象
22         Configuration config=new Configuration();
23         //加载配置文件,(默认加载/src/hibernate.cfg.xml)
24         config.configure();
25         
26         //2:根据加载的配置管理类对象,创建SessionFactory对象
27         sf=config.buildSessionFactory();
28         
29         //简介写法,写到一行里面
30         //sf=new Configuration().configure().buildSessionFactory();
31     }
32     @Test
33     public void testHello(){
34         //对象
35         User user=new User();
36         user.setId(1);
37         user.setName("李四22222");
38         user.setPassword("222222");
39         user.setEmail("22222222@qq.com");
40         user.setPhone("15236083005");
41         
42         //3:根据sesson的工厂创建session对象
43         Session session = sf.openSession();
44         
45         //开启事务
46         Transaction tx = session.beginTransaction();
47         //执行操作
48         //session.save(user);
49         session.saveOrUpdate(user);
50         
51         //提交事务
52         tx.commit();
53         //关闭事务
54         session.close();
55         sf.close();
56     }
57     
58 }

演示结果如下所示:

6.3:实现Hibernate的查询操作:

    6.3.1:主键查询的方法

      两种方法:

       User u=(User)session.get(User.class, 1);                User u=(User)session.load(User.class, 1);支持懒加载

源码如下所示:

 1 package com.bie.test;
 2 
 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 
 9 import com.bie.po.User;
10 
11 /** 
12 * @author BieHongLi 
13 * @version 创建时间:2017年3月9日 下午8:47:46 
14 * Hibernate查询的几种方式:
15 *     
16 */
17 public class SelectTest {
18 
19     //全局静态session工厂
20     private static SessionFactory sf;
21     static{
22         //1:创建sesson工厂
23         sf=new Configuration().configure().buildSessionFactory();
24     }
25     
26     @Test
27     public void select(){
28         User user=new User();
29         
30         //2:根据session工厂创建session
31         Session session=sf.openSession();
32         //3:开启事务
33         Transaction tx=session.beginTransaction();
34         //4:主键查询,执行查询操作,方法一:get方法,方法2:load方法
35         //User u=(User)session.get(User.class, 1);
36         User u=(User)session.load(User.class, 1);
37         
38         //主键查询测试结果
39         System.out.println(u);
40         //5:提交事务
41         tx.commit();
42         //6:关闭事务和session
43         session.close();
44         sf.close();
45         
46     }
47     
48 }

演示效果如下所示:

6.3.2:HQL查询,特别注意的是查询语句必须是实体类的方法名,不能是表名称,必须和sql语句查询区别:

    HQL查询和sql查询的区别:

      (1):sql查询是表以及字段,不区分大小写,也叫做结构化的查询语句;

      (2):HQL查询是Hibernate提供的面向对象的查询语句,查询的是对象以及对象的属性,区分大小写的。

源码如下所示:

 1 package com.bie.test;
 2 
 3 
 4 
 5 import java.util.List;
 6 
 7 import org.hibernate.Query;
 8 import org.hibernate.Session;
 9 import org.hibernate.SessionFactory;
10 import org.hibernate.Transaction;
11 import org.hibernate.cfg.Configuration;
12 import org.junit.Test;
13 
14 import com.bie.po.User;
15 
16 /** 
17 * @author BieHongLi 
18 * @version 创建时间:2017年3月9日 下午8:47:46 
19 * Hibernate查询的几种方式:
20 *     
21 */
22 public class SelectTest2 {
23 
24     //全局静态session工厂
25     private static SessionFactory sf;
26     static{
27         //1:创建sesson工厂
28         sf=new Configuration().configure().buildSessionFactory();
29     }
30     
31     @Test
32     public void select(){
33         User user=new User();
34         
35         //2:根据session工厂创建session
36         Session session=sf.openSession();
37         //3:开启事务
38         Transaction tx=session.beginTransaction();
39         
40         //HRL查询,查询全部信息,注意HRL查询的是实体类的名称,不是数据表的名称,特别注意这一点
41         //Query q=session.createQuery("from User");
42         Query q=session.createQuery("from User user where user.id=1 or user.id=2 ");
43         
44         List<User> list=q.list();
45         System.out.println(list);
46         
47         //5:提交事务
48         tx.commit();
49         //6:关闭事务和session
50         session.close();
51         sf.close();
52         
53     }
54     
55 }

效果如下所示:

6.3.3:完全面向对象的查询,Criteria查询也叫做 QBC查询   query by criteria

       核心代码:   

      //Criteria查询也叫做 QBC查询   query by criteria            //完全的面向对象的查询              Criteria criteria = session.createCriteria(User.class);                  //添加条件              criteria.add(Restrictions.eq("id", 1));              //查询全部,没有sql语句              List<User> list = criteria.list();              System.out.println(list);

源码如下所示:

 1 package com.bie.test;
 2 
 3 
 4 
 5 import java.util.List;
 6 
 7 import org.hibernate.Criteria;
 8 import org.hibernate.Session;
 9 import org.hibernate.SessionFactory;
10 import org.hibernate.Transaction;
11 import org.hibernate.cfg.Configuration;
12 import org.hibernate.criterion.Restrictions;
13 import org.junit.Test;
14 
15 import com.bie.po.User;
16 
17 /** 
18 * @author BieHongLi 
19 * @version 创建时间:2017年3月9日 下午8:47:46 
20 * Hibernate查询的几种方式:
21 *     
22 */
23 public class SelectTest3 {
24 
25     //全局静态session工厂
26     private static SessionFactory sf;
27     static{
28         //1:创建sesson工厂
29         sf=new Configuration().configure().buildSessionFactory();
30     }
31     
32     @Test
33     public void select(){
34         User user=new User();
35         
36         //2:根据session工厂创建session
37         Session session=sf.openSession();
38         //3:开启事务
39         Transaction tx=session.beginTransaction();
40         
41         //Criteria查询也叫做 QBC查询   query by criteria 
42         //完全的面向对象的查询
43         Criteria criteria = session.createCriteria(User.class);    
44         //添加条件
45         criteria.add(Restrictions.eq("id", 1));
46         
47         //查询全部,没有sql语句
48         List<User> list = criteria.list();
49     
50         
51         System.out.println(list);
52         
53         //5:提交事务
54         tx.commit();
55         //6:关闭事务和session
56         session.close();
57         sf.close();
58         
59     }
60     
61 }

演示效果如下所示:

 6.3.4:本地查询sql语句,适合使用复杂的查询,或者不想使用HQL或者criteria查询,可以使用本地sql查询,缺点,不能跨越数据库,一般不适用,除非遇到复杂的sql语句才使用:

    核心代码:

      //sql语句              //SQLQuery sql= session.createSQLQuery("select * from user ");             SQLQuery sql=session.createSQLQuery("select * from user where id=1 ");             sql.addEntity(User.class);             List<User> list=sql.list();             System.out.println(list);源码如下所示:

 1 package com.bie.test;
 2 
 3 
 4 
 5 import java.util.List;
 6 
 7 import org.hibernate.SQLQuery;
 8 import org.hibernate.Session;
 9 import org.hibernate.SessionFactory;
10 import org.hibernate.Transaction;
11 import org.hibernate.cfg.Configuration;
12 import org.junit.Test;
13 
14 import com.bie.po.User;
15 
16 /** 
17 * @author BieHongLi 
18 * @version 创建时间:2017年3月9日 下午8:47:46 
19 * Hibernate查询的几种方式:
20 *     
21 */
22 public class SelectTest4 {
23 
24     //全局静态session工厂
25     private static SessionFactory sf;
26     static{
27         //1:创建sesson工厂
28         sf=new Configuration().configure().buildSessionFactory();
29     }
30     
31     @Test
32     public void select(){
33         User user=new User();
34         
35         //2:根据session工厂创建session
36         Session session=sf.openSession();
37         //3:开启事务
38         Transaction tx=session.beginTransaction();
39         
40         //sql语句
41         //把每一行记录封装为对象数组,再添加到list集合中
42         //SQLQuery sql= session.createSQLQuery("select * from user ");
43         //把每一行记录封装为指定的对象类型
44         SQLQuery sql=session.createSQLQuery("select * from user where id=1 ").addEntity(User.class);
45         List<User> list=sql.list();
46         System.out.println(list);
47         
48         //5:提交事务
49         tx.commit();
50         //6:关闭事务和session
51         session.close();
52         sf.close();
53         
54     }
55     
56 }

演示如下所示:

为了美好明天,加油!!!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构师历程

JDBC简介

简单地说,就是用于执行SQL语句的一类Java API,通过JDBC使得我们可以直接使用Java编程来对关系数据库进行操作。通过封装,可以使开发人员使用纯Jav...

582
来自专栏cloudskyme

dtree和jquery构建树型结构

对于小型的树型应用来说,dtree是一个不错的选择。 先看一眼dtree给的例子 ? 构造静态树 首先引入css文件和js文件 <link rel...

2973
来自专栏xingoo, 一个梦想做发明家的程序员

【Hibernate那点事儿】—— Hibernate应该了解的知识

前言: 最近由于有点时间,就像深入的学习一下Hibernate.之前只是简单的使用,并没领会它的妙处。这里就趁着分享的机会,好好整理一下。   这篇主要...

19510
来自专栏小白鼠

Mybatis

从xml配置文件中读取配置,然后通过SqlSessionFactoryBuilder构建SqlSessionFactory实例(建造者模式)。SqlSessio...

1263
来自专栏Urahara Blog

Apache Struts2 Remote Code Execution (S2-045)

2173
来自专栏Java成神之路

Java企业微信开发_08_素材管理之下载微信临时素材到本地服务器

请求地址:https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&med...

662
来自专栏Android源码框架分析

获取Android设备DeviceId与反Xposed Hook技术

APP开发中常需要获取设备的DeviceId,以应对刷单,目前常用的几个设备识别码主要有IMEI(国际移动设备身份码 International Mobile ...

1342
来自专栏xingoo, 一个梦想做发明家的程序员

【Hibernate那点事儿】—— Hibernate应该了解的知识

前言: 最近由于有点时间,就像深入的学习一下Hibernate.之前只是简单的使用,并没领会它的妙处。这里就趁着分享的机会,好好整理一下。   这篇主要...

1816
来自专栏Sorrower的专栏

用MediaPlayer做个带进度条可后台的音乐播放器

724
来自专栏zhisheng

看透 Spring MVC 源代码分析与实践 —— 俯视 Spring MVC

Spring MVC 之初体验 环境搭建 在 IDEA 中新建一个 web 项目,用 Maven 管理项目的话,在 pom.xml 中加入 Spring MVC...

3636

扫码关注云+社区