Hibernate学习笔记
来源:互联网 发布:r语言编程艺术下载。 编辑:程序博客网 时间:2024/06/05 10:06
1.创建一个用于测试的mysql数据库,数据库名为testdb
2.在testdb中创建一个测试表user,结构如下:
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,内容如下:
- <?xmlversion="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>
- <classname="com.hndy.demo.hibernate.jdbc.bean.User"table="user">
- <idname="id"column="id"type="java.lang.Integer">
- <generatorclass="native"/>
- </id>
- <propertyname="name"type="java.lang.String">
- <columnname="name"length="100"/>
- </property>
- <propertyname="address"type="java.lang.String">
- <columnname="address"length="100"/>
- </property>
- <propertyname="password"type="java.lang.String">
- <columnname="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数据库
- <idname="id"column="id">
- <generatorclass="sequence">
- <paramname="sequence">序列名</param>
- </generator>
- </id>
(4)hilo:通过高低位合成id,先建表hi_value,再建列next_value。必须要有初始值。
- <idname="id"column="id">
- <generatorclass="hilo">
- <paramname="table">high_val</param>
- <paramname="column">nextval</param>
- <paramname="max_lo">5</param>
- </generator>
- </id>
(5)assigned:用户自定义id;
- <idname="id"column="id">
- <generatorclass="assigned"/>
- </id>
测试发现当Id设置为自动增长时,使用identity 和 native没有本质上的区别
(6)uuid
- <id name="Id"column="id" type="string">
- <generator class="uuid"/>
- </id>
7.创建测试类TestCase_UserDao
A.测试getHibernateTemplate().save()方法
在本例中其实还配置了Spring和Hibernate的相关参数,在此不再解释了
- public staticvoid 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 staticvoid testHibernate_delete(){
- SystemBeans.initialize();
- IUserDao dao = (IUserDao)SystemBeans.getBean("userDao");
- dao.delete(11);
- }
- 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 *fromuser;
- +----+---------+----------+------------+
- | id | name | address |password |
- +----+---------+----------+------------+
- | 12 | Wangwu3 | ShangHai | mypassword |
- +----+---------+----------+------------+
- 1 row in set (0.01 sec)
- public staticvoid 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 staticvoid 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
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 *fromuser;
- +----+----------+----------+----------+
- | id | name | address |password |
- +----+----------+----------+----------+
- | 15 | zhangsan | Beijing | 123456 |
- | 16 | lisi | Shanghai | 123456 |
- | 17 | wangwu | Shanghai | 123456 |
- +----+----------+----------+----------+
- 3 rows inset (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 staticvoid 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
- 【Hibernate学习笔记】hibernate入门
- Hibernate学习笔记:初识Hibernate
- Hibernate Synchronizer 学习笔记
- hibernate学习笔记1
- Hibernate 学习笔记
- Hibernate学习笔记
- Hibernate 学习笔记
- Hibernate 实例学习笔记
- Hibernate学习笔记(1)
- hibernate学习笔记
- Hibernate学习笔记(一)
- Hibernate学习笔记
- Hibernate学习笔记!- -
- Hibernate学习笔记(一)
- Hibernate学习笔记
- Hibernate 学习笔记
- Hibernate Synchronizer 学习笔记
- Hibernate 学习笔记
- linux下telnet服务端配置
- lvm 的管理和使用
- NDK安装环境测试方法(适用于NDK-R7之前的)
- cygwin的工作机制
- 游戏开发常用算法2
- Hibernate学习笔记
- 如何选择集合
- 手机游戏开发常用排序算法
- FreeMarker中引入公共文件的两种方式
- 关于动态执行LAMBDA表达示
- Hibernate学习笔记2
- PDH和SDH区别
- 系统调用,及手动添加自己的系统调用
- IT人士成功的6大步骤