Hibernate学习笔记

1.创建一个用于测试的mysql数据库,数据库名为testdb

2.在testdb中创建一个测试表user,结构如下:

mysql> desc user;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| name     | varchar(100) | YES  |     | NULL    |                |
| address  | varchar(100) | YES  |     | NULL    |                |
| password | varchar(100) | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)


   

3.创建一个和user表字段对应的Bean   

public class User {
	private int id;
	private String name;
	private String address;
	private String password;
        setter 和 getter方法略
}



4.定义一个操作User表的Dao接口IUserDao

public interface IUserDao {
	public void add(User user);
	
	public void delete(int uid);
	
	public void update(User user);
	
	public User findById(int uid);
	
	public List<User> getUserListByAddress(String address);	
}

5.定义 IUserDao的实现类UserDao类,此类要实现IUserDao接口同时继承HibernateDaoSupport抽象类,以获取SessionFactory


public class UserDao extends HibernateDaoSupport implements IUserDao {

	@Override
	public void add(User user) {
		this.getHibernateTemplate().save(user);
	}

	@Override
	public void delete(int uid) {
		User user=new User();
		user.setId(uid);
		this.getHibernateTemplate().delete(user);
	}

	@Override
	public User findById(int uid) {
		return (User)this.getHibernateTemplate().get(User.class,uid);
	}

	@Override
	public List<User> getUserListByAddress(String address) {
		return null;
	}

	@Override
	public void update(User user) {
		this.getHibernateTemplate().update(user);
	}

}



6.定义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="com.hndy.demo.hibernate.jdbc.bean.User" table="user">       
		<id name="id" column="id" type="java.lang.Integer">
		     <generator class="native" />
		</id>
		<property name="name" type="java.lang.String">
		    <column name="name" length="100"/>
		</property>

		<property name="address" type="java.lang.String">
		    <column name="address" length="100" />
		</property>
		
		<property name="password" type="java.lang.String">
		    <column name="password" length="100" />
		</property>        
	</class>
</hibernate-mapping>

其中property name与类中的属性一一对应,type是属性的类型,column name是类的属于对应的字段名,length表示字段的长度

这里需要说明一下id的创建问题,有这几种方法产生主键

(1)identity:用于MySql数据库。特点:递增
    对于MySql数据库使用递增序列时需要在建表时对主键指定为auto_increment属性。

(2)native:跨数据库时使用,由底层方言产生。
    Default.sequence为hibernate_sequence
   使用native时Hibernate默认会去查找Oracle中的hibernate_sequence序列。如果Oracle中没有该序列,连Oracle数据库时会报错。

(3)sequence:用于Oracle数据库

<id name="id" column="id">
   <generator class="sequence">
     <param name="sequence">序列名</param>
   </generator>
</id>


(4) hilo:通过高低位合成id,先建表hi_value,再建列next_value。必须要有初始值。
<id name="id" column="id">
    <generator class="hilo">
      <param name="table">high_val</param>
       <param name="column">nextval</param>
      <param name="max_lo">5</param>
    </generator>
</id>


(5) assigned:用户自定义id;
<id name="id" column="id">
   <generator class="assigned"/>
</id>

测试发现当Id设置为自动增长时,使用identity 和 native没有本质上的区别

(6)uuid

<id name="Id" column="id" type="string">
    <generator class="uuid"/>
</id>
uuid可以产生36个16进制字符串,当表的ID字段设置为字符类型并且非自动增长是时,使用uuid产生逻辑主键非常有用

7.创建测试类TestCase_UserDao

A.测试getHibernateTemplate().save()方法

在本例中其实还配置了Spring和Hibernate的相关参数,在此不再解释了

public static void testHibernate_add(){
		SystemBeans.initialize();
		IUserDao dao = (IUserDao)SystemBeans.getBean("userDao");
		User user = new User();
		user.setName("Wangwu3");
		user.setAddress("ShangHai");
		user.setPassword("mypassword");
		dao.add(user);		
}



运行测试类的testHibernate_add()方法,部分输出信息如下:

Opening Hibernate Session
opened session at timestamp: 13267000514
executing identity-insert immediately
about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
opening JDBC connection
insert into user (name, address, password) values (?, ?, ?)
Hibernate: insert into user (name, address, password) values (?, ?, ?)
Natively generated identity: 10
about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
Eagerly flushing Hibernate session
processing flush-time cascades
dirty checking collections
Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects
Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
listing entities:
com.ynyd.demo.hibernate.jdbc.bean.User{id=10, address=ShangHai, name=Wangwu3, password=mypassword}
Closing Hibernate Session
可以看到具体的执行顺序
第1 行开启Hibernate Session
第5 行打开JDBC connection
第6 行输出的是拼接好的sql
第8 行输出的是产生好的一个主键值10
第9 行执行完SQL
第16行输出User类的各个属性值,可以发现id=10
第17行关闭了Hibernate Session

B.测试getHibernateTemplate().delete()方法

public static void testHibernate_delete(){
	SystemBeans.initialize();
	IUserDao dao = (IUserDao)SystemBeans.getBean("userDao");
	dao.delete(11);
}
运行测试类的testHibernate_delete()方法,部分输出信息如下:
Opening Hibernate Session
opened session at timestamp: 13267028259
Eagerly flushing Hibernate session
processing flush-time cascades
dirty checking collections
Flushed: 0 insertions, 0 updates, 1 deletions to 1 objects
Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
listing entities:
com.ynyd.demo.hibernate.jdbc.bean.User{id=11, address=null, name=null, password=null}
about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
opening JDBC connection
delete from user where id=?
Hibernate: delete from user where id=?
Executing batch size: 1
about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
Closing Hibernate Session
releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]

C.测试HibernateDaoSupport.getHibernateTemplate().update()方法,修改表记录

查看当前的user表数据情况

mysql> select * from user;
+----+---------+----------+------------+
| id | name    | address  | password   |
+----+---------+----------+------------+
| 12 | Wangwu3 | ShangHai | mypassword |
+----+---------+----------+------------+
1 row in set (0.01 sec)

public static void testHibernate_update(){
	SystemBeans.initialize();
	IUserDao dao = (IUserDao)SystemBeans.getBean("userDao");
	User user = new User();
	user.setId(12);
	user.setName("Rooke");
	user.setAddress("Shangdi BeiJing");
	user.setPassword("123456");
	dao.update(user);
}

运行测试类的testHibernate_update()方法,部分输出信息如下:

Opening Hibernate Session
opened session at timestamp: 13267033472
Eagerly flushing Hibernate session
processing flush-time cascades
dirty checking collections
Flushed: 0 insertions, 1 updates, 0 deletions to 1 objects
Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
listing entities:
com.hnyd.demo.hibernate.jdbc.bean.User{id=12, address=Shangdi BeiJing, name=Rooke, password=123456}
about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
opening JDBC connection
update user set name=?, address=?, password=? where id=?
Hibernate: update user set name=?, address=?, password=? where id=?
Executing batch size: 1
about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
Closing Hibernate Session
releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!


C.测试HibernateDaoSupport.getHibernateTemplate().get()方法

public static void testHibername_find(){
	SystemBeans.initialize();
	IUserDao dao = (IUserDao)SystemBeans.getBean("userDao");
	User u = dao.findById(12);
	System.out.println(u.getId());
	System.out.println(u.getName());
	System.out.println(u.getAddress());
	System.out.println(u.getPassword());
}

运行测试类的testHibernate_find()方法,部分输出信息如下:

Opening Hibernate Session
opened session at timestamp: 13267035305
loading entity: [com.ynyd.demo.hibernate.jdbc.bean.User#12]
about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
opening JDBC connection
select user0_.id as id0_0_, user0_.name as name0_0_, user0_.address as address0_0_, 
user0_.password as password0_0_ from user user0_ where user0_.id=?
Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.address as address0_0_, 
user0_.password as password0_0_ from user user0_ where user0_.id=?
about to open ResultSet (open ResultSets: 0, globally: 0)
result row: EntityKey[com.ynyd.demo.hibernate.jdbc.bean.User#12]
about to close ResultSet (open ResultSets: 1, globally: 1)
about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
resolving associations for [com.ynyd.demo.hibernate.jdbc.bean.User#12]
done materializing entity [com.ynyd.demo.hibernate.jdbc.bean.User#12]
initializing non-lazy collections
done entity load
transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
Eagerly flushing Hibernate session
processing flush-time cascades
dirty checking collections
Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects
Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
listing entities:
com.ynyd.demo.hibernate.jdbc.bean.User{id=12, address=Shangdi BeiJing, name=Rooke, password=123456}
Closing Hibernate Session
releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
12
Rooke
Shangdi BeiJing
123456
Closing org.springframework.context.support.FileSystemXmlApplicationContext@b169f8: startup date [Mon Jan 16 16:45:29 CST 2012]; 
root of context hierarchy
C.测试 HibernateDaoSupport.getHibernateTemplate().find()方法,查询user表所有记录

IUserDao接口增加
public List<User> getAllUsers();


UserDao方法增加
public List<User> getAllUsers(){
	return (List<User>)this.getHibernateTemplate().find("from User");
}


测试类增加
public static void testHibername_findAll(){

	SystemBeans.initialize();
	IUserDao dao = (IUserDao)SystemBeans.getBean("userDao");
	List<User> list = dao.getAllUsers();
	for(User u:list){
		System.out.println(u.toString());			
	}
}

查询user表的数据:

mysql> select * from user;
+----+----------+----------+----------+
| id | name     | address  | password |
+----+----------+----------+----------+
| 15 | zhangsan | Beijing  | 123456   |
| 16 | lisi     | Shanghai | 123456   |
| 17 | wangwu   | Shanghai | 123456   |
+----+----------+----------+----------+
3 rows in set (0.01 sec)


执行测试方法后结果如下:

name:zhangsan,password:123456,address:Beijing
name:lisi,password:123456,address:Shanghai
name:wangwu,password:123456,address:Shanghai

C.测试 HibernateDaoSupport.getHibernateTemplate().find()方法,查询user表指定条件的记录

IUserDao接口增加

public User findByName(String name);

UserDao增加

public User findByName(String name){
	List<User> list = (List<User>)this.getHibernateTemplate().find(String.format("from User u where u.name='%s'", name));
	if (list.size()>0){
		return list.get(0);
	}
	return null;
}

find()方法支持HQL,并且返回的结果是个集合类型,因此需要从集合里面取出元素再返回

测试类增加

public static void testHibername_findByName(){
	SystemBeans.initialize();
	IUserDao dao = (IUserDao)SystemBeans.getBean("userDao");
	User u = dao.findByName("zhangsan");
	System.out.println(u.toString());
}

执行结果如下:
name:zhangsan,password:123456,address:Beijing


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring是一个开源的Java框架,用于构建企业级应用程序。它提供了一种轻量级的、非侵入式的开发方式,通过依赖注入和面向切面编程等特性,简化了Java应用程序的开发过程。 以下是关于Spring学习的一些笔记: 1. IoC(控制反转):Spring通过IoC容器管理对象的创建和依赖关系的注入。通过配置文件或注解,将对象的创建和依赖关系的维护交给Spring容器来管理,降低了组件之间的耦合度。 2. DI(依赖注入):Spring通过依赖注入将对象之间的依赖关系解耦。通过构造函数、Setter方法或注解,将依赖的对象注入到目标对象中,使得对象之间的关系更加灵活和可维护。 3. AOP(面向切面编程):Spring提供了AOP的支持,可以将与业务逻辑无关的横切关注点(如日志、事务管理等)从业务逻辑中分离出来,提高了代码的可重用性和可维护性。 4. MVC(模型-视图-控制器):Spring提供了一个MVC框架,用于构建Web应用程序。通过DispatcherServlet、Controller、ViewResolver等组件,实现了请求的分发和处理,将业务逻辑和视图展示进行了分离。 5. JDBC和ORM支持:Spring提供了对JDBC和ORM框架(如Hibernate、MyBatis)的集成支持,简化了数据库访问的操作,提高了开发效率。 6. 事务管理:Spring提供了对事务的支持,通过声明式事务管理和编程式事务管理,实现了对数据库事务的控制和管理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值