CRUD的操作
通俗的来讲:就是增(Create)删(Delete)改(Update)查(Read)
接上篇 https://blog.youkuaiyun.com/qq_44475743/article/details/88563254
因为在创建工厂的时候就会去创建数据库,这里是非常消耗资源的,我们可以把创建工厂的过程封装起来,只运行一次。
//因为只创建一次数据表,所以用static修饰,使用单例
private static SessionFactory SessionFactory;
private Session session;
static{
SessionFactory = new Configuration().configure().buildSessionFactory();
}
//Before 注解下的方法会在Test下的方法执行之前执行
@Before
public void getSession(){
System.out.println("==============before");
session = SessionFactory.openSession();
}
//After 注解下的方法会在Test下的方法执行之后执行
@After
public void closeSession(){
System.out.println("===============after");
//判断session是否为null
if (session!=null) {
//关闭session
session.close();
}
}
新增在上篇举例时写过了,这里就不在写了,下面是查找,修改,删除
查询
将重复的代码进行封装,代码量减少了不少
修改和删除,是先对数据库进行查询,查到次行数据在对其进行操作
//查询
@Test
public void queryUser(){
//查询id为1的用户
User user = session.get(User.class, 1);
//输出
System.out.println(user);
}
//修改
@Test
public void updateUser(){
//先查询,在修改
Transaction transaction = session.beginTransaction();
User user = session.get(User.class, 1);
user.setUpass("912837");
session.update(user);
transaction.commit();
System.out.println(user);
}
//删除
@Test
public void deleteUser(){
//先查询,在删除
Transaction transaction = session.beginTransaction();
User user = session.get(User.class, 3);//查
session.delete(user);
transaction.commit();
}
对象的状态
对象分为三种状态:
1)瞬时态/临时态
刚刚使用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的状态的Java对象被称为临时对象。
特点:对象没有id与session无关
2)持久态
已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。
特点:对象有id并与session有关
3)脱管态/游离态
已经被持久化,但不处于session的缓存中。处于游离状态的Java对象被称为游离对象。
特点:对象中有id但与session无关
这里用张图来进行说明
HQL语句
使用query对象查询,不需要写sql语句但是需要写hql语句(hibernate query language)与普通sql相似,区别在于sql操作的是数据表和字段,而hql操作的是实体类和属性(当然,也可以操作sql语句,后面会介绍)
依然对重复的代码进行封装
在数据库中的表为
private static SessionFactory SessionFactory;
private Session session;
static{
SessionFactory = new Configuration().configure().buildSessionFactory();
}
@Before
public void getSession(){
System.out.println("==============before");
session = SessionFactory.openSession();
}
@After
public void closeSession(){
System.out.println("===============after");
if (session!=null) {
//关闭session
session.close();
}
}
1)查询所有
//查询所有
@Test
public void Query1(){
//创建一个字符串,装HQL语句
String hql = "FROM User";
//查询
Query query = session.createQuery(hql);
//多条数据,装入list中去(list是User类型的)
List<User> users = query.list();
//foreach遍历
for (User user : users) {
//打印出查询的数据
System.out.println(user);
}
}
2)条件查询
//条件查询-------查询uname和upass都正确(例如:uname=张大胖,upass='222222')
@Test
public void Query2(){
String hql = "FROM User WHERE uname = ? AND upass = ?";
Query query = session.createQuery(hql);
//给占位符赋值
query.setParameter(0, "张大胖");
query.setParameter(1, "222222");
//装入list
List<User> users = query.list();
//遍历
for (User user : users) {
System.out.println(user);
}
}
3)模糊查询
@Test
public void Query3(){
String hql = "FROM User WHERE uname LIKE ?";
Query query = session.createQuery(hql);
query.setParameter(0, "%小%");
List<User> users = query.list();
for (User user : users) {
System.out.println(user);
}
}
4)分页查询
//分页查询
@Test
public void Query4(){
String hql = "FROM User";
Query query = session.createQuery(hql);
//设置其实位置,从0开始
query.setFirstResult(0);
//设置每页的数据量(不是数据库中的主键,是按顺序往下数3条)
query.setMaxResults(3);
List<User> users = query.list();
for (User user : users) {
System.out.println(user);
}
}
5)排序查询
//排序查询---------------根据uid进行倒序,这里的uid是对象,不是数据库中的uid
@Test
public void Query5(){
String hql = "FROM User ORDER BY uid DESC";
Query query = session.createQuery(hql);
List<User> users = query.list();
for (User user : users) {
System.out.println(user);
}
}
6)投影查询
//投影查询--------------只看uname和upass不显示uid(uid=null)
@Test
public void Query6(){
//投影查询,注意的是:实体类中必须要有对应的构造方法
String hql = "SELECT new User(uname , upass) FROM User";
Query query = session.createQuery(hql);
List<User> users = query.list();
for (User user : users) {
System.out.println(user);
}
}
自定义sql语句
使用session的createSQLQuery方法获取NativeQuery对象完成
//自定义sql语句
@Test
public void sqlQuery(){
//定义sql语句
String sql = "SELECT * FROM tb_user";
//使用方法查询,这里是createSQLQuery()
SQLQuery sqlQuery = session.createSQLQuery(sql);
//添加实体类
sqlQuery.addEntity(User.class);
//存入list集合中
List<User> users = sqlQuery.list();
//遍历
for (User user : users) {
System.out.println(user);
}