hibernate基本配置和操作
2019-11-18 本文已影响0人
夏天小哥哥
Configuraction介绍
Configuraction一般用于加载hibernate配置文件
SeesionFactory介绍
SessionFactory类是创建Session对象的工厂,构建SessionFactory很消耗资源,一般情况下一个应用中只需要初始化一个SessionFactory对象
操作步骤
-
创建数据库和表
create database hibernate; use hibernate; create table User( `u_id` bigint auto_increment comment '用户ID', `u_name` varchar comment '用户姓名', `u_age` int comment '用户年龄', constraint primary key(u_id) ) comment '用户表';
-
编写实体类JOPO
// 使用lombok @Data class User{ public long u_id; public String u_name; public Integer u_age; }
-
创建hibernate.cfg.xml配置文件,并编写连接数据库的配置
<?xml version="1.0" encoding="UTF=8"?> <!-- 指定Hibernate配置文件的DTD信息 --> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 连接数据库的基本配置 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <property name="hibernate.connection.url">jdbc:mysql//localhost/hibernate</property> <!-- 指定数据库方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> <!-- 显示Hibernate持久化操作所生成的SQL --> <property name="hibernate.show_sql">true</property> <!-- 将SQL脚本进行格式化后再输出 --> <property name="hibernate.format_sql">true</property> <!-- 配置阿里巴巴 Druid 连接池 --> <property name="hibernate.connection.provider_class"> com.alibaba.druid.support.hibernate.DruidConnectionProvider </property> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize">1</property> <property name="minIdle">1</property> <property name="maxActive">20</property> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait">60000</property> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis">60000</property> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis">300000</property> <!-- 加载所有的映射文件 --> <mapper resource="mapper/user.hbm.xml"/> </session-factory> </hibernate-configuration>
-
创建实体类和数据库表的hibernate的mapper(映射)配置文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.zhou.domain.User" table="user"> <id name="u_id" column="u_id"> <generator class="native"></generator> </id> <property name="u_name" column="u_name"></property> <property name="u_age" column="u_age"></property> </class> </hibernate-mapping>
-
编写测试类
// 使用Junit class HibernateTest{ @Test public void hibernateCreate(){ // 加载配置文件 Configuration config = new Configuration().configure(); // 创建SessionFactory工厂类 SessionFactory sessionFactory = config.buildSessionFactory(); // 通过SessionFactory工厂类创建Session对象 Session session = sessionFactory.openSession(); // 创建对象并插入数据库 User user = new User(); user.setUname("li"); session.save(user); // 释放资源 session.colse(); sessionFactory.colse(); } }
-
抽取Utils类
// 使用Junit class HibernateUtils{ public static final SessionFactory sessionFactory; static { // 加载配置文件 Configuration config = new Configuration().configure(); // 创建SessionFactory工厂类 sessionFactory = config.buildSessionFactory(); } /** * 获取Session对象 */ public static Session getSession(){ return sessionFactory.openSession(); } }
-
测试类的CRUD
// 使用Junit class HibernateTest{ /** * 插入操作 */ @Test public void hibernateCreate(){ // 获取Session对象 Session session = HibernateUtils.getSession(); // 创建对象并插入数据库 User user = new User(); user.setUname("li"); session.save(user); // 释放资源 session.colse(); // 建议是服务关闭的时候在关闭链接对象 HibernateUtils.SessionFactory.colse(); } /** * 查询操作 */ public void hibernateReadOne(){ // 获取Session对象 Session session = HibernateUtils.getSession(); // 查询主键对应的一条记录 session.get(User.class, 1L); // 释放资源 session.colse(); // 建议是服务关闭的时候在关闭链接对象 HibernateUtils.SessionFactory.colse(); } /** * 更新操作,需要开启事务 */ public void hibernateUpdate(){ // 获取Session对象 Session session = HibernateUtils.getSession(); // 开启事务 Transaction transaction = session.benginTransaction(); // 更新操作,但是这种通过主键更新,如果对象中没有设置值,那数据库更新的字段也会更新为null User user = new User(); user.setU_id(1L); user.setUname("li"); session.update(user); // 提交事务 transaction.commit(); // 释放资源 session.colse(); // 建议是服务关闭的时候在关闭链接对象 HibernateUtils.SessionFactory.colse(); } /** * 更新操作,更新操作,需要开启事务 */ public void hibernateUpdate(){ // 获取Session对象 Session session = HibernateUtils.getSession(); // 开启事务 Transaction transaction = session.benginTransaction(); // 更新操作,先查询在更新的操作不会把已有的值更新为null User user = session.get(User.class, 1L); user.setUname("哈"); session.update(user); // 提交事务 transaction.commit(); // 释放资源 session.colse(); // 建议是服务关闭的时候在关闭链接对象 HibernateUtils.SessionFactory.colse(); } /** * 删除 */ public void hibernateDelete(){ // 获取Session对象 Session session = HibernateUtils.getSession(); // 开启事务 Transaction transaction = session.benginTransaction(); // 删除 User user = new User(); user.setU_id(2L); // 提交事务 transaction.commit(); // 释放资源 session.colse(); // 建议是服务关闭的时候在关闭链接对象 HibernateUtils.SessionFactory.colse(); } }