1. Hibernate概念
1.1. 对象持久化 1.1.1. 什么是持久化? 持久化就是将数据同步保存到数据库或某些存储设备中。 1.1.2. 持久化层 持久化层就是与持久存储设备交互的逻辑层,如在数据库中对数据库的增加、删除、查找和修改操作就由持久化层来处理 1.1.3. 持久化机制 1. JDBC调用 2.自家的O/R mapping 3.专门的O/R mapping技术(Hibernate,iBatis,topLink)
2. JDBC之炀
2.1. JDBC调用面临的问题 2.1.1. 烦琐的代码
String insertSql = "insert into books (author,title,publish,price) values(?,?,?,?)"; Connection con = DBConnection.getConnection(); PreparedStatement prst = con.prepareStatement(insertSql); prst.setString(1, book.getAuthor()); prst.setString(2, book.getTitle()); prst.setString(3, book.getPublish()); prst.setDouble(4, book.getPrice()); int count = prst.executeUpdate(); prst.close(); con.close(); session.save(book);
2.1.2. 多表连接时,过于复杂
2.1.3. 表间级联的问题
如上例中要删除一个部门时级联删除员工,或者级联取得某个部门的所有员工的职位信息
2.1.4. 层与层之间的严重耦合
2.1.4.1. 编写持久层的人必须熟悉底层数据表结构、熟悉SQL 2.1.4.2. 表的变动将带来程序的大量修改 2.1.4.3. 持久存储层(数据库)的变换将导致数据访问层的大量变化
3. O-R映射(mapping)
3.1. O-R映射(mapping)
O/R Mapping就是对象到关系的映射,它把对表直接进行的操作变成对持久化对象的操作,如: session.get(UserVO.class, userid); //查找某个用户 session.update(uservo); //修改用户
3.2. 使用ORM
3.2.1. O/R Mapping就是对象到关系的映射,它把对表直接进行的操作变成对持久化对象属性和方法的操作
3.2.1.1. 如果得到了department对象可以: 通过department.getEmployees() 得到该部门的所有员工 3.2.1.2. 如果得到了员工对象,可以: 通过emp.getDepartment() 得到部门对象 通过emp.getDepartment().getDeptName() 得到所在部门名称
4. 开启开始Hibernate之旅
4.1. 下载安装Hibernate
将下载包解压后将Hibernate3.jar和lib目录下的包拷到/WEB-INF/lib下
4.2. 注册登陆实例
4.2.1. 规划 4.2.1.1. 值对象 4.2.1.2. 业务处理类
4.3. 编写ValueObject
4.3.1. 用于在Web层和业务层之间传输数据,避免使框架组件渗透到业务组件
public class UserVO implements Serializable{ private int oid; private String userName; private String password; private String email; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } ………
4.4. 实体-关系(O-R)映射文件
4.4.1. 实体-关系(O-R)映射文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name=“login.service.UserVO” table=“Account”> <id name="oid" column="userid" unsaved-value=“0"> <generator class="native" /> </id> <property name="userName" column="loginName" type="string" /> <property name="password" type="string" /> <property name="email" type="string" /> </class> </hibernate-mapping>
4.5. Hibernate全局配置文件
4.5.1. Hibernate全局配置文件: 4.5.1.1. 是Hibernate程序必不可少的文件 4.5.1.2. 文件名通常为hibernate.cfg.xml,放在CLASSPATH下 4.5.1.3. 配置数据库连接属性(驱动、URL … ) 4.5.1.4. 指定所有的mapping文件 4.5.1.5. hibernate.cfg.xml
<?xml version=‘1.0‘ encoding=‘utf-8‘?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory > <property name="show_sql">true</property> <property name="connection.driver_class"> com.microsoft.jdbc.sqlserver.SQLServerDriver </property> <property name="connection.url"> jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=study </property> <property name="connection.username">sa</property> <property name="connection.password">123</property> <property name="dialect"> org.hibernate.dialect.SQLServerDialect </property> <mapping resource="Account.hbm.xml" /> </session-factory> </hibernate-configuration>
4.6. Hibernate程序包含文件
5. 编写步骤
5.1. 定义数据库表结构(Account表) 5.2. 编写实体类(值对象UserVO.java) 5.3. 编写实体-关系mapping文件(Account.hbm.xml) 5.4. 编写Hibernate全局配置文件,将映射文件加入 5.5. 编写数据库访问类(UserService_HBN.java) 5.6. 编写Action、ActionForm、JSP 5.7. 示例
5.7.1. 编写数据库访问对象
//导入Hiberenate包,在org.hibernate.*下 public class UserService_HBN { private SessionFactory sessionFactory = null; public UserService_HBN() { sessionFactory = new Configuration().configure().buildSessionFactory(); } public void save(UserVO user) { Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); session.save(user); tx.commit(); session.close(); }
5.7.2.查找所有用户
public boolean findAllUser() { User u = null; Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); Query query = session.createQuery("from UserVO"); List users = query.list(); tx.commit(); session.close(); return users; }
5.7.3.判断用户是否合法
public boolean checkUser(UserVO user) { User u = null; Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); Query query = session.createQuery("from UserVO u where u.userName=? and u.password=?"); query.setString(0, user.getLoginName()); query.setString(1,user.getPassword()); UserVO user = (UserVO)query.uniqResult(); //必须保证结果唯一 tx.commit(); session.close(); if (user != null ) { return true; } return false; }
5.7.4.操纵实体对象
5.7.4.1. 修改实体对象
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); session.update(user); tx.commit(); session.close();
5.7.4.2. 删除实体对象
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); session.delete(user); tx.commit(); session.close();
6. 小结
6.1. 使用Hibernate与通常的JDBC编程的区别 6.1.1. Hibernate程序的组成 6.1.2. Hibernate程序的编写步骤 6.1.3. Hibernate操纵实体对象 6.1.3.1. 查询: query.list(), query.uniqResult() 6.1.3.2. 保存: session.save(obj) 6.1.3.3. 修改: session.update(obj) 6.1.3.4. 删除: session.delete(obj)
原文:https://www.cnblogs.com/xkjlive/p/10482434.html