(1)写SQL语句有什么不好
1.不同的数据库使用的SQL语法不同。比如PL/SQL与T/SQL
2.同样的功能在不同的数据库中有不同的实现方式。比分页SQL
3.程序过分依赖SQL对程序的移植及扩展,维护等带来很大的麻烦
(2)Hibernate介绍:
Java领域的一款开源的ORM框架技术
是对JDBC进行了非常轻量级的对象封装(本质上还是通过JDBC访问数据库)
其他主流的ORM框架技术:
1.MyBatis:前身就是著名的iBatis
2.Toplink:后被Oracle收购,并重新包装为Oracle As TopLink
3.EJB:本身是JAVAEE的规范(较复杂,使用较少)
(3)编写JavaBean的原则:
1.共有的类,如public class Student{}
2.提供公有的不带参数的默认的构造方法
3.属性私有
4.属性setter/getter方法
(4)使用Junit进行测试
@Test:测试方法
@Before:初始化方法
@After:释放资源
(5)hibernate.cfg.xml的常用配置
hibernate.show_sql:是否把Hibernate运行时的SQL语句输出到控制台,编码阶段便于测试
hibernate.format_sql:输出到控制台的SQL语句是否进行排版,便于阅读。建议设置为true
hbm2ddl.auto:这个是生成表结构的策略。有create|update|create-drop|validate,其中:
create:每次生成新的表结构,会删除原表,创建新表
update:在原有的表基础生进行更新,能保持原有的测试数据
create-drop:表示生成策略是先创建再删除
validate:对原有的表进行验证,如果现有的表结构与原有的表不同则不会创建表结构
hibernate.default_schema:就是默认的数据库的前缀,所有的表名都会加上这个数据库前缀
hibernate.dialect:配置数据库方言,Hibernate可针对特殊的数据库进行优化
注意:以上属性的hibernate前缀可以省略不写,比如hibernate.dialect等同于dialect
(6)hibernate执行流程
1.首先创建一个配置对象,即Configuration对象。它的作用是读取Hibernate.cfg.xml配置文档。还有获得
Configuration对象的目的是可以用它创建SessionFactory对象
2.创建SessionFactory对象的时候,会读取相应的里面加载的这些对象关系映射文件XXX.hbm.xml。获得
SessionFactory对象后,就可以创建Session对象
这里要注意的是创建和销毁都相当耗费资源,通常一个系统内一个数据库只创建一个SessionFactory对象
3.这个Session对象类似于JDBC中的Connection。那么获得了一个Session对象就表示获得了一个数据库连接对象,
然后就可以执行这个Session对象相应的方法(如增删改查)
这里要注意的是执行Session对象的某个方法时,必须要开启一个事务Transaction。也就是说这个方法必须要
封装在事务中。在执行完这些方法后,必须要先提交这个事务tx.commit(),然后关闭session,即session.close()
关于session的一些说明:
1.Hibernate是对JDBC的一个封装,它不建议直接使用JDBC的connection操作数据库,而是通过使用session操作数据库
2.session可以理解为操作数据库的对象,那么在使用Hibernate操作数据库之前,必须要先获得一个session实例
3.session与JDBC的connection是多对一的关系,每个session都有一个与之对应的connection,一个connection不同时 刻可以供多个session使用
4.把对象保存在关系数据库中需要调用session的各种方法,比如:save() update() delete() createQuery()
(7)transaction说明
Hibernate对数据的操作都是封装在事务当中,并且默认是非自动提交的方式。所以用session保存对象时,如果
不开启事务,并且手工提交事务,对象并不会真正保存在数据库中
如果想让hibernate像jdbc那样自动提交事务,必须查删增改前调用session对象的doWork()方法,获得jdbc的 connection后, 设置其为自动
提交事务模式 (还得在查删增改后刷新以下,调用session.flush())
(8)session说明
如何获得session对象, Session session =sessionFactory.openSession()
1.利用openSession
2.利用getCurrentSession
使用getCurrentSession需要hibernate.cfg.xml文件中进行配置,分为两种情况
<property name="hibernate.current_session_context_class">XXXX</property>
如果是本地事务(jdbc事务),则XXXX填 thread
如果是全局事务(jta事务),则XXXX填 jta
openSession与getCurrentSession的区别:
1.getCurrentSession在事务提交或者回滚之后会自动关闭,而openSession需要你手动关闭。如果使用
openSession而没有手动关闭,每次都会占用一个connection连接对象,多次之后会导致连接池溢出
2.openSession每次创建的都是新的session对象,而getCurrentSession使用现有的session对象
(9)单一主键
assigned:由java应用程序负责生成(手工赋值)
native: 由底层数据库自动生成标识符,如果是MySQL就是increment,如果是Oracle就是sequence
这时候就算手工赋值了也不起作用的
(10)基本类型
Hibernate映射类型 Java类型 标准SQL类型
见截图 -> 对象类型
其中 binary 对应数组类型
text 对应大文本类型
clob 对应大文本类型
blob 对应二进制数据类型,比如音频、视频、图片
MySQL不支持标准SQL的clob类型。在MySQL中,用text、mediumtext及longtext类型来表示长度超过255的长文本数据
(12)组件属性 : 指的是实体类中的某个属性 属于 用户自定义的类的对象,这个属性叫组件属性
这样配置: <component name="address" class="Address">
<property name="postcode" column="POSTCODE"></property>
<property name="phone" column="PHONE"></property>
</component>
(13)get和load方法的区别:
1.在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql语句,返回持久化对象
load方法会在调用后返回一个代理对象,该代理对象只保存了实体对象的主键属性id,直到使用对象的
非主键属性时才会发出sql语句
2.get与load的区别
查询数据库中不存在的数据时,get方法返回null,而load方法抛出 异常org.hibernate.ObjectNotFoundException
(14)Hibernate开发的基本步骤
1.编写配置文档hibernate.cfg.xml
2.编写实体类
3.生成实体类的映射文件并添加到配置文档中
4.调用Hibernate API进行测试
1.不同的数据库使用的SQL语法不同。比如PL/SQL与T/SQL
2.同样的功能在不同的数据库中有不同的实现方式。比分页SQL
3.程序过分依赖SQL对程序的移植及扩展,维护等带来很大的麻烦
(2)Hibernate介绍:
Java领域的一款开源的ORM框架技术
是对JDBC进行了非常轻量级的对象封装(本质上还是通过JDBC访问数据库)
其他主流的ORM框架技术:
1.MyBatis:前身就是著名的iBatis
2.Toplink:后被Oracle收购,并重新包装为Oracle As TopLink
3.EJB:本身是JAVAEE的规范(较复杂,使用较少)
(3)编写JavaBean的原则:
1.共有的类,如public class Student{}
2.提供公有的不带参数的默认的构造方法
3.属性私有
4.属性setter/getter方法
(4)使用Junit进行测试
@Test:测试方法
@Before:初始化方法
@After:释放资源
(5)hibernate.cfg.xml的常用配置
hibernate.show_sql:是否把Hibernate运行时的SQL语句输出到控制台,编码阶段便于测试
hibernate.format_sql:输出到控制台的SQL语句是否进行排版,便于阅读。建议设置为true
hbm2ddl.auto:这个是生成表结构的策略。有create|update|create-drop|validate,其中:
create:每次生成新的表结构,会删除原表,创建新表
update:在原有的表基础生进行更新,能保持原有的测试数据
create-drop:表示生成策略是先创建再删除
validate:对原有的表进行验证,如果现有的表结构与原有的表不同则不会创建表结构
hibernate.default_schema:就是默认的数据库的前缀,所有的表名都会加上这个数据库前缀
hibernate.dialect:配置数据库方言,Hibernate可针对特殊的数据库进行优化
注意:以上属性的hibernate前缀可以省略不写,比如hibernate.dialect等同于dialect
(6)hibernate执行流程
1.首先创建一个配置对象,即Configuration对象。它的作用是读取Hibernate.cfg.xml配置文档。还有获得
Configuration对象的目的是可以用它创建SessionFactory对象
2.创建SessionFactory对象的时候,会读取相应的里面加载的这些对象关系映射文件XXX.hbm.xml。获得
SessionFactory对象后,就可以创建Session对象
这里要注意的是创建和销毁都相当耗费资源,通常一个系统内一个数据库只创建一个SessionFactory对象
3.这个Session对象类似于JDBC中的Connection。那么获得了一个Session对象就表示获得了一个数据库连接对象,
然后就可以执行这个Session对象相应的方法(如增删改查)
这里要注意的是执行Session对象的某个方法时,必须要开启一个事务Transaction。也就是说这个方法必须要
封装在事务中。在执行完这些方法后,必须要先提交这个事务tx.commit(),然后关闭session,即session.close()
关于session的一些说明:
1.Hibernate是对JDBC的一个封装,它不建议直接使用JDBC的connection操作数据库,而是通过使用session操作数据库
2.session可以理解为操作数据库的对象,那么在使用Hibernate操作数据库之前,必须要先获得一个session实例
3.session与JDBC的connection是多对一的关系,每个session都有一个与之对应的connection,一个connection不同时 刻可以供多个session使用
4.把对象保存在关系数据库中需要调用session的各种方法,比如:save() update() delete() createQuery()
(7)transaction说明
Hibernate对数据的操作都是封装在事务当中,并且默认是非自动提交的方式。所以用session保存对象时,如果
不开启事务,并且手工提交事务,对象并不会真正保存在数据库中
如果想让hibernate像jdbc那样自动提交事务,必须查删增改前调用session对象的doWork()方法,获得jdbc的 connection后, 设置其为自动
提交事务模式 (还得在查删增改后刷新以下,调用session.flush())
(8)session说明
如何获得session对象, Session session =sessionFactory.openSession()
1.利用openSession
2.利用getCurrentSession
使用getCurrentSession需要hibernate.cfg.xml文件中进行配置,分为两种情况
<property name="hibernate.current_session_context_class">XXXX</property>
如果是本地事务(jdbc事务),则XXXX填 thread
如果是全局事务(jta事务),则XXXX填 jta
openSession与getCurrentSession的区别:
1.getCurrentSession在事务提交或者回滚之后会自动关闭,而openSession需要你手动关闭。如果使用
openSession而没有手动关闭,每次都会占用一个connection连接对象,多次之后会导致连接池溢出
2.openSession每次创建的都是新的session对象,而getCurrentSession使用现有的session对象
(9)单一主键
assigned:由java应用程序负责生成(手工赋值)
native: 由底层数据库自动生成标识符,如果是MySQL就是increment,如果是Oracle就是sequence
这时候就算手工赋值了也不起作用的
(10)基本类型
Hibernate映射类型 Java类型 标准SQL类型
见图 -> 基本类型
见截图 -> 对象类型
其中 binary 对应数组类型
text 对应大文本类型
clob 对应大文本类型
blob 对应二进制数据类型,比如音频、视频、图片
MySQL不支持标准SQL的clob类型。在MySQL中,用text、mediumtext及longtext类型来表示长度超过255的长文本数据
(12)组件属性 : 指的是实体类中的某个属性 属于 用户自定义的类的对象,这个属性叫组件属性
这样配置: <component name="address" class="Address">
<property name="postcode" column="POSTCODE"></property>
<property name="phone" column="PHONE"></property>
</component>
(13)get和load方法的区别:
1.在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql语句,返回持久化对象
load方法会在调用后返回一个代理对象,该代理对象只保存了实体对象的主键属性id,直到使用对象的
非主键属性时才会发出sql语句
2.get与load的区别
查询数据库中不存在的数据时,get方法返回null,而load方法抛出 异常org.hibernate.ObjectNotFoundException
(14)Hibernate开发的基本步骤
1.编写配置文档hibernate.cfg.xml
2.编写实体类
3.生成实体类的映射文件并添加到配置文档中
4.调用Hibernate API进行测试