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