为什么要使用hibernate,jdbc+dbutils不是挺好的吗?
1、回顾一下jdbc和dbutils
2、Hibernate的优势
Hibernate的世界
一.Hibernate开发环境的搭建
1.jar包的导入
1.(必须的jar包)数据库驱动包(一个):
------mysql-connector-java-5.1.7-bin.jar
毕竟Hibernate是基于jdbc编程,怎么能缺少数据库驱动包呢!
作用:
-first .连接数据库
-second .Sun公司提供操作数据库接口的实现都在驱动包内---我们在jdbc编程中虽然导入的jar包都是sun公司的jar包(即我们jre环境中的jar包),但是我们仅仅是需要这些jar包中的接口的引用(Connetcion接口,Statement接口、ResultSet接口),真正的实现类都在驱动包内,例如(Driver类(此类jre中没有,jre中只有DriverManager注册驱动)、Connerction接口的实现类、Statement接口的实现类以及ResultSet的实现类)。而这个驱动包是各个数据库厂商提供的,sun公司只提供规范(接口)。这样方便我们哦。
2.(非必须jar包)日志记录包(三个)+Log4J.properties配置文件:
------log4j-1.2.16.jar
------slf4j-api-1.6.1.jar
------slf4j-log4j12-1.7.2.jar
------log4j.properties
作用:打印出hibernate相关操作日志-例如Hibernate使用的是哪个数据库,使用说明连接池,读书.xml还是.properties文件。日志包会将这些信息都打印出来,方便维护人员观看。
(注意了:hibernate的sql语句并不是日志包起的作用,而是在hibernate.cfg.xml主配置稳进中配置了显示sql)
3.(必须的jar包)Hibernate开发包(9个)
4.(非必须jar包)Hibernate使用c3p0连接池(3个)
------c3p0-0.9.2.1.jar c3p0的jar包
------hibernate-c3p0-5.0.7.Final.jar Hibernate对c3p0的包装吧
------mchange-commons-java-0.2.3.4.jar 协调二者
注意:使用c3p0连接池的时候,我们需要配上一个c3p0.xml(src目录下),这个xml文件中需要配置数据库的相关信息,以及连接池的配置情况,而且在java程序中我们还需要通过这行代码来加载c3p0.xml文件-DataSource datasource = new ComboPooledDataSource();。但是在Hibernate中,不需要,因为所有的连接信息和配置信息都写在了我们的主配置文件中-hibernate.cfg.xml(src目录下)。
2.创建表
主表 Customer 子表LinkMan
c_id BINGINT PRIMARY KEY AUTO_INCREASE lkm_id BINGINT PRIMARY KEY AUTO_INCREASE
c_name VARCHAR(20) lkm_name VARCHAR(20)
lkm_cid 外键 --指向Customerd的主键---》c_id
3.创建实体类
主表对应的实体类 子表对应的实体类
Class Customer { Class LinkMan {
无参构造 无参构造
private Long c_id;//主键 private Long lkm_id;//主键
private String c_name; private String lkm_name;
} }
实体类中的外键我为什么不写呢?因为这涉及到方向性,外键的维护是靠Hibernate去维护的。
Hibernate中外键的维护分两大块:
1、从表结构方面上维护 :映射文件中的标签+实体类中属性
2、从表数据层面上维护:实体类中的属性+java代码中让实体类的属性发生实质的关系
看我的第一个1对多案例进一步了解
第二个多对多案例深入了解
4.创建映射文件
1.class标签:配置实体类与表之间的一一对应关系
name:表示实体类
table:表示表(如果表名和类名一致,则table可以不写)
catalog:对应数据库
2.id标签:表示对应表中的主键
name:类中的属性名
column:表示表中的列名(如果column不写,则列名和属性名一致)
type:表示列中对应的数据类型(java类型,hibernate类型,数据库类型)
length:表示数据的长度
not-null:非空
3.property标签:表示对应表中的普通字段
name:类中的属性名
column:表示表中的列名(如果column不写,则列名和属性名一致)
type:表示列中对应的数据类型(java类型,hibernate类型,数据库类型)
length:表示数据的长度
not-null:非空
第四大标签分两大类-每类又分两种情况-即四种情况
第一类:1对多的情况 用户和联系人
1.1 1的1端
set标签:表示建立一对多的关联关系
name属性:代表当前类中多的集合的引用名称
inverse:主动放弃外键维护权,减少双向级联的时候产生多余的sql
cascade:1的一端设置级联,两端都设置就是双向级联 save-update:级联保存 delete:级联删除
key标签:表示在子表中添加的外键列名 双向级联的时候二者key的column属性得一致,否则创建两个不同的外键
one-to-many标签 指定当前类中集合对象的对应类型
1.2 多的一端
many-to-one标签:建立多对一的关联关系
name属性:当前类中一的一端的属性名
column属性:表中外键的字段的名称 若有表,就和表外键字段一致。若没有表,写什么字段就生成外键名
双向级联的时候两个映射文件中的column属性得一致,否则创建两个不同的外键
class属性:当前类中属性所关联的一的一端的对象
cascade:多的一端设置级联-两端都设置就是双向级联 save-update:级联保存 delete:级联删除
第二类 多对多 User----Role 角色跟权限
2.1 多的一端
若设置了双向关联关系,这些字段要一一对应。
从Role端维护多对多关联关系 单向 若要双向,需要在User.hbm.xml也配置
set多对多关联关系标签
name 实体类中Set变量名
table 要生成的表名
inverse:若设置了双向级联操作 需要设置一方的inverse为true,要不然报错
key标签:当前类在中间表生成的外键
many-to-many标签:class:关联的另一方的多的类全路径.column:另一方在中间表中的外键名称:
2.2 多的另一端
若设置了双向关联关系,这些字段要一一对应。
从User端建立多对多关联关系 单向 若要双向,需要在Role.hbm.xml也配置
set标签:表示建立多对多的关联关系
table:多对多关系时,需要生成的中间表
name属性:代表当前类中多的集合的引用名称
cascade:单向 若要双向,需要在Role.hbm.xml也配置
key标签:当前类在中间表生成的外键
many-to-many标签:class:关联的另一方的多的类全路径.column:另一方在中间表中的外键名称:
5.创建主配置文件(.xml或者.properties)
推荐使用hibernate.cfg.xml 这样的话,我们能直接在配置文件中引入映射文件,若使用.properties文件,无法引入,因为这文件的结构是key = value的形式
必须的配置:
1.配置连接数据库的基本的信息
2.指定数据库方言
3.加载映射文件(主配置文件中的最后一行)
可选配置项:
1.hbm2ddl:(create drop alter) 即如何操作表 一般为update(有表直接用,没表创建表)
2.显示sql 3.格式化sql
3.配置session绑定本地线程--cfg.getCurrentSession();返回的session不用调用close()归还给连接池,框架底层会在我们用完连接的时候自动归还,如果我们自己还调用close会报错的
4.事务隔离级别
5.使用其他连接池---hibernate默认使用自带的连接池
如果设置了C3P0连接池配置信息,就必须导入3个c3p0相关的jar包,代码无需修改,只需要jar包和配置文件,否则报错