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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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执行流程


image.png


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常用配置


image.png

image.png

image.pngimage.png

image.png

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()


组件属性


image.png

<?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)对应的表中生成相应的字段


image.png

get和load


image.png


image.png

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
关系型数据库 Java MySQL
Hibernate-Entity.hbm.xml实现-intellij-kotlin入门级
个人博客项目地址-码云 intellij新建Maven项目 在src/resource下新建hibernate.cfg.xml文件,一定要在src/resource目录下,否则会报无法定位资源文件的错误。
979 0
|
2月前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
39 1
|
3月前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
113 1
|
5月前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
**Kotlin中的`by lazy`和`lateinit`都是延迟初始化技术。`by lazy`用于只读属性,线程安全,首次访问时初始化;`lateinit`用于可变属性,需手动初始化,非线程安全。`by lazy`支持线程安全模式选择,而`lateinit`适用于构造函数后初始化。选择依赖于属性特性和使用场景。**
181 5
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
|
4月前
|
调度 Android开发 开发者
【颠覆传统!】Kotlin协程魔法:解锁Android应用极速体验,带你领略多线程优化的无限魅力!
【8月更文挑战第12天】多线程对现代Android应用至关重要,能显著提升性能与体验。本文探讨Kotlin中的高效多线程实践。首先,理解主线程(UI线程)的角色,避免阻塞它。Kotlin协程作为轻量级线程,简化异步编程。示例展示了如何使用`kotlinx.coroutines`库创建协程,执行后台任务而不影响UI。此外,通过协程与Retrofit结合,实现了网络数据的异步加载,并安全地更新UI。协程不仅提高代码可读性,还能确保程序高效运行,不阻塞主线程,是构建高性能Android应用的关键。
66 4
|
5月前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin中常见作用域函数
**Kotlin作用域函数概览**: `let`, `run`, `with`, `apply`, `also`. `let`安全调用并返回结果; `run`在上下文中执行代码并返回结果; `with`执行代码块,返回结果; `apply`配置对象后返回自身; `also`附加操作后返回自身
62 8
|
5月前
|
安全 Java Android开发
探索Android应用开发中的Kotlin语言
【7月更文挑战第19天】在移动应用开发的浩瀚宇宙中,Kotlin这颗新星以其简洁、安全与现代化的特性,正迅速在Android开发者之间获得青睐。从基本的语法结构到高级的编程技巧,本文将引导读者穿梭于Kotlin的世界,揭示其如何优化Android应用的开发流程并提升代码的可读性与维护性。我们将一起探究Kotlin的核心概念,包括它的数据类型、类和接口、可见性修饰符以及高阶函数等特性,并了解这些特性是如何在实际项目中得以应用的。无论你是刚入门的新手还是寻求进阶的开发者,这篇文章都将为你提供有价值的见解和实践指导。
|
5月前
|
SQL 安全 Java
Android经典面试题之Kotlin中object关键字实现的是什么类型的单例模式?原理是什么?怎么实现双重检验锁单例模式?
Kotlin 单例模式概览 在 Kotlin 中,`object` 关键字轻松实现单例,提供线程安全的“饿汉式”单例。例如: 要延迟初始化,可使用 `companion object` 和 `lazy` 委托: 对于参数化的线程安全单例,结合 `@Volatile` 和 `synchronized`
70 6
|
5月前
|
存储 前端开发 测试技术
Android Kotlin中使用 LiveData、ViewModel快速实现MVVM模式
使用Kotlin实现MVVM模式是Android开发的现代实践。该模式分离UI和业务逻辑,借助LiveData、ViewModel和DataBinding增强代码可维护性。步骤包括创建Model层处理数据,ViewModel层作为数据桥梁,以及View层展示UI。添加相关依赖后,Model类存储数据,ViewModel类通过LiveData管理变化,而View层使用DataBinding实时更新UI。这种架构提升代码可测试性和模块化。
208 2
|
6月前
|
安全 Java 编译器
Android面试题之Java 泛型和Kotlin泛型
**Java泛型是JDK5引入的特性,用于编译时类型检查和安全。泛型擦除会在运行时移除类型参数,用Object或边界类型替换。这导致几个限制:不能直接创建泛型实例,不能使用instanceof,泛型数组与协变冲突,以及在静态上下文中的限制。通配符如<?>用于增强灵活性,<? extends T>只读,<? super T>只写。面试题涉及泛型原理和擦除机制。
43 3
Android面试题之Java 泛型和Kotlin泛型