现在的位置: 首页 > 综合 > 正文

Hibernate读书笔记之CRUD

2017年11月09日 ⁄ 综合 ⁄ 共 8359字 ⁄ 字号 评论关闭

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
...

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

抱歉!评论已关闭.