Hibernate ORM框架——第一章:Hibernate简介与操作基础
一、相关使用工具的下载与导入(环境配置)
hibernate-release-4.2.21.Final-->旧版本
hibernate-release-5.2.10.Final-->新版本
首先需要解压:hibernate-release-5.2.10.Final(新版本)
-->把解压后的 hibernate-release-5.2.10.Final文件夹里的 lib文件夹里的required文件夹里的所有jar包复制到根项目下的lib文件夹里,包括JDBC的ojdbc6.jar包
-->把所有的jar包变成牛奶瓶
解压:hibernate-tutorials文件:可以从这个文件中找到:basic--一直点进去
直到看到java和resources的文件,再依据需求来选择要那个文件里面的xml头文件
-->hibernate.cfg.xml(配置文件的头文件)
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
-->EmpMapping.xml(映射文件的头文件)
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
二、第一个Hibernate添加操作
1)使用PL/SQL数据库
2)第一个类比原生的JDBC实现添加操作:(不需要封装util包)
注意:此代码是必须先在数据库中创建所需要的表
2.1)类比jave原生的JDBC实现添加操作
1.1 util包-->DbUtils.java:连接数据库驱动
package utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DbUtils { private static final String url = "jdbc:oracle:thin:@localhost:1521:orcl"; private static final String username = "myuser"; private static final String password = "123"; public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, username, password); } public static void closeConnection(Connection conn) throws SQLException { conn.close(); } }
1.2 写实体对象
package entity; public class TestEntity { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
1.3 写dao包
package dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import entity.TestEntity; import utils.DbUtils; public class TestDao { public void insert(String name) throws SQLException{ Connection conn = DbUtils.getConnection(); String sql = "insert into mytable values(?)"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, name); ps.executeUpdate(); } public List<TestEntity> getAll() throws Exception { List<TestEntity> result = new ArrayList<TestEntity>(); Connection conn = DbUtils.getConnection(); String sql = "select * from mytable"; PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); while(rs.next()){ TestEntity entity = new TestEntity(); entity.setName(rs.getString(1)); result.add(entity); } return result; } }
1.4 写test测试包
package yuanMain; import java.util.List; import dao.TestDao; import entity.TestEntity; public class YuanMain { public static void main(String[] args) throws Exception { /*仿照以前JDBC添加和查询数据库的操作*/ /*添加*/ TestDao testdao = new TestDao(); //testdao.insert("xxttt"); /*查询*/ List<TestEntity> all = testdao.getAll(); System.out.println(all.size()); for (TestEntity testEntity : all) { System.out.println(testEntity.getName()); } } }
3)第一个hibernate实现添加操作代码(优化上面的类比java的代码)
3.1 -->先把解压后的 hibernate-release-5.2.10.Final文件夹里的 lib文件夹里的所有jar包复制到根项目下的lib文件夹里,包括JDBC的ojdbc6.jar包
-->把所有的jar包变成牛奶瓶
项目结构:
3.2 写代码:
配置文件
<?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> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <property name="connection.username">myuser</property> <property name="connection.password">123</property> <!-- 在添加数据时可选hbm2ddl.auto。在查询时,可以不用:避免唯一约束的冲突 --> <!-- 根据schema在PL/SQL中自动创建数据表的工具 --> <!-- <property name="hbm2ddl.auto">create</property> --> <!-- 生成优化的SQL --> <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property> <!-- 显示hibernate生成的sql语句 --> <property name="show_sql">true</property> <!-- 显示格式化的SQL语句:优化排版 --> <property name="format_sql">true</property> <!-- 数据表映射配置文件 --> <mapping resource="com/nf/Personer.xml"></mapping> </session-factory> </hibernate-configuration>
实体对象:
package com.nf; public class Personer { private long pid; private String pname; public long getPid() { return pid; } public void setPid(long pid) { this.pid = pid; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } }
实体映射文件
<?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-mapping package="com.nf"> <class name="Personer" table="Personers"> <id name="pid" column="id"> <!-- 标识主键:increment/native自动增长、assigned自己输入 --> <generator class="increment"></generator> </id> <property name="pname"></property> </class> </hibernate-mapping>
测试类
package com.nf; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; public class Main { public static void main(String[] args) { StandardServiceRegistry registry = new StandardServiceRegistryBuilder() .configure().build(); SessionFactory sf = new MetadataSources(registry) .buildMetadata().buildSessionFactory(); Session s = sf.openSession(); Personer ps = new Personer(); ps.setPname("xxx"); /*ps.setPname("试试");*/ Transaction ts = s.beginTransaction(); s.save(ps); ts.commit(); s.close(); sf.close(); } }
三、hibernate的工作原理
1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息
3.通过config.buildSessionFactory();//创建SessionFactory
4.sessionFactory.openSession();//打开Sesssion
5.session.beginTransaction();//创建事务Transation
6.persistent operate持久化操作
7.session.getTransaction().commit();//提交事务
8.关闭Session
9.关闭SesstionFactory
为什么要使用hibernate:
1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
/*以上个人整理笔记,如果有误或者有不懂的地方,欢迎评论与指出*/