JEE_Hibernate
SSH2整合流程:
client--request--->app Server--dofilter--->Struts2--Action--business---> Service--->DAO--use--->model--persistence--->DB. [ Spring贯穿 ].
//
Hibernate问题集锦:
1.无法找到类: 导包错误(hibernate包 + sql包)
2.是否有注册映射文件到配置文件中--匹配
3.数据库表结构字段与持久类变量--命名严格规范
4.持久化类中变量提供完整的get.set方法
5.ID字段为null,insert失败: 数据库自增式ID字段设置为标识列
6.Hibernate不提交事务,数据库中的表也会变化---->查看数据库表的引擎(MySQL--InnoDB)
//ORM
ORM对象关系映射:Object Relational Mapping,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
ORM是通过使用描述对象和数据库直接映射的元数据,将Java程序中的对象自动持久化到关系数据库中(映射)。
对象关系映射一般是以中间件的形式存在,本质上就是将数据从一种形式转换到另一种形式。
对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据.
目前流行的ORM框架较多: Hibernate, iBatis, JDO,微软的ObjectSpaces, DevExpress公司的XPO等.
---->O/R Mapping Frameworks框架:
Hibernate, Toplink, Jdo, IBatis, JPA(接口)
//
Hibernate:对JDBC进行轻量级的封装。
功能作用: 面向关系的SQL ---ORM对象关系映射----->面向对象。
//第一个Java_XML版本的Hibernate程序:
导包 + 建表,字段:id,username,password(设置id为标识列,自增长)

<?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> <session-factory > <!-- 显示实际操作数据库时的SQL --> <property name="show_sql">true</property> <!-- SQL方言 --> <property name="dialect">org.hibernate.dialect.SQLServerDialect</property> <!-- JDBC驱动程式 --> <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> <!-- JDBC URL --> <property name="connection.url">jdbc:sqlserver://localhost:1433;DatabaseName=test</property> <!-- 用户名 --> <property name="connection.username">sa</property> <!-- 密码--> <property name="connection.password"></property> <!-- 映射文件 --> <mapping resource="mao/h/User.hbm.xml"/> </session-factory> </hibernate-configuration>

<?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 package="mao.h"> <class name="User" table="userTable"> <id name="id" column="id"> <generator class="identity"></generator> <!-- --> </id> <property name="username" /> <property name="password" /> </class> </hibernate-mapping>

============User.java package mao.h; public class User { private int id; private String username; private String password; //get.set方法 } =============UserTest.java package mao.h; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class UserTest { public static void main(String[] args) { Configuration cfg = new Configuration(); SessionFactory sessionFactory = cfg.configure().buildSessionFactory(); Session session = sessionFactory.openSession(); System.out.println("创建Session"); session.beginTransaction(); User user = new User(); //user.setId(1); user.setUsername("mao"); user.setPassword("123"); System.out.println("username---------->" + user.getUsername()); System.out.println("ID---------->" + user.getId()); session.save(user); System.out.println("持久化类"); System.out.println("ID---------->" + user.getId()); session.getTransaction().commit(); session.close(); sessionFactory.close(); } }
1)Hibernate导包:
下载: "hibernate-distribution-3.6.10.Final.jar", 里面包含所需的包和中文帮助文档.
添加用户JAR包文件: Preferences---Java---BuildPath---User Libraries---New **---Add JARs...
项目中导入: 右键---Build Path---Add Library---User Library---***...
导入方式二: 右键---Build Path---Add External Archives...
Hibernate3所需的包: hibernate3.jar + lib/required/* + lib/jpa/* + slf4j-nop-1.6.1.jar日志文件.
2)SQLServer数据库驱动包:
1.4.0版 sqljdbc4.jar
2.3个包: msbase.jar + mssqlserver.jar + msutil.jar.
3.jtds: jtds-1.2.2.jar
3)数据库中建表,讲id字段设为标识列自增长.(不然会出现id列为NULL,insert失败)
4)持久化类: model字段实体类User.java
配置文件: hibernate.cfg.xml(最好是直接从Demo例子中copy改)
映射文件: User.hbm.xml(设置字段映射, 再关联到配置文件中)
测试类: 采用Main()方法测试 || 采用JUnit单元测试工具测试.
==================================================================================
//
Hibernate常用接口:
1.Configuration接口,负责管理Hibernate的配置信息.
Configuration cfg = new Configuration().configure();
2.SessionFactory接口,负责创建Session实例,可以通过Configuration实例构建SessionFactory.
SessionFactory保存了对应当前数据库配置的所有映射关系,是线程安全的,多个线程可并发调用.
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
3.Session接口,Hibernate持久化操作的基础,提供了CUED方法
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
4.Transaction接口,对实际事务实现的一个抽象.
session.beginTransaction();
5.Query接口,用于执行HQL语句
1)
//HQL语句中的"?":
1.....where user.name = ? || xxx.setString(0, name);
2.....where user.name:name || xxx.setString("name", name);
其中,setXxx()方法可以有: setString(), setInt(), setParameter()
2)
Query中的list()方法:
List list = query.list(); //其中,List是集合, list()是方法
//---------Hibernate的映射机制
//
主键映射:
(单个主键,复合主键; 自然主键,代理主键)
1.
主键ID的生成规则: <generator>标签是<id>标签的子标签,用来指定主键的生成方式.
assigned: 程序得自行为主键ID赋值,一般应用于自然主键(如:学号)
native: 由数据库对ID赋值, 最常见的是int型的自增型主键.(如:identity,若在SQL中要先设置主键为标识列)
identity: 自增主键生成方式(若在SQL中要先设置主键为标识列)
foreign: 使用外部表字段作为主键(如:外键)
......
2.
复合自然主键的映射
1)单独定义主键类
2)不单独定义主键类
//
Hibernate数据类型映射:
数据类型间的转换: Java类型----Hibernate数据类型----标准SQL类型
//
Hibernate的对象关系映射:
1.
继承关系映射:
1)每个子类一个数据表
2)每个类一个数据表
3)共享一个数据库表
2.
关联关系映射:
1)一对一关联: 共享主键方式, 唯一外键方式
2)多对一单向关联
3)一对多双向关联
4)多对多关联: 多对多单向关联, 多对多双向关联
//
动态类的使用:
一般的,我们使用Java代码来写POJO类作为对象模型,Hibernate3提供了一种新特征,可以在xml文件中直接表示这些持久化类实体.
这样,程序员可以不用写持久化类,只需要创建和维护映射文件就可以了.
//--------------Hibernate对持久化对象的操作
Hibernate把数据库中的表映射成Java的持久化类,使得程序员直接操作持久化类而不用操作数据即可完成对数据库的CRUD操作.
前面介绍Hibernate如何实现类的属性与表的字段之间的映射关系,接下来介绍对持久化类的操作.
//
Session的常用方法:
1)save()方法
2)get()和load()方法
3)delete()方法
4)update()方法
5)saveOrUpdate()方法
//
HQL查询:
HQL,Hibernate Query Language,是一种面向对象的查询语言,操作对象是类.
1)基本查询
2)条件查询
3)分页查询
4)连接查询
5)子查询
----Hibernate还支持原生态的SQL查询: SQL Query接口
1)setFirstResult()
2)setMaxResult()
3)list()
4)addEntity()
5)addScalar()
----绕过Hibernate直接用JDBC查询
//
Hibernate的批量操作:
1.批量插入
2.批量更新
3.批量删除
//
持久对象的生命周期:
1)瞬时态transient:
2)持久态persisent:
3)脱管状态detached:
//------------------Hibernate的高级特性
//Hibernate的事务管理:
1.基于JDBC的事务管理:
2.基于JTA的事务管理
//Hibernate的并发处理:
//Hibernate的拦截器:
=============================================================