1.最近学习了hibernate映射和关联关系的内容,个人认为是非常重要的因此花了2天的时间学习了一下,以下会给出具体的实例。
2.首先我们需要知道利用hibernate来执行增删改查,这是最基本的操作(包括带分页的查询),以下是代码:
,这其中HibernateUtils是封装了一些每次测试都需要用到的模板代码,QueryResult类是封装了分页的信息,User是持久化类等等
①首先的工作就是导入jar包一系列操作。
②第二步我们首先需要创建一个实体类User,提供setter和getter方法,为了方便测试重写下tostring方法。
package com.icss.hibernate; public class User { private Integer id; private String name; private int age; @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + "]"; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
③写出user类对应的hbm文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.icss.hibernate"> <class name="User" table="USERS"> <id name="id" type="java.lang.Integer"> <column name="USER_ID" /> <generator class="native" /> </id> <property name="name" type="java.lang.String"> <column name="USER_NAME" /> </property> <property name="age" type="int"> <column name="USER_AGE" /> </property> </class> </hibernate-mapping>
④配置一下Hibernate.cfg.xml文件,这里需要注意的是映射文件的加入不能写错
<!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.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="connection.url">jdbc:mysql:///321</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.username">root</property> <property name="hibernate.connection.password">123</property> <!-- 其他配置 --> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <!-- create:先删除,再创建 update:如果表不存在就创建,不一样就更新,一样就什么都不做。 create-drop:初始化时创建表,SessionFactory执行close()时删除表。 validate:验证表结构是否一致,如果不一致,就抛异常。 --> <property name="hbm2ddl.auto">update</property> <!-- 导入映射文件 <mapping resource="cn/itcast/a_helloworld/User.hbm.xml"/> --> <mapping resource="com/icss/hibernate/set/User.hbm.xml"/> <mapping resource="com/icss/hibernate/map/Department.hbm.xml"/> <mapping resource="com/icss/hibernate/map/Employee.hbm.xml"/> <mapping resource="com/icss/hibernate/manytomany/Student.hbm.xml"/> <mapping resource="com/icss/hibernate/manytomany/Teacher.hbm.xml"/> </session-factory> </hibernate-configuration>
⑤编写HibernateUtils,这里是为了封装一些代码防止在DAO‘代码中很多重复的代码出现(因为凡是涉及到数据库操作就必须有sessionFactory和session和Transcation):
这里使用了一个static代码块是因为配置文件只需要执行一次sessionFactory只需要创建一次就可以了(关于static的使用见我上一个博文)
package com.icss.hibernate; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { private static SessionFactory sessionFactory; static { sessionFactory=new Configuration() .configure() .buildSessionFactory(); } public static SessionFactory getSessionFactory(){ return sessionFactory; } public static Session getSession(){ return sessionFactory.openSession(); } }
⑥编写UserDao类其中主要是增删改查方法的实现包括带分页的查询所有:
这个类编写的时候需要注意每个方法的返回值,注意异常的捕获和事务的操作,其中的删除操作是必须先获取到然后在根据id来删除的,其次findAll方法是获取所有记录返回的是一个list集合,最后一个方法需要进行分页处理,所有必须设置2个参数firstResult(代表的是索引),以及maxResult(代表的是一页显示多少条记录),最后会详细说明。这里用到的是HQL语句跟SQL不一样,这里的From后面跟的是对象实体类而不是表。
package com.icss.hibernate; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; public class UserDao { public void save(User user){ Session session=HibernateUtils.getSession(); Transaction transaction=null; try { transaction=session.beginTransaction(); session.save(user); transaction.commit(); } catch (RuntimeException e) { transaction.rollback(); throw e; }finally{ session.close(); } } public void update(User user){ Session session=HibernateUtils.getSession(); Transaction transaction=null; try { transaction=session.beginTransaction(); session.update(user); transaction.commit(); } catch (RuntimeException e) { transaction.rollback(); throw e; }finally{ session.close(); } } public void delete(int id){ Session session=HibernateUtils.getSession(); Transaction transaction=null; try { transaction=session.beginTransaction(); User user= (User) session.get(User.class, id); session.delete(user); transaction.commit(); } catch (RuntimeException e) { transaction.rollback(); throw e; }finally{ session.close(); } } public User getById(int id){ Session session=HibernateUtils.getSession(); Transaction transaction=null; try { transaction=session.beginTransaction(); User user= (User) session.get(User.class, 1); transaction.commit(); return user; } catch (RuntimeException e) { transaction.rollback(); throw e; }finally{ session.close(); } } @SuppressWarnings("unchecked") public List<User> findAll(){ Session session=HibernateUtils.getSession(); Transaction transaction=null; try { transaction=session.beginTransaction(); List<User> list= session.createQuery("FROM User").list(); transaction.commit(); return list; } catch (RuntimeException e) { transaction.rollback(); throw e; }finally{ session.close(); } } public QueryResult findAll(int firstResult ,int maxResult){ Session session=HibernateUtils.getSession(); Transaction transaction=null; try { transaction=session.beginTransaction(); List<User> list= session.createQuery("FROM User").setFirstResult(firstResult).setMaxResults(maxResult).list(); Long count= (Long) session.createQuery("SELECT COUNT(*) FROM User").uniqueResult(); transaction.commit(); return new QueryResult(count.intValue(), list); } catch (RuntimeException e) { transaction.rollback(); throw e; }finally{ session.close(); } } }
⑦DAO写的时候我们需要知道最后一个分页查询方法返回的是2个值,不好显示,所以我们将这2个返回值(第一个返回值是count总记录数,第二个返回list集合)封装起来然后返回,代码如下:
package com.icss.hibernate; import java.util.List; public class QueryResult { private int count; private List list; public QueryResult(int count, List list) { this.count = count; this.list = list; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public List getList() { return list; } public void setList(List list) { this.list = list; } }
⑧写测试代码HibernateTest,代码如下(先new对象):
package com.icss.hibernate; import static org.junit.Assert.*; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Before; import org.junit.Test; public class UserDaoTest { UserDao userDao =new UserDao(); @Test public void testSave() { User user=new User(); user.setName("jiangweiwei"); user.setAge(11); userDao.save(user); } @Test public void testUpdate() { User user=new User(); user.setName("zhangsan"); user.setAge(22); userDao.update(user); } @Test public void testDelete() { userDao.delete(1); } @Test public void testGetById() { User user= userDao.getById(1); System.out.println(user); } @Test public void testFindAll() { List<User> list = userDao.findAll(); for(User user : list){ System.out.println(user); } } @Test public void testFindAllIntInt() { // QueryResult queryResult = userDao.findAll(0, 10); QueryResult queryResult = userDao.findAll(10, 10); // QueryResult queryResult = userDao.findAll(20, 10); System.out.println("总记录数"+queryResult.getCount()); for(User user :(List<User>) queryResult.getList()){ System.out.println(user); } } }
附录:note如下:
(这是分页的思想)
假设共有25条记录,每页显示10条,则共3页。
firstResult
maxResults
----------------------------------------
第1页 0 10
第2页 10
10
第3页 20
10
total / pageSize
total % pageSize
Session
SQL
查询的是表和表中的字段。
不区分大小写
HQL
Hibernate Query Language
与SQL相似
查询的是对象和对象中的属性。
关键字不区分大小写,但类名与属性名区分大小写。
==========================================================
API
1,API简介。
2,Session中的方法。
3,查询:HQL与Criteria
配置:
1,主配置文件
2,映射文件
映射基础
普通属性
主键
集合属性
关联关系
一对多/多对一
多对多
一对一
继承结构
-----------------------------------
-- API简介
Configuration 配置
configure()
configure(String resource)
addResource(String resource)导入一个指定位置的映射文件
addClass(Class clazz)导入与指定类同一个包中的以类名为前缀,后缀为.hbm.xml的映射文件
buildSessionFactory()
SessionFactory Session工厂
openSession()
getCurrentSession()
close()
Session 很重要的一个对象
操作对象的方法
save(Object)
update(Object)
delete(Object)
查询的方法
createQuery(String)--> Query
createCriteria(Class)
管理事务的方法
beginTransaction() --> Transaction
getTransaction() --> Transaction获取当前Session中关联的事务对象
其他的方法
...
Transaction 事务
commit()
rollback()
Query 查询
list()
查询一个结果集合。
uniqueResult()查询一个唯一的结果,如果没有结果,则返回null,如果结果有多个,就抛异常。
...
--------------------------------
Hibernate主配置文件
1,配置的key前面的hibernate.前缀 可以有,也可以没有。如hibernate.dialect或dialect都可以。
2,按作用可分为三类:
1,数据库信息
<property ...>
方言、JdbcUrl、驱动、用户名、密码
2,导入映射文件
<mapping ...>
3,其他配置
<property ...>
show_sql
显示生成的SQL语句
format_sql
格式化生成的SQL语句
hbm2ddl.auto
自动生成表结构
hibernate.hbm2ddl.auto
生成表结构的两种方式:
1,hbm2ddl.auto
2,使用SchemaExport工具类
注意:只能建表,不能建库
==============
主键:
如果是数字,建议使用包装类型。
identity
sequence
hilo
native
assigned
uuid
foreign
...
东西太多下一篇在写映射集合映射跟关联关系!