Hibernate
轻量级持久层解决方案 关系数据库ORM(Object Relational Mapping)框架
将java中的实体类与数据库简历一个映射,达到操作java对象进而操作数据库的目的。
特点:简化dao层编码工作、利用java反射机制、性能优秀、映射灵活
日志记录
sif4j(Simple Logging Facade for Java) 用于整合其他日志系统
log4j 具体的日志记录方案
log4j 的三个组件
记录器(Loggers)
格式:记录器=级别 输出源1 输出源2 log4j.rootLogger=info,stdout
输出源(Appenders)
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 控制台进行输出
log4j.appender.file=org.apache.log4j.FileAppender 向文件进行输出
布局(Layouts)
%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j 的日志级别 fatal(致命的) error(普通错误) warn(警告) info(信息) debug(调试) trace(堆栈信息)
Hibernate 目录结构
documentation:Hibernate文档
lib:Hibernate开发jar包
bytecode:操作字节码jar包.
jpa:Hibernate的实现jpa规范.
optional:Hibernate的可选jar包.
required:Hibernate的必须的jar包.
project:Hibernate提供的工程
导入Hibernate jar包
hibernate3.jar
required,jpa 目录下的jar包
log4j slf4j.jar 日志记录的jar包
数据库驱动的jar包
创建实体类
无参数的public构造器
构建标识属性 映射数据表中的主键字段
提供get/set方法
使用基本数据类型的包装类型
不使用final修饰(无法继承 无法生成代理对象)
创建ORM映射文件
实体类名称.hbm.xml
引入约束 org.hibernate.hibernate-mapping-3.0.dtd
<hibernate-mapping> 类与表的映射
<class name=""table=" "> class 实体类名称 table 表名称
<id name=" " column=" "> id 配置唯一标识
<generator class="native"> 主键生成策略
主键生成策略 尽量使用代理主键(起标识作用)而不使用自然主键(表属性作为主键)
increment 自动增长 short int long hibernate提供的自动增长策略 多线程下会产生问题
identity 自动增长short int long 不适合oracle数据库
sequence 应用在oracle数据库上
native 本地策略 底层数据库不同 自动使用identity 或者 sequence
uuid string 使用随机字符串
assigned hibernate本身不维护主键 由程序生成
foregin 外来主键(应用于 多表 一对一的情况)
</id>
配置复合主键 <composite-id>
<property name=" "column=" "type=" "> 映射类 name为类中的属性名称 column为表中字段名称 type属性表示类型
type有 java类型(java.lang.String string sql类型 )
配置表之间的关联关系
<many to one> <one to one>
配置预定义sql 会直接执行的sql语句
<query name="findAll"> </query>
<sql-query name="sqlFindAll">select * from customer</sql-query>
</hibernate-mapping>
创建核心配置文件
src下的 hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver</property> 数据库驱动
<property name="hibernate.connection.url"> </property> 数据库url
<property name="hibernate.connection.username"></property> 数据库用户名
<property name="hibernate.connection.password"><property>数据库密码
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> hibernate方言 操作数据库的语言 生成MySql
<property name="hibernate.show_sql">true</property> 是否在控制台上显示SQL
<property name="hibernate.format_sql">true</property> 格式化输出SQL
<property name="hibernate.connection.autocommit">true</property> 事务是否自动提交
<property name="hibernate.hbm2ddl.auto"></property> 数据库ddl策略
用于测试的 create 每次执行时 创建新表(如果存在 将该表删除 重新创建) create-drop 每次执行时 创建新表 程序执行后 删除该表
update 不存在该表 创建 存在该表 更新 validate 校验映射文件与表中字段是否一致 不一致报错
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>在hibernate中使用c3p0连接池
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">20</property>
<property name=" c3p0,timeout">20</property>
<property name="c3p0.idle_test_period">3000</property>每3000秒检查所有连接池的空闲连接
<mapping resource=" "/> 需要加载的映射文件
<session-factory>
</hibernate-configuration>
编写测试类
Configuration configuration=new Configuration().configure(); 记载核心配置文件(包含数据库连接信息)
SessionFactory sessionFactory=configuration.buildSessionFactory(); 创建sessionFactory对象
Session session=sessionFactory.openSession(); 创建Session对象
Transaction tx=session.beginTransaction();创建事务(事务默认不自动提交)
Customer customer=new Customer();
customer.setName(" "); customer.setAge(25);
session.save(customer); 插入记录
tx.commit(); 事务提交
session.close(); 释放资源
sessionFactory.close();
CRUD操作 (Create Retrieve Update Delete)
保存记录 session. session.save(customer);
根据主键进行查询
Customer customer=(Customer) session.get(Customer.class,1); 1为主键id值 使用get方法 返回真实对象 立即执行sql语句 不存在该数据会产生NullPointerException
Customer customer=(Customer) session.load(Customer.class,1); 1为主键id值 使用load方法 返回代理对象 lazy load 真正使用该对象时 才会执行sql语句 不存在该数据会产生ObjectNotFoundException
查询所有
HQL(Hibernate Query Language) Query query=session.createQuery("from Customer where name= ? ");
QBC(Query By Criteria 条件查询) Criteria criteria=session.createCriteria(Customer.class);
criteria.add(Restrictions.eq("name","demo")) ; //查询条件 List<Customer> list=criteria.list();
SQL SQLuery query=session.createSQLQuery("select * from customer");
query.addEntity(Customer.class); //封装成Customer对象
List<Customer> list=query.list();
修改操作
手动构造后修改 Customer customer=new Customer(); customer.setAge(20); session.update(customer); 如果没有设置属性,将会存入默认值 因而数据最好为包装类型 默认值为null
查询后修改 Customer customer=(Customer) session.get(Customer.class,1); customer.seAge(10); session.update(customer);
删除记录
手动构造后删除 Customer customer=new Customer(); customer.setId(2); session.delete(customer);
查询后删除 Customer customer=(Customer)session.get(Customer.class,1); session.delete(customer);
核心对象
Configuration:负载管理 hibernate的配置信息
加载过程 Configuration configuration=new Configuration().configure();
SessionFactory:线程安全的 保存着当前数据库配置信息、映射关系和预定义的sql语句 维护连接池 负责维护Hibernate的二级缓存
一个应用中只需要一个sessionFactory
Session:应用程序与数据库之间交互操作的单线程对象 相当于jdbc中的Connection 是hibernate运作的核心 线程不安全 负责维护Hibernate的一级缓存
所有的持久化操作都要在session的管理下才能进行
save() update() delete() get()/load() saveOrUpdate() createQuery() createSQLQuery() createCriteria()
Transaction: commit() 提交相关联的session实体对象 rollback() 撤销事务操作 wasCommit()判断事务是否提交 如果没有开启事务 那么每个session的操作 都相当于一个独立的事务
Query:查询操作的对象
Criteria:条件查询操作的对象