标签:
Hibernate
优点
1、比较简单
2、数据缓存:一级缓存 二级缓存 查询缓存
3、移植性比较好
缺点
1、因为sql语句是hibernate内部生成的,所以程序员干预不了,不可控
2、如果数据库特别大,不适合用hibernate
JDBC
缺点
1、查询代码特别繁琐
2、重复性代码特别多,频繁的try,catch
3、数据的缓存
4、sql的移植性不好
优点
速度比较快
把控性比较好


Person.hbm.xml
<?xml version="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> <!-- class用来描述一个持久化类 name 类的全名 table 可以不写 默认值和类名一样 catalog 数据库的名称 一般不写 --> <class name="cn.itcast.hibernate.sh.domain.Person"> <!-- 标示属性 和数据库中的主键对应 name 属性的名称 column 列的名称 --> <id name="pid" column="pid" length="200" type="java.lang.Long"> <!-- 主键的产生器 就该告诉hibernate容器用什么样的方式产生主键 --> <generator class="increment"></generator> </id> <!-- 描述一般属性--> <property name="pname" column="pname" length="20" type="string"></property> <property name="psex" column="psex" length="10" type="java.lang.String"></property> </class> </hibernate-mapping>
hibernate.cfg.xml
<?xml version=‘1.0‘ encoding=‘utf-8‘?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!--
一个session-factory只能连接一个数据库
-->
<session-factory>
<!-- 数据库的用户名 -->
<property name="connection.username">root</property>
<!-- 密码 -->
<property name="connection.password">root</property>
<!-- url -->
<property name="connection.url">
jdbc:mysql://localhost:3306/itcast_sh_hibernate
</property>
<!--
作用:根据持久化类和映射文件生成表
validate
create-drop
create
update
-->
<property name="hbm2ddl.auto">update</property>
<!--
显示hibernate内部生成的sql语句
-->
<property name="show_sql">true</property>
<!-- 引入映射文件 -->
<mapping resource="cn/itcast/hibernate/sh/domain/Person.hbm.xml" />
</session-factory>
</hibernate-configuration>
简要概括:
根据客户端(哪种操作)、持久化类(操作的对象)、映射文件(表中的结构)生成sql语句,在内部进行jdbc的curd操作。
package cn.itcast.hibernate.sh.test;
import java.io.Serializable;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.itcast.hibernate.sh.domain.Person;
import cn.itcast.hibernate.sh.utils.HiberanteUtils;
public class PersonTest extends HiberanteUtils{
/**
* 保存 save()
*/
@Test
public void testSavePerson(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = new Person();
person.setPname("上海第一期班长");
person.setPsex("女");
/**
* 【数必须持久化对象】person
*/
session.save(person);
transaction.commit();
session.close();
}
/**
* 查询所有记录 createQuery()方法
* session.createQuery("from Person").list();
*/
@Test
public void testQueryPerson(){
Session session = sessionFactory.openSession();
List<Person> personList = session.createQuery("from Person").list();
for(Person person:personList){
System.out.println(person.getPname());
}
session.close();
}
/**
* 根据主键查询一行记录 get方法()方法
* (Person)session.get(Person.class, 1L);
*/
@Test
public void testQueryPersonByID(){
Session session = sessionFactory.openSession();
/**
* 按照主键的方式查询数据库表中的记录
* 第二个参数的类型必须和持久化类中标示符的类型保持一致
*/
Person person = (Person)session.get(Person.class, 1L); //【1L】
System.out.println(person.getPname());
session.close();
}
/**
* 删除数据 delete()
* hibernate内部会检查标示符,看标示符中的值在数据库相应的表中有没有对应的记录,如果有,则删除
*/
@Test
public void testDeletePerson(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
/**
* 【删除方法一】
* 1、根据id把值从数据库中查找出来
* 2、把对象删除掉
*/
//Person person = (Person)session.get(Person.class, 1L);
//session.delete(person);
/**
* 【删除方法二,把主键为2的删除了】
* 1、新创建一个person对象
* 2、给person对象的标示符赋值
* 3、调用session.delete方法删除
*/
Person person = new Person();
person.setPid(2L); //通过主键就可以确定要删除的记录了,不用再set这行其他字段
session.delete(person);
transaction.commit();
session.close();
}
/**
* 修改数据
*/
@Test
public void testUpdatePerson(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
/**
* 【修改方法一,最常用】
* 1、根据id把持久化对象提取出来
* 2、进行修改
* 3、执行upate操作
*/
//Person person = (Person)session.get(Person.class, 1L);
//person.setPsex("不详");
/** 【修改方法二,】
* 注意:这种方法并不好
* person.setPid(1L);后,数据库中这一行的数据出主键外,全为null了。
* 如果修改了某个值,其他全要跟着修改
*
* */
Person person = new Person();
person.setPid(1L);
session.update(person);
transaction.commit();
session.close();
}
}
/**
* 不同的持久化对象,标识符必须得不一样
* 在hibernate中,不允许出现这种情况:两个持久化对象,但是标示符的值一样
*/
@Test
public void testIdentity(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = (Person)session.get(Person.class, 1L);//person--1L
Person person2 = new Person();
person2.setPid(1L); // person2---1L
session.update(person2);
transaction.commit();
session.close();
}
标签:
原文地址:http://my.oschina.net/ilaoda/blog/501920