Hibernate读书笔记之CRUD

来源:互联网 发布:优化旅客列车编组 编辑:程序博客网 时间:2024/05/22 20:28

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;@Overridepublic 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(); @Testpublic void testSave() {User user=new User();user.setName("jiangweiwei");user.setAge(11);userDao.save(user);}@Testpublic void testUpdate() {User user=new User();user.setName("zhangsan");user.setAge(22);userDao.update(user);}@Testpublic void testDelete() {userDao.delete(1);}@Testpublic void testGetById() {  User user=userDao.getById(1);  System.out.println(user);}@Testpublic void testFindAll() {  List<User> list =userDao.findAll();  for(User user : list){  System.out.println(user);  }}@Testpublic 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
...


东西太多下一篇在写映射集合映射跟关联关系!吐舌头




0 1
原创粉丝点击