Hibernate 4.x 再学习系列 1 ORM
1.持久化
狭义理解,持久化指把对象永久保存到数据库中.
广义理解: 持久化包括和数据库相关的各种操作
- 保存:把对象永久保存到数据库中。
- 更新:更新数据库中对象(记录)的状态。
- 删除:从数据库中删除一个对象。
- 查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。
- 加载:根据特定的OID,把一个对象从数据库加载到内存中
OID: 为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。
在关系数据库中称之为主键,而在对象术语中,则叫做对象标识(Object identifier,即OID).
2.ORM
ORM(Object/Relation Mapping): 对象/关系映射
3.Hibernate - 优秀的ORM框架
1).创建 Hibernate 配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 配置连接数据库的基本信息 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://192.168.75.134:3306/hibernate_test01</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">mysql</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 执行操作时是否在控制台打印出 SQL --> <property name="show_sql">true</property> <!-- 是否对 SQL 进行格式化 --> <property name="format_sql">true</property> <!-- 指定自动生成数据表的策略 --> <property name="hbm2ddl.auto">update</property> <!-- 设置Hibernate 的事务隔离级别为READ COMMITED,值2 --> <!-- <property name="hibernate.connection.isolation">2</property> --> <!-- 配置 C3P0 数据库连接池 --> <property name="hibernate.c3p0.max_size">10</property> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.acquire_increment">2</property> <property name="hibernate.c3p0.timeout">2000</property> <property name="hibernate.c3p0.idle_test_period">2000</property> <property name="hibernate.c3p0.max_statements">10</property> <!-- 设定JDBC的 Statement从数据库读取数据时每次读取的记录条数 --> <property name="hibernate.jdbc.fetch_size">100</property> <!-- 设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小 --> <property name="hibernate.jdbc.batch_size">30</property> <!-- 指定管理关联的hbm.xml文件--> <mapping resource="org/xtony/hibernate/entities/Worker.hbm.xml"/> </session-factory> </hibernate-configuration>
2).创建持久化 Java 类
- 提供一个无参的构造器: 使Hibernate可以使用Constructor.newInstance() 来实例化持久化类
- 提供一个标识属性(identifier property): 通常映射为数据库表的主键字段. 如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate()
- 为类的持久化类字段声明访问方法(get/set): Hibernate对JavaBeans 风格的属性实行持久化。
- 使用非 final 类: 在运行时生成代理是 Hibernate 的一个重要的功能. 如果持久化类没有实现任何接口, Hibnernate 使用 CGLIB 生成代理. 如果使用的是 final 类, 则无法生成CGLIB 代理.
- 重写 eqauls 和 hashCode 方法: 如果需要把持久化类的实例放到 Set 中(当需要进行关联映射时), 则应该重写这两个方法
Hibernate 不要求持久化类继承任何父类或实现接口,这可以保证代码不被污染。这就是Hibernate被称为低侵入式设计的原因
3). 创建对象关系映射文件(*.hbm.xml)
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2015-3-14 22:40:02 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="org.xtony.hibernate.entities.News" table="NEWS" dynamic-update="true"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="native" /> </id> <property name="title" type="java.lang.String"> <column name="TITLE" /> </property> <property name="author" type="java.lang.String"> <column name="AUTHOR" /> </property> <property name="date" type="java.util.Date"> <column name="DATE" /> </property> <!-- 配置派生属性值 --> <property name="desc" formula="(select concat(author,':',title) from NEWS n where n.ID = id)"></property> </class> </hibernate-mapping>
4).通过 Hibernate API 编写访问数据库的代码
public class HibernateTest { @Test public void test() { //1.创建一个SessionFactory对象 SessionFactory sessionFactory = null; //1.1)创建一个Configuration对象: 对应hibernate的基本配置信息和对象映射信息 Configuration configuration = new Configuration().configure(); //4.0之前这样创建 // sessionFactory = configuration.buildSessionFactory(); // 创建一个ServiceRegistry对象: hibernate4.x 新添加的对象,hibernate的任何配置和服务都要在该对象注册后才能有效 StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); //2.创建一个Session对象 Session session = sessionFactory.openSession(); //3.开启事务 Transaction transaction = session.beginTransaction(); //4.执行保存操作 News news = new News("Java", "atguigu", new Date(new java.util.Date().getTime())); session.save(news); //5.提交事务 transaction.commit(); //6.关闭Sessioin session.close(); //6.关闭SessionFactory sessionFactory.close(); } }
Copyright@Xtony 欢迎大家扩散共享学习,但请注明出处
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步