Hibernate环境的搭建


 

  1. 导入Hibernate所需的jar包

1)导入lib\required目录下的jar包

 

2)导入lib\jpa-metamodel-generator下的jar包

 

3)因为hibernate没有日志包,所以需要导入第三方的日志包及jar包

 

  1. 编写实体类User

User.java

	package com.tao.entity;
	
	public class User {
	
	        /*hibernate要求实体类有一个属性唯一的*/
	//	private int uid;
	        
	        private String uid;
	        private String username;
	        private String password;
	        private String address;
	//	public int getUid() {
	//		return uid;
	//	}
	//	public void setUid(int uid) {
	//		this.uid = uid;
	//	}
	        
	        public String getUsername() {
	                return username;
	        }
	        public String getUid() {
	                return uid;
	        }
     }
	}


  1. 配置实体类和数据库表--对应关系(映射关系)
    1. 在User.java包下创建User.hbm.xml文件
    2. 添加xml文件的dtd的约束

文件在project\hibernate-core\src\main\resources\org\hibernate目录下寻找

文件名为hibernate-mapping-3.0.dtd

  1. 配置映射关系

User.hbm.xml

		<?xml version="1.0" encoding="UTF-8"?>
		<!DOCTYPE hibernate-mapping PUBLIC 
		    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
		    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
		<hibernate-mapping>
		        <!-- 1 配置类和表对应 
		                class标签
		                name属性:实体类全路径
		                table属性:数据库表名称
		        -->
		        <class name="cn.itcast.entity.User" table="t_user">
		                <!-- 2 配置实体类id和表id对应 
		                        hibernate要求实体类有一个属性唯一值
		                        hibernate要求表有字段作为唯一值
		                -->
		                <!-- id标签
		                        name属性:实体类里面id属性名称
		                        column属性:生成的表字段名称
		                 -->
		                <id name="uid" column="uid">
		                        <!-- 设置数据库表id增长策略 
		                                native:生成表id值就是主键自动增长
		                        -->
		                        <generator class="uuid"></generator>
		                </id>
		                <!-- 配置其他属性和表字段对应 
		                        name属性:实体类属性名称
		                        column属性:生成表字段名称
		                -->
		                <property name="username" column="username"></property>
		                <property name="password" column="password"></property>
		                <property name="address" column="address"></property>
		        </class>
		</hibernate-mapping>



  1. 创建Hibernate的核心配置文件
    1. 核心配置的文件位置和名字为固定的

位置:src的根目录

名称:hibernate.cfg.xml

  1. 引入dtd约束

约束文件位置:project\hibernate-core\src\main\resources\org\hibernate

约束文件名称:hibernate-configuration-3.0.dtd

  1. 添加配置信息
    1. 配置数据库(必须)
    2. 配置hibernate信息(可选)
    3. 把映射文件放到核心配置文件中(必须)
  2. 数据可配置信息

数据库的配置信息可以在相关配置文件

路径:project\etc

名称:hibernate.properties


		<?xml version="1.0" encoding="UTF-8"?>
		<!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.url">jdbc:mysql:///hibernate_day01</property>
		                <property name="hibernate.connection.username">root</property>
		                <property name="hibernate.connection.password">root</property>
		                
		                <!-- 第二部分: 配置hibernate信息  可选的-->
		                <!-- 输出底层sql语句 -->
		                <property name="hibernate.show_sql">true</property>
		                <!-- 输出底层sql语句格式 -->
		                <property name="hibernate.format_sql">true</property>
		                <!-- hibernate帮创建表,需要配置之后 
		                        update: 如果已经有表,更新,如果没有,创建
		                -->
		                <property name="hibernate.hbm2ddl.auto">update</property>
		                <!-- 配置数据库方言
		                        在mysql里面实现分页 关键字 limit,只能使用mysql里面
		                        在oracle数据库,实现分页rownum
		                        让hibernate框架识别不同数据库的自己特有的语句
		                 -->
		                <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		                
		                <!-- 第三部分: 把映射文件放到核心配置文件中 必须的-->
		                <mapping resource="cn/itcast/entity/User.hbm.xml"/>
		        </session-factory>
		</hibernate-configuration>
		


  1. 实现添加操作
    1. 加载hibernate核心配置文件
    2. 创建SessionFactory对象
    3. 使用SessionFactory创建Session对象
    4. 开启事物
    5. 写具体逻辑crud操作
    6. 提交事物
    7. 关闭资源

	package com.tao.hibernatetest;
	
	import org.hibernate.Session;
	import org.hibernate.SessionFactory;
	import org.hibernate.Transaction;
	import org.hibernate.cfg.Configuration;
	import org.junit.Test;
	
	import cn.itcast.entity.User;
	import cn.itcast.utils.HibernateUtils;
	
	public class HibernateDemo {
	
	        @Test
	        public void testAdd() {
	                //第一步 加载hibernate核心配置文件
	                // 到src下面找到名称是hibernate.cfg.xml
	                //在hibernate里面封装对象
	                Configuration cfg = new Configuration();
	                cfg.configure();
	                
	//		第二步 创建SessionFactory对象
	        //读取hibernate核心配置文件内容,创建sessionFactory
	        //在过程中,根据映射关系,在配置数据库里面把表创建
	        SessionFactory sessionFactory = cfg.buildSessionFactory();
	        
	//		SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
	        
	        //第三步 使用SessionFactory创建session对象
	        // 类似于连接
	        Session session = sessionFactory.openSession();
	        
	        //第四步 开启事务
	        Transaction tx = session.beginTransaction();
	
	        //第五步 写具体逻辑 crud操作
	        //添加功能
	        User user = new User();
	        user.setUsername("小马");
	        user.setPassword("1314520");
	        user.setAddress("美国");
	        //调用session的方法实现添加
	        session.save(user);
	        
	        //第六步 提交事务
	        tx.commit();
	
	        //第七步 关闭资源
	        session.close();
	        sessionFactory.close();
	        }
	}


  1. 对事务操作的改进1

因为SessionFactory在程序中只有一个,所以它是单例模式,我们应该创建衣一个工具类,使其得到单例模式,创建一个Util包,创建一个HibernateUtils.java文件

HibernateUtils.java

	package cn.itcast.utils;
	
	import org.hibernate.SessionFactory;
	import org.hibernate.cfg.Configuration;
	
	public class HibernateUtils {
	
	        static Configuration cfg = null;
	        static SessionFactory sessionFactory = null;
	        //静态代码块实现
	        static {
	                //加载核心配置文件
	                cfg = new Configuration();
	                cfg.configure();
	                sessionFactory = cfg.buildSessionFactory();
	        }
	        
	        //提供方法返回sessionFactory
	        public static SessionFactory getSessionFactory() {
	                return sessionFactory;
	        }
	        
	        public static void main(String[] args) {
	                
	        }
	}


  1. 对事物操作的改进2

因为我们对数据库操作经常要用到回滚或者异常处理,而这种代码结构不严谨所以应该用到以下的代码结构

try{

开启事务

提交事务

}catch(){

回滚事务

}finally{

关闭

}

修改代码如下

	package com.tao.hibernatetest;
	
	import org.hibernate.Session;
	import org.hibernate.SessionFactory;
	import org.hibernate.Transaction;
	import org.junit.Test;
	
	import cn.itcast.entity.User;
	import cn.itcast.utils.HibernateUtils;
	
	public class HibernateSelect {
	        
	        //事务规范代码
	        @Test
	        public void testTx() {
	                Session session = null;
	                Transaction tx = null;
	                try {
	                        //与本地线程绑定的session
	                        session = HibernateUtils.getSessionobject();
	                        //开启事务
	                        tx = session.beginTransaction();
	                        
	                        //添加
	                        User user = new User();
	                        user.setUsername("小马1");
	                        user.setPassword("250");
	                        user.setAddress("美国");
	                        
	                        session.save(user);
	                        
	//			int i = 10/0;
	        //提交事务
	        tx.commit();
	        }catch(Exception e) {
	                e.printStackTrace();
	                //回滚事务
	                tx.rollback();
	        }finally {
	                //关闭操作
	//			session.close();
	//			sessionFactory.close();
	        }
	        }
	}


猜你喜欢

转载自blog.csdn.net/booleaning/article/details/75804581