Hibernate

为什么要使用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包和配置文件,否则报错

            










©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容