Hibernate学习笔记01
来源:互联网 发布:免费开源java即时通讯 编辑:程序博客网 时间:2024/05/29 14:31
建立 Hibernate 工程步骤
首先得导入 Hibernate 相关 jar 包,也可以使用 Maven 创建工程,再配置 POM.xml
1. 创建 Hibernate 配置文档 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> <!--数据库用户名 --> <property name="connection.username">root</property> <!--对应的用户密码 --> <property name="connection.password">root</property> <!--数据库驱动 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!--数据库连接字段 --> <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&characterEncoding=UTF-8</property> <!--数据库方言--> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!--设置对数据库的操作模式--> <!--update只更新相应数据 --> <!--create无论表是否存在执行操作都要删除原表创建新表 --> <property name="hbm2ddl.auto">update</property> <!--在控制台显示sql语句 --> <property name="show_sql">true</property> <!--设置格式输出sql语句 --> <property name="format_sql">true</property> <!--设置映射的文件--> <mapping resource="Students.hbm.xml"/> </session-factory></hibernate-configuration>
2. 创建持久化类
规范:遵循JavaBeans规范,必须满足
1. 公有类
2. 有无参构造方法
3. 私有的属性变量
4. 每个属性对应的getter/setter方法
一个持久化类对应数据库中的一张表,一个属性对应表中的一个字段,一个该类的实例对应表中的一条记录
3. 创建对象关系映射文件
Students类对应的文件:Students.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-6-27 19:21:06 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping package="com.lyon.Hibernate_003"> <class name="Students" table="STUDENTS"> <id name="sid" type="int"> <column name="SID" /> <generator class="native" /> </id> <property name="sname" type="java.lang.String"> <column name="SNAME" /> </property> <property name="gender" type="java.lang.String"> <column name="GENDER" /> </property> <property name="birthday" type="java.util.Date"> <column name="BIRTHDAY" /> </property> <!-- <property name="address" type="java.lang.String"> <column name="ADDRESS" /> </property> --> <property name="picture" type="java.sql.Blob"> <column name="PICTURE" /> </property> <!-- 组件属性 --> <component name="address" class="Address"> <property name="postcode" column="POSTCODE"></property> <property name="phone" column="PHONE"></property> <property name="address" column="ADDRESS"></property> </component> </class></hibernate-mapping>
知识点:
根标签
<hibernate-mapping>
中的package属性设置对应的持久化类所在的包<id></id>
标签指定该表对应的主键, 其中<generator/>
子标签class指定主键的方式:如 assigned为Java代码指定主键值;native指定主键值自增如果持久化类中某一属性的类型为 自定义类的引用类型(如上述代码中的 address 属性 ,它包含自身的属性信息,这样的属性在Hibernate中称为组件属性),它的内部属性在数据库中为多个不同的字段
注意点:需将该属性信息用
<component></component>
标签包围,name属性为持久化类中的属性名,class属性指定该引用类型的类名(由于在根标签属性中指定了包名,所以这里只需要给出类名)<property></property
标签中type属性的设置(即数据库对应字段的类型)有三种设置 分别为:Hibernate自带的类型,Java自带的类型,SQL语言自带类型(一般用前两种)
以下为属性对照表
4. 通过 Hibernate API 编写访问数据库的的代码
步骤:
- 创建Configuration(配置)对象
- 创建ServiceRegistry(服务注册)对象
- 创建SessionFactory(会话工厂)对象
- 创建Session(会话)对象
- 开启Transaction(事务)对象
代码示例:
//1Configuration config = new Configuration().configure();//2ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).builderServiceRegistry();//3SessionFactory sessionFactory = config.buildSessionFactory();//4Session session= sessionFactory.openSession();//5Transaction transaction = session.beginTransaction();
对应访问完成后需要的操作:
//提交事务transaction.commit();//关闭会话session.close();//关闭会话工厂sessionFactory.close()
知识点:
Session 相当于 JDBC 中的 Connection 对象,一个 Session 对象在访问数据库时对应一个 Connection 对象。一个 Connection 对象可以被多个 Session 对象复用。
创建 Session 对象有两种方法:
openSession(); 开启一个新的会话,对应 Connection 连接池中一个新的连接对象,必须手动关闭,若过多使用而未关闭会导致连接池溢出
getCurrentSession(); 使用当前会话,在事务提交或回滚时会自动释放连接,达到多个Session复用连接的目的。使用该该方法需在hibernate.cfg.xml中进行配置
使用本地事务(JDBC事务):
<property name="hibernate.current_session_context_class">thread</property>
使用全局事务(JTA事务):
<property name="hibernate.current_session_context_class">jta</property>
调用 Session 对象的 doWork()方法 可以对其对应的 Connection对象 进行相应的设置,如自动提交,获取 Connection 的信息等。
Transaction对象:hibernate对数据的操作都是封装在事务里的,并且默认是非自动提交,在使用session对象保存对象时,如果不开启事务并提交事务,对象不会真正保存在数据库中
Hibernate单表操作
代码示例:
package com.lyon.Hibernate_004;import java.util.Date;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;//测试类public class StudentsTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @Before public void init(){ //创建配置对象 Configuration config = new Configuration().configure(); //创建服务注册对象 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); //创建会话工厂对象 sessionFactory = config.buildSessionFactory(serviceRegistry); //会话对象 session = sessionFactory.openSession(); //开启事务 transaction = session.beginTransaction(); } @After public void destory(){ transaction.commit();//提交事务 session.close();//关闭会话 sessionFactory.close();//关闭会话工厂 } @Test public void testSaveStudents(){ //由于配置文档中设置为主键自增,无需设置sid属性 Students stu = new Students(); stu.setSname("张三"); stu.setGender("男"); stu.setBirthday(new Date()); Address ad = new Address("324378","123466551","杭州市"); stu.setAddress(ad); //session的save方法保存数据 session.save(stu); } @Test public void testGetStudents(){ //session的get方法查询数据 Students s = (Students) session.get(Students.class, 1); System.out.println(s); } @Test public void testLoadStudents(){ //session 的 load 方法查询数据 Students s = (Students) session.load(Students.class, 1); System.out.println(s); } @Test public void testUpdateStudents(){ //先获取到需要修改的数据 Students s = (Students) session.get(Students.class, 1); //修改相应字段 s.setGender("女"); //session的update方法修改数据 session.update(s); } @Test public void testDeleteStudents(){ Students s = (Students) session.get(Students.class, 1); //session的delete方法删除数据 session.delete(s); }}
上述代码使用Junit单元测试工具测试代码,其中:
- @ Before
注解下的方法为执行测试方法之前执行的方法(这里使用 Hibernate API 进行访问前的初始化工作)
- @ After
注解下的方法为执行测试方法之后执行的方法 (这里对事务提交及关闭相应的连接)
- @ Test
注解下的方法为测试方法(这里测试了使用session进行简单的增删改查)
知识点:
load 方法 和 get 方法的区别:load 方法在需要用到查询数据时才开始建立连接并查询,而 get 方法则在方法执行时就建立连接并查询。
- Hibernate学习笔记01
- hibernate学习笔记01----hibernate介绍
- Hibernate 学习笔记01 --HelloWorld
- Hibernate框架学习笔记01
- 【Hibernate学习笔记】hibernate入门
- Hibernate学习笔记:初识Hibernate
- hibernate学习笔记01--基本API
- JavaWeb学习笔记-Hibernate-01-概述
- Hibernate Synchronizer 学习笔记
- hibernate学习笔记1
- Hibernate 学习笔记
- Hibernate学习笔记
- Hibernate 学习笔记
- Hibernate 实例学习笔记
- Hibernate学习笔记(1)
- hibernate学习笔记
- Hibernate学习笔记(一)
- Hibernate学习笔记
- Python异常处理机制
- 测试守护线程的小例子
- 写高质量OC代码52建议总结:37.理解“块”
- Mybatis generator,Table configuration with catalog null, schema null
- JSONP与artTemplate模板引擎使用的示例--请求天气数据
- Hibernate学习笔记01
- <!DOCTYPE html>很重要
- hacker的思想
- hiho一下 第156周 岛屿
- suse12: docker 限制内存, 报your kernel not support swap limit capabilities,memory limited without swap
- os——可移植的访问操作系统的特定功能
- 设计模式--单例模式--Java实现
- android 修改项目名称
- hdu5113-四色定理-搜索&&剪枝&&坑点多多