hibernate

1、引入jar包

hibernate-release-4.3.10.Final\lib\required下面所有的jar包,以及数据库驱动包mysql-connector-java-5.1.24-bin.jar

2、建实体类User

package day01;

import java.io.Serializable;

public class User implements Serializable {

	private static final long serialVersionUID = 2781574928989816558L;

	private Integer id;

	private String username;

	private String password;

	private Integer age;

	// 对应t_user表中的记录数,但数据库中并没有此列,由SQL动态生成
	private Long count;

	public User() {
		super();
	}

	public User(Integer id, String username, String password, Integer age) {
		super();
		this.id = id;
		this.username = username;
		this.password = password;
		this.age = age;
	}

	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer 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 Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public Long getCount() {
		return count;
	}

	public void setCount(Long count) {
		this.count = count;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", password="
				+ password + ", age=" + age + ", count=" + count + "]";
	}

}

3、建实体类对应的xml文件(User.hbm.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
	<!-- 配置映射关系,将类与表进行映射 -->
	<class name="day01.User" table="t_user" dynamic-insert="true" dynamic-update="true">
		<!-- 将列和属性映射 -->
		<!-- 
			name:指的是类中的属性,准备的来说是属性的set方法
			column:指的是表中的列,也可以使用<column>子元素来指定 
		 -->
		<id name="id" column="id">
			<!-- <column name="id"></column>  -->
			<!-- 
				配置主键的生成策略,不同的数据库主键生成方式有所不同
					mysql:自增长 auto_increment
					oracle:序列 sequence
					sql server:自增长 identity
				具体的生成策略,详见文档 5.1.4.1 Generator,常用的如下:
					native:hibernate根据数据库自动的选择主键生成策略
							mysql:自增长
							oracle:序列,hibernate会自动创建序列hibernate_sequence,但只会创建一个,多表共用,从而导致主键不连续
					increment:自增长,适应于mysql和sql server
							也可以为oracle设置自增长,增长方式如下:
								先查询要插入表的主键的最大值,将该最大主键值+1,然后将新值作为要插入记录的主键值
					sequence:序列,适应于oracle
							需要指定序列的名称,也就是在oracle中创建的序列
							如果不指定,则默认使用hibernate自动创建的序列
					assigned:由用户自己指定主键
					uuid:使用uuid算法,生成唯一的uuid			
			 -->
			<generator class="native"></generator>
			<!-- <generator class="sequence">
				<param name="sequence">seq_user</param>
			</generator> -->
		</id>
		
		<!-- 其他属性 -->
		<property name="username" column="name"></property>
		<property name="password" column="pwd"></property>
		<!-- <property name="password" column="pwd" update="false" insert="false"></property> -->
		<property name="age" column="age"></property>
		
		
		<!-- 
			该属性不对应数据库表中的某列,对应的是sql查询的结果
		 -->
		<property name="count" formula="(select count(u.id) from t_user u)"></property>
	</class>
	
	<!-- HQL语句的命名查询 -->
	<query name="login">
		<![CDATA[
			from User where username=:username and password=:password
		]]>
	</query>
	<!-- SQL语句的命名查询 -->
	<sql-query name="login2">
		<![CDATA[
			select * from t_user where name=:name and pwd=:pwd
		]]>
		<!-- <return class="day01.User"></return> -->
	</sql-query>
</hibernate-mapping>

4、在项目根目录下面创建hibernate的配置文件(hibernate.cfg.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" >
<hibernate-configuration>
	<!-- 配置数据库datasource -->
	<session-factory>
		<!-- 配置连接信息 -->
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=utf8</property>
		<property name="connection.username">root</property>
		<property name="connection.password">123</property>
		<!-- <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 
			<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> 
			<property name="connection.username">scott</property> <property name="connection.password">tiger</property> -->

		<!-- 方言,详见文档 3.4.1 SQL方言 -->
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- <property name="dialect">org.hibernate.dialect.OracleDialect</property> -->

		<!-- 在控制台显示执行的sql语句 -->
		<property name="show_sql">true</property>
		<!-- 格式化sql语句,更易读 -->
		<property name="format_sql">true</property>
		<!-- 根据映射关系自动生成数据库表结构,常用取值: create:每次创建SessionFactory时都执行建表语句 update:当映射关系与数据库表结构不一致时更新表 -->
		<property name="hbm2ddl.auto">update</property>
		<!-- 启用二级缓存 -->
		<property name="cache.use_second_level_cache">true</property>
		<!-- 设置二级缓存的实现类,即指定使用的插件 -->
		<property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
		<!-- 启用查询缓存 -->
		<property name="cache.use_query_cache">true</property>
		<!-- 更多配置项,详见 3.4 可选的配置项 -->

		<!-- 指定映射文件的路径 -->
		<mapping resource="day01/User.hbm.xml" />
		<!-- <mapping resource="day04/cache/Account.hbm.xml"/> -->

		<!-- 指定二级缓存的实体类 -->
		<!-- <class-cache usage="read-write" class="day04.cache.Account"/> -->
	</session-factory>
</hibernate-configuration>

5、编写测试代码

package day01;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

/*
 * 使用Hibernate进行持久化操作的步骤
 */
public class Test01_HelloWorld {
	public static void main(String[] args) {
		// 1. 创建Configuration对象
		Configuration config = new Configuration().configure();
		// 读取hibernate.cfg.xml文件,默认读取src下的hibernate.cfg.xml文件,如果同名则可以省略
		// config.configure("hibernate.cfg.xml");
		// config.configure();

		// 2.读取并解析映射信息,创建会话工厂SessionFactory
		// hibernate3.x中可以调用buildSessionFactory()方法获取SessionFactory,在4.x中已过时
		// SessionFactory sf = config.buildSessionFactory();
		// hiberate4.x中通过ServiceRegistry接口来获取,目的是解耦合
		StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder()
				.applySettings(config.getProperties());
		// ssrb.applySettings(config.getProperties());
		StandardServiceRegistry ssr = ssrb.build();
		SessionFactory sf = config.buildSessionFactory(ssr);

		// 3. 获取会话Session
		Session session = sf.openSession();

		// 4.开启事务Transaction(增、删、改),Hibernate默认关闭自动提交事务
		Transaction tx = session.beginTransaction();

		try {
			// 5.执行持久化操作
			session.save(new User(null, "mike", "123", 21));
			// 6.提交事务
			tx.commit();
		} catch (Exception e) {
			tx.rollback(); // 回滚事务
			e.printStackTrace();
		} finally {
			// 7.关闭会话
			session.close();
		}
	}
}

6、封装HibernateUtil.java

package util;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

/*
 * Hibernate工具类
 */
public class HibernateUtil {

	private static StandardServiceRegistry ssr;
	private static SessionFactory sessionFactory;
	private static ThreadLocal<Session> local=new ThreadLocal<Session>();

	static {
		try {
			Configuration config = new Configuration().configure();
			ssr = new StandardServiceRegistryBuilder().applySettings(
					config.getProperties()).build();
			sessionFactory=config.buildSessionFactory(ssr);
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}

	public static Session getSession() {
		Session session=local.get();
		if(session==null||!session.isOpen()){
			session=sessionFactory.openSession();
			local.set(session);
		}
		return session;
	}
	
	public static void close(){
		Session session=local.get();
		if(session!=null){
			session.close();
			local.remove();
			/*
			 * 为了程序能够及时结束,此处将sessionFactory关闭并销毁ssr
			 * 实际开发中,该操作都由其他容器(spring框架)负责,无需自己操作
			 */
//			sessionFactory.close();
//			StandardServiceRegistryBuilder.destroy(ssr);
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值