hibernate学习(一)

javaWeb学习已经有一段时间了,最开始接触的mvc框架是struts2,不过也并没有系统化的学过这个框架,只是跟着老师过了一遍流程,会简单的使用。现在已经使用struts2配合DBUtils写了两个小小的项目。ssh既然放在一起肯定还是一起用的比较方便,现在开始学习hibernate。额,可能是有点老了,但还是要学学,听说要简单基础点、、、

hibernate入门

  • 建立工程,导入jar包。
    在hibernate包中的lib文件夹里都是jar包,很多还没接触,不过required文件夹下的是必须的,我用的最新5.2的版本,直接将这些jar和jdbc那个连接数据库的包导入就能用了。还有些包log4j-api-*.jar slf4j-api-*.jar slf4j-log4j12-*.jar这几个是用来提供日志输出的。导入完毕开始写配置敲代码。我滴个,一共十几个包,实话真麻烦。
  • 核心配置
    就是设置各种各样的参数啥的也是麻烦的很。以下是份基础的配置,必须放在src下面,文件名必须是hibernate.cfg.xml
<?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://localhost:3306/hiber</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <!-- hibernate信息 可选属性 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <!-- 兼容不同数据库的特殊语句 -->
        <property name="hibernate.hbm2ddl.auto">update</property> <!-- 自动创建数据表 常用update -->
        <property name="hibernate.show_sql">true</property> <!-- 显示sql语句日志 -->
        <property name="hibernate.format_sql">true</property> <!-- 格式化sql语句日志 -->
        <!-- 映射文件所在的位置 -->
        <!-- mapping class="cn.lkangle.entity.User"/--> <!-- 使用注释配置 -->
        <mapping resource="cn/lkangle/entity/user.hbm.xml"/>
    </session-factory>

</hibernate-configuration>
  • 映射配置
  1. 第一种
    将创建的数据类逐一的和数据库映射起来
    先是数据类
package cn.lkangle.entity;

public class User {
    private int uid;
    private String name;
    private String pass;
    public int getUid() {
        return uid;
    }
    public void setUid(int uid) {
        this.uid = uid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPass() {
        return pass;
    }
    public void setPass(String pass) {
        this.pass = pass;
    }
}

hibernate的映射配置文件,这个位置没要求,但一般和类放在一起

<?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>
    <class name="cn.lkangle.entity.User" table="user">
        <id name="uid" column="id"> <!-- 唯一的id键 -->
            <generator class="native"></generator>  <!-- 常用属性 设置自动增长 -->
        </id>
        <property name="name" column="name"></property>  <!-- name是类中变量名 column是要建立的字段名 一般和变量名一样 -->
        <property name="pass" column="pass"></property>
    </class>
</hibernate-mapping>
  1. 使用注释进行映射配置
package cn.lkangle.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="user")  // 与数据库表名映射
public class User {
    @Id@GeneratedValue  // 规定主键 设置主键规则为默认规则 自动增长
    int uid;
    @Column  // 设置字段与属性映射 默认字段与属性名相同
    String name;
    @Column(name="upass") // 自定义设置字段名
    String pass;
    
    public int getUid() {
        return uid;
    }
    public void setUid(int uid) {
        this.uid = uid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPass() {
        return pass;
    }
    public void setPass(String pass) {
        this.pass = pass;
    }
}

注解配置中主键设置为自动增长规则并非真的自增,而是通过添加新字段记录下一个值实现自增。别的规则没试过...

  • 写代码测试
    终于可以写代码了,配置了一圈的xml文件真是麻烦,没办法想学还就是要一点点配置,还要弄懂才好。以下是一份简单的测试代码,七步走~~
package cn.lkangle.dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import cn.lkangle.entity.User;

public class HbmDao {
    @Test
    public void hbmTest() {
        // 1、 加载hibernate.cfg.xml配置文件
        Configuration cfg = new Configuration();
        cfg.configure();
        // 2、 创建SessionFactory对象 在这里会根据配置文件映射关系自动创建数据表
        SessionFactory sf = cfg.buildSessionFactory();
        // 3、 使用SessionFactory创建Session对象
        Session session = sf.openSession();
        // 4、 手动开启事务
        Transaction ts = session.beginTransaction();
        // 5、 具体逻辑 crud操作
        User user = new User();
        user.setName("lee");
        user.setPass("123456");
        session.save(user);
        // 6、 提交事务
        ts.commit();
        // 7、 关闭资源
        session.close();
        sf.close();
    }
}
  • 单元测试
    运行,这是控制台输出这样一串信息就说明成功了~~~
Hibernate: 
    
    create table user (
       id integer not null auto_increment,
        name varchar(255),
        pass varchar(255),
        primary key (id)
    ) engine=InnoDB
Hibernate: 
    insert 
    into
        user
        (name, pass) 
    values
        (?, ?)

先创建了表,又插入了值,方便。

  • 所遇问题
    第一次用并没有真的成功,不能自动创建表,百度一圈后找到原因。核心配置里的数据库方言选择错误。
    我使用的是mysql5.3的版本,而mysql 5.0之前和之后是不一样的。

    5.0以前的Hibernate 方言是: org.hibernate.dialect.HSQLDialect
    5.0以后的Hibernate 方言是: org.hibernate.dialect.MySQL5InnoDBDialect
    还可以根据版本自动设置:<property name="hibernate.dialect">${dialect}</property>

    5.0之前的我没有测试,后两个是了确实没问题

刚刚接触hibernate 简单记录下

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

推荐阅读更多精彩内容