这篇文章主要是关于 hql 的一些 联系 (基本的增删查改)
关系映射XML的简单配置
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="entity">
<class name="Users" table="user" lazy="true">
<comment>Users may bid for or sell auction items.</comment>
<!-- 设置 主键 -->
<id name="userId">
<!-- 主键的增长策略 -->
<generator class="native"/>
</id>
<!-- 设置 类和字段之间的映射关系,可以通过colum设置数据库的字段名 -->
<property name="userName"/>
<property name="password"
not-null="true"
length="15"
column="`password`"/>
</class>
</hibernate-mapping>
测试hibernate 使用hql的 基本操作(增删查改)
package test;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;
import entity.Users;
public class CURDTest {
/**
* 该类是 测试 hibernate的CURD(增删改查) 主要测试hql语句的查询
*/
@Test
/**
* 测试单表 的查询 所有信息 (无参数,无条件查询)
*/
public void query() {
//1.得到配置文件
Configuration cfg = new Configuration().configure();
//2.创建session工厂,用来连接数据库
SessionFactory sessionFactory = cfg.buildSessionFactory();
//3.打开连接
Session session = sessionFactory.openSession();
// 4.开启事务
try {
session.beginTransaction();
//5.创建hql
String hql = "from Users";
//6.创建查询
Query query = session.createQuery(hql);
//7.接收结果集
List<Users> ulist = query.list();
for (Users users : ulist) {
System.out.println(users.getUserId() + users.getUserName());
System.out.println(users);
}
//8.提交事务 --->查询 时可以不适用提交事务
session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 异常时 回滚事务-->保证事务的 一致性 和原子性
session.getTransaction().rollback();
} finally {
//关闭连接,释放资源
session.close();
}
}
/**
* 测试单条件 查询 不要忘记 添加@Test 这里使用的是 Junit4
*/
@Test
public void query2() {
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
// 开启事务
try {
session.beginTransaction();
//hql操作的都是 类 和 对象 ,而不是数据库的表名 和字段名
/**
* 设置参数的方式有两种:
* 一种是 直接用 '?'
* 二 是 使用':'+参数名
*/
//第一种绑定参数的方法,使用问号 进行 参数的拼接
/*String hql = "from Users where userId=?";
Query query = session.createQuery(hql);
// 参数是从 0 开始 ---->而JDBC查询时 从1 开始
query.setParameter(0, 1);*/
//第二种:使用 ":"+参数名的方式
String hql = "from Users where userId=:userId";
Query query = session.createQuery(hql);
query.setParameter("userId", 1);
List<Users> ulist = query.list();
for (Users users : ulist) {
System.out.println(users);
}
// 提交事务
session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 异常时 回滚事务
session.getTransaction().rollback();
} finally {
session.close();
}
}
/**
* 多参数条件的查询:
*/
@Test
public void query3() {
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
// 开启事务
try {
session.beginTransaction();
String hql = "from Users where password=? and userName = ?";
Query query = session.createQuery(hql);
query.setParameter(0, "234");
query.setParameter(1, "李四");
List<Users>ulist = query.list();
for (Users users : ulist) {
System.out.println(users);
}
// 提交事务
session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 异常时 回滚事务
session.getTransaction().rollback();
} finally {
session.close();
}
}
@Test
/**
* 查询 两列数据以上 使用 object数组进行接收并 遍历
*/
public void query4() {
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
// 开启事务
try {
session.beginTransaction();
String hql = "select password,userName from Users";
Query query = session.createQuery(hql);
List<Object[]>ulist = query.list();
for (Object[] objects : ulist) {
System.out.println(objects[0]+","+ objects[1]);
}
// 提交事务
session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 异常时 回滚事务
session.getTransaction().rollback();
} finally {
session.close();
}
}
/**
* hql实现 添加 功能 通过 User的 构造函数 直接进行添加操作
* 需要 6步骤 ,构造完需要 调用 save方法 并提交事务
*/
@Test
public void addUser() {
//1.拿到配置文件
Configuration cfg = new Configuration().configure();
//2.从配置文件构建一个session工厂 (不同于购物的session)
SessionFactory sessionFactory = cfg.buildSessionFactory();
//3.
Session session = sessionFactory.openSession();
try {
// 4.开启事务
session.beginTransaction();
Users user = new Users("小刘11","123");
//5.调用save方法
session.save(user);
// 6.提交事务
session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 异常时 回滚事务
session.getTransaction().rollback();
} finally {
//7.关闭资源
session.close();
}
}
/**
* hql实现 删除 功能 直接调用 delete方法
* 更新 和删除 都是 直接通过 get Class 通过主键id 操作整条数据
*
*/
@Test
public void delUser() {
//1.拿到配置文件
Configuration cfg = new Configuration().configure();
//2.从配置文件构建一个session工厂 (不同于购物的session)
SessionFactory sessionFactory = cfg.buildSessionFactory();
//3.
Session session = sessionFactory.openSession();
try {
// 4.开启事务
session.beginTransaction();
Users user = (Users) session.get(Users.class, 4);
//5.调用save方法
session.delete(user);
// 6.提交事务
session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 异常时 回滚事务
session.getTransaction().rollback();
} finally {
//7.关闭资源
session.close();
}
}
/**
* 修改功能:通过 主键id 直接 获取getClass 查询 原有数据
* 并 在原有数据上进行修改,使用自定义类中的set方法进行数据的修改
* 选择要修改的信息 ,直接构造 进去 方法
*/
@Test
public void updateUser() {
//1.拿到配置文件
Configuration cfg = new Configuration().configure();
//2.从配置文件构建一个session工厂 (不同于购物的session)
SessionFactory sessionFactory = cfg.buildSessionFactory();
//3.
Session session = sessionFactory.openSession();
try {
// 4.开启事务
session.beginTransaction();
Users user = (Users) session.get(Users.class, 3);
//5.通过设置 对象的属性
user.setUserName("abc");
session.update(user);
// 6.提交事务
session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 异常时 回滚事务
session.getTransaction().rollback();
} finally {
//7.关闭资源
session.close();
}
}
/**
* 测试聚合函数:
* mysql中有五大聚合函数:count,min,max,avg,sum
*/
@Test
public void functionUser() {
//1.拿到配置文件
Configuration cfg = new Configuration().configure();
//2.从配置文件构建一个session工厂 (不同于购物的session)
SessionFactory sessionFactory = cfg.buildSessionFactory();
//3.
Session session = sessionFactory.openSession();
try {
// 4.开启事务
session.beginTransaction();
//聚合函数的 使用 方式 都是 一样的 ,直接可以替换
String hql = "select count(userId) from Users";
Query query = session.createQuery(hql);
List list = query.list();
// 6.提交事务
System.out.println(list);
session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 异常时 回滚事务
session.getTransaction().rollback();
} finally {
//7.关闭资源
session.close();
}
}
/**
* 测试 分页 查询 :直接调用 setFirstResult 和setMaxResult 两个方法
*/
@Test
public void pageUser() {
//1.拿到配置文件
Configuration cfg = new Configuration().configure();
//2.从配置文件构建一个session工厂 (不同于购物的session)
SessionFactory sessionFactory = cfg.buildSessionFactory();
//3.
Session session = sessionFactory.openSession();
try {
// 4.开启事务
session.beginTransaction();
//聚合函数的 使用 方式 都是 一样的 ,直接可以替换
String hql = "from Users";
Query query = session.createQuery(hql);
query.setFirstResult(2); //相当于 (currentPage-1)*pageSize 0--> 第一页 2-->第二页
query.setMaxResults(2);//pageSize 每页最大数
List list = query.list();
// 6.提交事务
System.out.println(list);
session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 异常时 回滚事务
session.getTransaction().rollback();
} finally {
//7.关闭资源
session.close();
}
}
/**
* 测试 懒加载 load 和 get 的区别(重点)
* load为加载,不进行查询(懒加载) ,只有在 使用数据的时候才进行查询
* get是立即加载,只要执行到get就直接查询到数据
*/
@SuppressWarnings("unchecked")
@Test
public void lazyUser() {
//1.拿到配置文件
Configuration cfg = new Configuration().configure();
//2.从配置文件构建一个session工厂 (不同于购物的session)
SessionFactory sessionFactory = cfg.buildSessionFactory();
//3.
Session session = sessionFactory.openSession();
try {
// 4.开启事务
session.beginTransaction();
//聚合函数的 使用 方式 都是 一样的 ,直接可以替换
Users user =(Users) session.load(Users.class, 1);
System.out.println("到这里还没有执行sql");
// 6.提交事务
System.out.println(user);
session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 异常时 回滚事务
session.getTransaction().rollback();
} finally {
//7.关闭资源
session.close();
}
}
}