Hibernate 第一天笔记
* javaEE企业级开发分层 表现层 业务层 持久层
表现层:struts2
业务层:spring
持久层:hibernate----操作数据库
* hibernate框架称为ORM(Object Relational Mapping)框架
流行的数据库框架
JPA Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系(只有接口规范)
Hibernate 最流行ORM框架,通过对新-关系映射配置,可以完全脱离底层SQL,对JPA的一个具体实现
MyBatis 本是apache的一个开源项目 iBatis,支持普通 SQL查询,存储过程和高级映射的优秀持久层框架
Apache DBUtils 、Spring JDBCTemplate
* 官网:http://sourceforge.net/projects/hibernate/files/hibernate3
* 解压hibernate压缩文件
documentation:文档目录
lib:jar包目录(依赖包)
project:源码包
hibernate3.jar:框架核心jar
* log4j记录日志的级别
fatal:致命错误> error:普通错误 > warn:警告 > info:普通信息 > debug:调试信息 > trace:堆栈信息
* hibernate 入门案例
1)创建java项目
2)导入jar(11个)
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
hibernate3.jar
javassist-3.12.0.GA.jar
jta-1.1.jar
log4j-1.2.16.jar
mysql-connector-java-5.0.8-bin.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.7.2.jar
3)创建一个数据库和表
create database hibernate_day1 default character set utf8;
create table user(id int primary key auto_increment ,name varchar(32),int age);
4)对应user表创建一个实体类
5)在config下提供一个hibernate 核心配置文件hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- 配置hibernate框架的会话工厂 -->
<session-factory>
<!-- 数据库方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 描述jdbc基本连接参数 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_day1</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 在控制台显式sql -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- 注册hbm映射文件 -->
<mapping resource="cn/itcast/domain/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
6)提供hbm映射文件:User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 描述User类对应user表 -->
<class name="cn.itcast.domain.User" table="user">
<!-- id属性对应id字段 -->
<id name="id" column="id">
<!-- 主键生成策略 -->
<generator class="native"></generator>
</id>
<property name="name" column="name"/>
<property name="age" column="age"/>
</class>
</hibernate-mapping>
7)将hbm映射文件注册到核心配置文件中
8)通过hibernate提供的API完成对数据库操作
//读取hibernate核心配置文件,获取配置对象
Configuration conf = new Configuration().configure();
//通过配置对象构建一个会话工厂对象
SessionFactory factory = conf.buildSessionFactory();
//从工厂中获取一个会话对象
Session session = factory.openSession();
User user = new User();
user.setName("test");
user.setAge(30);
//开启事务
Transaction tx = session.beginTransaction();
session.save(user);
//提交事务
tx.commit();
session.close();
* Hibernate常用操作
1)保存数据save
2)根据主键查询数据
get---立即加载
load---延迟加载
3)根据主键修改数据update
session.update(user);//user对象可以自己构造,也可以先查询,再修改
4)根据主键删除数据delete
session.delete(user);//user对象可以自己构造,也可以先查询,再删除
5)查询所有
String hql = "from User";
Query query = session.createQuery(hql);
List<User> userList = query.list();
*hibernate属性
hibernate.dialect 操作数据库方言
hibernate.connection.driver_class 连接数据库驱动程序
hibernate.connection.url 连接数据库URL
hibernate.connection.username 数据库用户名
hibernate.connection.password 数据库密码
hibernate.show_sql true 在控制台上输出SQL语句
hibernate.format_sql true 格式化控制台输出的SQL语句
hibernate.hbm2ddl.auto create/create-drop/update/validate DDL策略
hibernate.connection.autocommit true 事务是否自动提交
* hibernate中的API
1)Configuration
负责管理 Hibernate 的配置信息,包括如下内容:
加载 hibernate.properties 和 hibernate.cfg.xml
持久化类与数据表的映射关系(*.hbm.xml 文件)
2)SessionFactory
Configuration对象根据当前的配置信息生成 SessionFactory对象
3)Session---会话对象
包装的是数据库连接信息Connection
session与一级缓存相关
4)Transaction
commit():提交相关联的session实例
rollback():撤销事务操作
wasCommitted():检查事务是否提交
5)Query(分页)
Query query = session.createQuery(hql);
query.setFirstResult(5);//从哪开始查询
query.setMaxResults(5);//查询多少数据
6)Criteria---条件查询对象
Criteria cri = session.createCriteria(User.class);
cri.add(Restrictions.ilike("name", "test"));//添加查询条件
cri.add(Restrictions.ge("age", 20));//查询age大于20
cri.addOrder(Order.asc("name"));//添加排序
List<User> userList = cri.list();
* 理解Hibernate中持久化类:POJO + 有一个hbm文件描述这个类和表的对应关系
* 编写规则
提供一个无参数 public访问控制符的构造器
提供一个标识属性,映射数据表主键字段
所有属性提供public访问控制符的 set get 方法
标识属性应尽量使用基本数据类型的包装类型
不要用final修饰 (将无法生成代理对象进行优化)
* 区分自然主键和代理主键
自然主键:具有业务含有的主键
代理主键:不具有业务含有的主键(建议使用代理主键)
* 主键生成策略
1)increment:自增,由hibernate框架发出SQL查询最大的id(SELECT max(id) FROM Table),有线程问题
2)identity:使用数据库的自增策略,mysql,DB2可以使用,Oracle不能使用
3)sequence:使用数据库的序列完成自增,DB2,Oracle可以使用,mysql不能使用
4)native:本地策略,根据客户端使用的数据库,选择使用identity,sequence(一般使用这个就可以了)
5)uuid:由hibernate框架负责生成32位字符串(使用uuid做为主键有一个好处就是在数据迁移时不会影响到迁移到的数据库中的已有数据)
6)assigned:手动委派