什么是ORM?
ORM:对象关系映射,可以使面向对象程序员在项目当中尽量少些底层的sql语句。
Hibernate开发的基本步骤
1 编写配置文档hibernate.cfg.xml
2 编写实体类
3 生成与实体类对应的映射文件ClassName.hbm.xml,把映射文件加入到配置文档中
4 调用Hibernate API进行测试
Hibernate程序执行流程
配置文件的详解
常见属性名称 | 含义 |
---|---|
hbm2ddl.auto | 生成表结构策略。常见有create和update |
hibernate.show_sql | 是否打印sql语句到控制台 |
hibernate.format_sql | 输出时格式化sql语句 |
hibernate.dialect | 配置数据库方言 |
hibernate前缀可以不写
映射文件的详解
1 < class name=”” table=”” batch-size=”“>标签:name是映射的类名,table是对应的表名,batch-size是抓取策略(表示一次抓取记录条数)
2 < id name=”” type=”” >标签:name是映射的变量名,type是hibernate的数据类型,见下。
< column name=”“>标签:数据库中的列名
< generator class=”” >标签:主键增长策略,mysql中 native依赖数据库,assigned依赖java程序
3 < property name=”” type=”” not-null=”true”>
< column name=”“>标签:数据库中的列名
session的详解
hibernate不建议直接通过jdbc中的connection操作数据库,而是通过session操作数据库,可以简单理解为一个操作数据库的对象,常用的save(),delete(),update(),get()/load()
获得session的方法
1 openSession() 多次获取的session不是同一个对象,不会自动关闭
2 getCurrentSession() 单例模式,所有获得的session都是同一个,会自动关闭
如果使用,在配置文件中配置hibernate.current_session_context_class
时间类型的区别
对象类型的区别
[学习慕课网视频]
[ 配置文件模版 ]
<?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="connection.url">
jdbc:mysql://localhost:3306/news
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- hibernate方言,指定使用的是那个数据库 -->
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.format_sql">false</property>
<!-- c3p0连接池设置 -->
<!-- 指定连接池里最大连接数 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 指定连接池里最小连接数 -->
<property name="hibernate.c3p0.min_size">1</property>
<!-- 指定连接池里连接的超时时长 单位S -->
<property name="hibernate.c3p0.timeout">5000</property>
<!-- 指定连接池里最大缓存多少个Statement对象 -->
<property name="hibernate.c3p0.max_statements">100</property>
<!--表示连接池检测线程多长时间检测一次池内的所有链接对象是否超时. 连接池本身不会把自己从连接池中移除,而是专门有一个线程按照一定的时间间隔来做这件事,这个线程通过比较连接对象最后一次被使用时间和当前时间的时间差来和
timeout 做对比,进而决定是否销毁这个连接对象 -->
<property name="hibernate.c3p0.idle_test_period">3000</property>
<!--当数据库连接池中的连接耗尽时, 同一时刻获取多少个数据库连接 秒 -->
<property name="hibernate.c3p0.acquire_increment">2</property>
<mapping resource="com/oracle/test/hibernate/bean/NewsBean.hbm.xml" />
<mapping resource="com/oracle/test/hibernate/bean/NewsCatagoryBean.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>
<!--name是javaBean的完全限定名, table是该javaBean对应的数据库表名称 -->
<class name="com.oracle.test.hibernate.bean.NewsBean" table="news">
<!-- name对应实体类的属性id -->
<id name="id" type="integer">
<!-- 数据表里列名称 -->
<column name="id"></column>
<!--主键的生成策略 native可以适应多种数据库 increment mysql自动增长策略 sequence oracle自动增长策略 -->
<generator class="native"></generator>
</id>
<property name="title" type="string" not-null="true">
<column name="title"></column>
</property>
<property name="content" type="string">
<column name="content"></column>
</property>
<property name="createDate" type="date">
<column name="create_date"></column>
</property>
</class>
</hibernate-mapping>
[ 创建SessionFactory模版 ]
Configuration config = new Configuration().configure();
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(config.getProperties()).build();
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);