Hibernate通过对象关系映射,使用持久化类代替传统的sql语句对数据库进行操作(通俗说就是把数据表变成一个实体类来看待和操作)。其中,持久化类可以使用
1.配置对应的hbm.xml(关系映射配置文件)来映射持久化实体类。
2.直接在持久化实体类以注解方式配置。
前期工作:
一、导入Hibernate相关依赖包(包括本人使用的mysql驱动包和c3p0连接池依赖包):
二、创建事例表与数据:
xml配置持久化类:
一、首先,先在Hibernate.cfg.xml配置Hibernate启动相关配置项:
<?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 >
<!-- mysql数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- mysql数据库名称 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/world</property>
<!-- 数据库的登陆用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库的登陆密码 -->
<property name="hibernate.connection.password">1988419</property>
<!-- 配置方言为每一种数据库提供特殊sql适配-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- c3p0连接池配置 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!-- 连接池最大连接 -->
<property name="hibernate.c3p0.max_size">10</property>
<!-- 连接池最小连接 -->
<property name="hibernate.c3p0.min_size">1</property>
<!-- 连接池超时时长(毫秒) -->
<property name="hibernate.c3p0.timeout">5000</property>
<!-- 指定连接池最大缓存多少Statment对象 -->
<property name="hibernate.c3p0.max_statment">50</property>
<!-- 空闲检测周期(毫秒) -->
<property name="hibernate.c3p0.idle_test_period">3000</property>
<!-- 连接池一次增加的连接数 -->
<property name="hibernate.c3p0.acquire_increment">5</property>
<!-- 每次都验证连接是否可用 -->
<property name="hibernate.c3p0.validate">true</property>
<!-- 是否在控制台输出sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 使用xml配置时,指定持久化类xml的路径 -->
<mapping resource="org/lcwben/Student.hbm.xml"></mapping>
<!-- 使用注解持久化类配置时,指定持久化类.java文件配置 -->
<!-- <mapping class="org.lcwben.Student" /> -->
</session-factory>
</hibernate-configuration>
二、创建持久化实体类:
public class Student {
private Integer uid;
private String uname;
private Date regtime;
private Integer status;
private Integer score;
private Integer classes;
//所有成员变量的getter与setter
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public Date getRegtime() {
return regtime;
}
public void setRegtime(Date regtime) {
this.regtime = regtime;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
public Integer getClasses() {
return classes;
}
public void setClasses(Integer classes) {
this.classes = classes;
}
//。。。。。。。。。。。。。。。。。。。。。。。
}
三、配置关联映射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="org.lcwben.Student" table="test_stu">
<!-- 主键使用自增(increment)选项 -->
<id name="uid" column="uid">
<generator class="increment"/>
</id>
<property name="uname"/>
<property name="regtime"/>
<property name="status"/>
<property name="score"/>
<property name="classes"/>
</class>
</hibernate-mapping>
四、JUnit测试
public class Client {
private static SessionFactory sf;
//利用静态块初始化连接池
static {
//用Configuration类初始化hibernate.cfg.xml的配置项
Configuration cfg = new Configuration().configure();
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
sf = cfg.buildSessionFactory(sr);
}
//增
@Test
public void testCreate() {
Session session = null;
try {
//开启session
session = sf.openSession();
//开启事务管理器
session.beginTransaction();
Student stu1 = new Student();
stu1.setUname("hib1");
stu1.setRegtime(new Date());
stu1.setStatus(1);
stu1.setScore(75);
stu1.setClasses(4);
session.save(stu1);
//从session对象取出事务管理器,提交事务;
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//出异常时对事务进行事务回滚
session.getTransaction().rollback();
} finally {
if(session!=null){
session.close();
}
}
}
//删
@Test
public void delete() {
Session session = null;
try {
session = sf.openSession();
session.beginTransaction();
Student stu1 = new Student();
stu1.setUid(12);
stu1.setUname("hib1");
stu1.setRegtime(new Date());
stu1.setStatus(1);
stu1.setScore(75);
stu1.setClasses(4);
session.delete(stu1);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
if(session!=null) {
session.close();
}
}
}
//全量查询
@Test
public void selectAll() {
Session session = null;
List<Student> stus = null;
try {
session = sf.openSession();
session.beginTransaction();
//注意:HQL中的表名并非数据库中的表名,而是对应映射对象类的类名!!!
Query query1 = session.createQuery("from Student");
stus = query1.list();
for (Student stu : stus) {
System.out.println(stu.getUid()+" "+stu.getUname()+" "+stu.getRegtime()+" "+stu.getStatus()+" "+stu.getScore()+" "+stu.getClasses());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(session!=null) {
session.close();
}
}
}
//条件查询
@Test
public void selectOne() {
Session session = null;
try {
session = sf.openSession();
Query query = session.createQuery("from Student where uid=:id");
query.setInteger("id", 3);
Student stu = (Student)query.uniqueResult();
System.out.println(stu.getUid()+" "+stu.getUname()+" "+stu.getRegtime()+" "+stu.getStatus()+" "+stu.getScore()+" "+stu.getClasses());
} catch (Exception e) {
e.printStackTrace();
} finally {
if(session!=null) {
session.close();
}
}
}
//改
@Test
public void update () {
Session session = null;
try {
session = sf.openSession();
session.beginTransaction();
String hql = "update Student set uname=:name where uid=:id";
Query qry = session.createQuery(hql);
qry.setString("name", "lcwhbm1");
qry.setInteger("id", 4);
qry.executeUpdate();
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
if (session!=null) {
session.close();
}
}
}
//改
@Test
public void update2 () {
Session session = null;
try {
session = sf.openSession();
session.beginTransaction();
/*使用load(持久化类对象, 主键值)的方式直接获得条件所指的对象,
* 代替了select... where pk=...的形式,不需要写sql语句就可以实现条件查询的功能。
*/
Student stu = (Student)session.load(Student.class, 4);
//然后使用持久化类的setter可以对该条数据进行修改!
stu.setUname("benhbm2");
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
if (session!=null) {
session.close();
}
}
}
以下给出的是selectAll()的查询结果:
三月 08, 2017 2:35:48 下午 org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
三月 08, 2017 2:35:48 下午 org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select student0_.uid as uid1_0_, student0_.uname as uname2_0_, student0_.regtime as regtime3_0_, student0_.status as status4_0_, student0_.score as score5_0_, student0_.classes as classes6_0_ from test_stu student0_
1 lcwben1 2017-01-18 00:00:00.0 0 60 1
2 lcwben2 2017-01-18 00:00:00.0 1 67 1
3 lcwben3 2017-01-19 00:00:00.0 1 51 3
4 benhbm2 2017-01-19 00:00:00.0 0 78 3
5 lcwben5 2017-01-19 00:00:00.0 0 80 3
6 lcwben6 2017-01-22 00:00:00.0 1 97 2
7 lcwben7 2017-01-23 00:00:00.0 0 73 1
8 lcwben8 2017-01-25 00:00:00.0 1 48 2
9 lcwben9 2017-01-28 00:00:00.0 1 100 3
10 lcwben10 2017-01-31 00:00:00.0 0 92 3
至于注解式配置持久化类,由于篇幅所限,另开一篇文章( 点击打开链接)。