Hibernate-Entity.hbm.xml实现-intellij-kotlin入门级

个人博客
项目地址-码云

  1. intellij新建Maven项目
  2. 在src/resource下新建hibernate.cfg.xml文件,一定要在src/resource目录下,否则会报无法定位资源文件的错误。
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!--数据库url,以及防止中文乱码-->
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate-final?useUnicode=true&characterEncoding=UTF-8</property>
        <!--Mysql驱动-->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!--Mysql用户名-->
        <property name="connection.username">root</property>
        <!--Mysql密码-->
        <property name="connection.password">rootPwd</property>

        <!--方言-->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!--调试时显示sql语句-->
        <property name="show_sql">true</property>
        <!--格式化调试时输出的sql语句-->
        <property name="format_sql">true</property>

        <!-- DB schema will be updated if needed -->
        <!--create表结构每次发生改变都会删除原来的表,创建新的表。update是在原有的表上进行更新,保留数据-->
        <property name="hbm2ddl.auto">update</property>
        <!--<property name="hbm2ddl.auto">create</property>-->

        <!--映射文件-->
        <mapping resource="StudentEntity.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
  1. 不要使用intellij的Add Framework Support,可能是intellij的hibernate版本太低了,使用这种方式生成数据库表的时候会报错,"type"在mysql高版本中已经被删除。
  2. 在项目的pom文件中添加hibernate依赖
      <!--hibernate依赖-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.11.Final</version>
        </dependency>
        <!--单元测试依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
        <!--mysqlJDBC依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.39</version>
        </dependency>
  1. 新建持久化类
package Entity;


/**
 * Created by futao on 2017/9/24.
 */
public class Student {
    //JavaBean(持久化类)编写规范
    //1.公有的类
    //2.私有属性
    //3.提供公有的不带参数的默认构造方法
    //4.私有属性的公有getter和setter
    //5.为方便实例化对象,一般生成一个带参的构造方法

    //设置public static final String的意义在于:比如 .add(Restrictions.eq())的时候,可以直接通过实体的类型点出来,而不用手动输入,这样避免了手动输入发生错误的情况
    private int sid;
    public static final String _sid = "sid";
    private String name;
    public static final String _name = "name";
    private String gender;
    public static final String _gender = "gender";
    private Timestamp birthday;
    public static final String _birthday = "birthday";
    private String address;
    public static final String _address = "address";
    private String tel;
    public static final String _tel = "tel";

    public Student(){ }

    public Student(int sid, String name, String gender, String birthday, String address, String tel) {
        this.sid = sid;
        this.name = name;
        this.gender = gender;
        this.birthday = birthday;
        this.address = address;
        this.tel = tel;
    }

    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }
}

  1. 在src/resource文件夹下创建实体映射文件StudentEntity.hbm.xml,maven项目的配置文件应该都应该放在这个文件夹下,否则都会报错。
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="Entity.Student" table="t_student">
        <id name="sid">
            <column name="sid" sql-type="int(11)"/>
            <generator class="native"/>
        </id>
        <property name="name">
            <column name="name" sql-type="varchar(255)" not-null="true"/>
        </property>
        <property name="birthday">
            <column name="birthday" sql-type="varchar(255)" not-null="true"/>
        </property>
        <property name="address">
            <column name="address" sql-type="varchar(255)" not-null="false"/>
        </property>
    </class>
</hibernate-mapping>
  1. 在hibernate主配置文件中添加实体映射文件
  <!--映射文件-->
        <mapping resource="StudentEntity.hbm.xml"/>
  1. 测试
package Entity

import org.hibernate.cfg.Configuration
import org.junit.Test

@Suppress("DEPRECATION")
/**
 * Created by futao on 2017/9/24.
 */
class t{

    @Test
    fun testInit(){
        //加载配置文件
        val configuration=Configuration().configure()
        //创建会话工厂
        val sessionFactory=configuration.buildSessionFactory()
        //创建会话
        val session=sessionFactory.openSession()
        //开启事务
        val transaction=session.beginTransaction()

        //crud
        session.save(Student(1,"熊小二","男", "2017-9-24","上海市小二房","1887978252"))

        //提交事务
        transaction.commit()
        //关闭会话
        session.close()
        //关闭会话工厂
        sessionFactory.close()
    }

}


基础版完成 ↑↑↑↑↑↑↑



Hibernate执行流程

Hibernate执行流程

session简单地理解就是一个操作数据库的对象
hibernate的操作必须包装在事务当中,否则操作不会同步到数据库(或者使用doWord()的方式)

创建session对象的两种方式
  1. val session=sessionFactory.openSession()
  2. val session=sessionFactory.currentSession
    使用第二种方式获得session需要在hibernate主配置文档中进行配置
 <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>
hbm常用配置
mapping
class
id
主键生成策略
基本类型

timestamp时间戳

image.png
长文本
//Entity
  private Blob picture;//照片,长文本
    public static final String _picture = "picture";


//hbm.xml
       <property name="picture">
            <column name="picture" sql-type="longblob" not-null="false"/>
        </property>


//Test    存
 val f= File("d:"+File.separator+"banner.png")
        val input=FileInputStream(f)
        val blob=Hibernate.getLobCreator(session).createBlob(input, input.available().toLong())
        session.save(Student(5,"熊","男", Timestamp(DateTime.now().millis) ,"上海市小二房","1887978252",blob))


//    取
 val entity = session.get(Student::class.java, 4) as Student
        //获得Blob对象
        val pic= entity.picture
        //获得照片的输入流
        val inPut=pic.getBinaryStream()
        //创建输出流
        val file = File("d:"+File.separator+"bannerNew.png")
        //获得输出流
        val outPut=FileOutputStream(file)
        //创建缓冲区
        var buff = ByteArray(inPut.available())
        inPut.read(buff)
        outPut.write(buff)
        inPut.close()
        outPut.close()

组件属性

组件属性
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="Entity.Student" table="t_student">
        <id name="sid">
            <column name="sid" sql-type="int(11)"/>
            <generator class="native"/>
        </id>
        <property name="name">
            <column name="name" sql-type="varchar(255)" not-null="true"/>
        </property>
        <property name="birthday">
            <column name="birthday" sql-type="timestamp" not-null="true"/>
        </property>
        <!--<property name="address">-->
            <!--<column name="address" sql-type="varchar(255)" not-null="false"/>-->
        <!--</property>-->
        <property name="picture">
            <column name="picture" sql-type="longblob" not-null="false"/>
        </property>
        <!--组件属性-->
        <component name="addressEntity" class="Entity.Address">
            <property name="postCode">
                <column name="postCode"/>
            </property>
            <property name="phone">
                <column name="phone"/>
            </property>
            <property name="address">
                <column name="address"/>
            </property>
        </component>
    </class>
</hibernate-mapping>

组件属性的所有property会在实体(Student)对应的表中生成相应的字段

table

get和load

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

推荐阅读更多精彩内容

  • 本文包括: 1、CRM 项目的整体介绍 2、Hibernate 框架概述 3、Hibernate 快速入门 4、H...
    廖少少阅读 3,463评论 9 66
  • 目录 1. Hibernate框架的概述 1.1 Hibernate简介 1.2 为什么要学习Hibernate ...
    深海鱼Q阅读 1,013评论 0 14
  • Hibernate: 一个持久化框架 一个ORM框架 加载:根据特定的OID,把一个对象从数据库加载到内存中OID...
    JHMichael阅读 1,956评论 0 27
  • 1.什么是框架 什么是框架呢?个人觉得在软件设计中,框架可以看作是架构组件。如果把整个程序看作是一个人的话,那么框...
    Wizey阅读 716评论 0 4
  • 遇见“简书”第三天,学到的新词——日更。 提到这两个字,心里沉了一下,日更,我恐怕做不到。每天吃饭...
    旖旎瓜农阅读 138评论 0 2