Hibernate(三)对数据库进行增删改查

重要的接口
1.SessionFactory接口 :针对单个数据库映射关系经过编译后的内存镜像。封装了我们在configuration里封装的连接信息信息,它在内存中就会生成一个内存映射,主要用来创建Session接口,此接口创建比较耗时,和一级缓存有关系,因此将其写在静态块中。
2.Session接口 :表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短,其隐藏了JDBC连接,也是Transaction的工厂。和二级缓存有关,含有操作数据库的增删改查方法,它的底层隐式封装了我们在JDBC中的Connection对象。
3.Transaction :应用程序用来指定原子操作单元范围的对象, 它通过抽象具体处理数据操作时的事务接口。主要用来做数据库的事务。
4.Query接口:提供的查询接口,并且查询的是类,而不是表,是执行的面相对象的查询语言(HQL)。
5.Configuraciton类:主要获得Hibernate提供的配置文件中配置连接数据的配置信息。

简单操作的实例

在之前对象关系映射的基础上

1.修改连接数据库的配置文件,在文件中添加下面两行代码,这两行代码可以在使得运行后在控制台显示标准的sql语句,便于我们了解真正的实现过程。

<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>

2.修改hibernate类的描述文件,将主键的生成方式改为uuid

<generator class="uuid" ></generator>

3.修改实体类,将id的类型改为String类型,创建无参和两个带参的构造函数,一个包含了所有的成员变量,在修改数据时使用,一个不包含id,在增加数据时使用。

import java.io.Serializable;
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String id;// javaBean的标识
    private String userName;
    private String passWord;
    private String createTime;
    private String endTime;
    public User(String id, String userName, String passWord, String createTime,String endTime) {
        super();
        this.id = id;
        this.userName = userName;
        this.passWord = passWord;
        this.createTime = createTime;
        this.endTime = endTime;
    }
    public User(String userName, String passWord, String createTime,
            String endTime) {
        super();
        this.userName = userName;
        this.passWord = passWord;
        this.createTime = createTime;
        this.endTime = endTime;
    }
    public User() {
        super();
        // TODO Auto-generated constructor stub
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
    public String getCreateTime() {
        return createTime;
    }
    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }
    public String getEndTime() {
        return endTime;
    }
    public void setEndTime(String endTime) {
        this.endTime = endTime;
    }
}

4.新建一个工具包并在其中新建一个工具类,用来获得SessionFactory和
session。

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUntil {
    private static SessionFactory sessionFactory=null;
    static{
        try {
            Configuration con=new Configuration().configure();
            //实例化sessionFactory
            sessionFactory=con.buildSessionFactory();
        } catch (Exception e) {
            e.printStackTrace();
        }   
    }
    //获得session
    public static Session getSession(){
        return sessionFactory.openSession();
    }
    //关闭session
    public static void closeSession(Session session){
        if(session!=null){
            session.close();
        }
    }
}

5.新建一个dao包并在其中创建UserDao类(主要写数据的操作方法),在操作方法中,增加删除修改相类似,返回值都是void,操作的步骤,得到session,开启事务,执行相应的sql,完成提交事务,出现错误回滚事务,最终关闭session,查询方法的返回值是list,它不需要开启事务,操作步骤得到session,获得Query,传入sql,值得注意的是Hibernate的查询是面向类的,所以此时传入的是类的全映射名,执行相应方法,关闭session。

package com.pre.dao;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import com.pre.entity.User;
import com.pre.until.HibernateUntil;
public class UserDao {
    public static void saveUser(User user){
        Session session=HibernateUntil.getSession();
        //获得操作数据库的事务,Hibernate的事务需要手动处理
        try {
            session.beginTransaction().begin();
            session.save(user);
            session.beginTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.beginTransaction().rollback();
        }finally{
            HibernateUntil.closeSession(session);
        }   
    }
    public static void delUser(User user){
        Session session=HibernateUntil.getSession();
        //获得操作数据库的事务,Hibernate的事务需要手动处理
        try {
            session.beginTransaction().begin();
            session.delete(user);
            session.beginTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.beginTransaction().rollback();
        }finally{
            HibernateUntil.closeSession(session);
        }   
    }
    public static void updateUser(User user){
        Session session=HibernateUntil.getSession();
        //获得操作数据库的事务,Hibernate的事务需要手动处理
        try {
            session.beginTransaction().begin();
            session.update(user);
            session.beginTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.beginTransaction().rollback();
        }finally{
            HibernateUntil.closeSession(session);
        }   
    }
    public static List<User> selectUser(){
        Session session=HibernateUntil.getSession();
        List<User> user=null;
        try {
            Query query=session.createQuery("from com.pre.entity.User");
            user=query.list();
        } catch (Exception e) {
            // TODO: handle exception
        }finally{
            HibernateUntil.closeSession(session);
        }
        return user;
    }
}

6.书写测试类,此时的测试类中主要包含的是返回值为void的几个测试类,和main方法,main方法中主要是创建一个测试类,以及调用其中的方法。

package com.pre.mapper;
import java.util.List;
import com.pre.dao.UserDao;
import com.pre.entity.User;
public class Test {
    public void testSave(){
        UserDao.saveUser(new User("娃娃1", "12345", "2017-07-31", "2019-09-09"));
    }
    public void testDel(){
        User user=new User();
        user.setId("402880fd5d9927bf015d9927c0290001");
        UserDao.delUser(user);
    }
    public void testUpdate(){
        UserDao.updateUser(new User("402880fd5d992c87015d992c88460001","张三", "5678", "2017-07-31", "2019-09-09"));
    }
    public void testSelect(){
        List<User> user=UserDao.selectUser();
        for (User us : user) {
            System.out.println(us.getId()+us.getUserName());
        }
    }
    public static void main(String[] args) {
        Test test=new Test();
        //test.testSave();
        //test.testDel();
        //test.testUpdate();
        test.testSelect();
    }
}

7.各个操作的注意点以及执行结果
增加:需要传入一个新创建的User类的实例,在执行的结果中可以看到id是一个32位的字符串,且每次生成的不同。

这里写图片描述

删除:此时需要用无参的构造函数创建一个新的User类的实例,并设置其id值,用来标识要删除那一条数据。

这里写图片描述

修改:此时需要创建一个新的User类的实例,其中的id是自己想要修改数据的id值,其它属性是修改后的值。

这里写图片描述

查询:需要创建一个list用来存放查找的结果,并遍历输出查询的结果。

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值