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
...
东西太多下一篇在写映射集合映射跟关联关系!
- Hibernate读书笔记之CRUD
- hibernate之2.CRUD
- Hibernate之完整的CRUD
- Hibernate之CRUD工具类
- Java Hibernate 之 CRUD 操作
- hibernate之crud小案例
- Hibernate关联关系中的CRUD之C
- Hibernate关联关系中的CRUD之R
- Hibernate征途(三)之CRUD
- Hibernate程序之实现功能(CRUD)
- Hibernate之关联关系的CRUD
- hibernate---CRUD
- hibernate-CRUD
- 【Hibernate】crud
- Hibernate读书笔记之关联关系
- web进修之—Hibernate CRUD(2)
- hibernate学习之实体类以及crud操
- Hibernate基础(CRUD)
- Android View
- Ubuntu下彻底卸载重装mysql
- PageRank算法C++代码实现标准版
- 完全卸载oracle11g步骤
- Android ANR异常及解决方法
- Hibernate读书笔记之CRUD
- json解析
- java将String字符串写入文件
- 【设计分享】Altera FPGA及Quartues应用小实例
- magento - 获取购物车中的总额,运费,tax ,count,grandtotal等
- 修改DNS缓存TTL生存时间的生效期
- C - Pashmak and Buses
- 关于JFormattedTextField清空数据的方法
- 对数据结构中栈的一些理解