Hibernate-ORM:02.Hibernate增删改入门案例

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:   ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------     本笔者使用的是Idea+mysql+maven做Hibernate的博客,本篇及其以后都是如此! 首先写好思路和流水,我说一下会讲什么: 1.

 

 

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

 

 

本笔者使用的是Idea+mysql+maven做Hibernate的博客,本篇及其以后都是如此!

首先写好思路和流水,我说一下会讲什么:

1.pom节点:jar包的引用;

  1.1包括如何在不是resource的其他地方编译xml文件

2.核心配置文件hibernate.cfg.xml书写

  2.1核心配置文件中的表生成策咯

  2.2jdbc的四要素

  2.3如何关联小配置文件**.hbm.xml

  2.4在控制台展示sql语句与格式化sql语句

3.实体类的创建

4.小配置**.hbm.xml的配置书写

  4.1主键生成策咯

  4.2实体类和数据表如何映射

5.书写单测增删改

  5.1事务环境的运行

 

 

话不多少,开始案例:

一,创建maven项目

  1.引入jar包此处较长,合起来了

<!--单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!--Hibernate的核心jar-->
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.12.Final</version>
        </dependency>

        <!--jta 事务的api-->
        <!-- https://mvnrepository.com/artifact/javax.transaction/jta -->
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
            <version>1.1</version>
        </dependency>

        <!-- 添加Log4J依赖 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.6.4</version>
        </dependency>

        <!-- 添加javassist -->
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.12.0.GA</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <version>1.0.1.Final</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.39</version>
        </dependency>
Hibernate的pom节点

  2.使非resource下面的xml参与编译

<build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
</build>

二.核心配置文件hibernate.cfg.xml书写

  配置了hbm2ddl.auto的话甚至连数据库的表都无需自己创建,只要一个实体类,自动创建数据库的表

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!--jdbc连接四要素-->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///y2167</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>

        <!--在控制台上展示sql-->
        <property name="show_sql">true</property>

        <!--格式化sql-->
        <property name="format_sql">true</property>

        <!--====================================================================-->

        <!--ddl操作生成策咯,每次运行都在原有表上修改,没有的话就创建表-->
        <!--
        <property name="hbm2ddl.auto"></property>

        key - hbm2ddl.auto:自动生成表结构策略

        value - update(使用最多):当数据库不存在表时,hibernate启动后会自动生成表结构。

             当数据库表存在时,如果一样,则只会写入数据,不会改变表结构。

             当数据库表存在时,如果不一样,则会修改表结构,原有的表结构不会改变。

     create(很少):无论表结构是否存在,hibernate启动后都会重新生成表结构。(造成之前的数据丢失)

     create-drop(极少):无论表结构是否存在,hibernate启动都会重新生成表结构。并且hibernate关闭后,表结构会被删除。来无影去无踪。

     validate(很少):不会创建表结构,不会修改表结构。校验与数据库中的表结构是否一样,如果不一样则报异常。
        -->
        <property name="hbm2ddl.auto">update</property>

        <!--与小配置文件映射-->
        <mapping resource="cn/dawn/day01/dao/Teacher.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>

三,实体类的创建

  此处需要注意的是属性要使用封装类,因为封装类实现了Serializable接口,再举例说明,Interge允许空值,int不行,封装类有更多的功能(方法)

  构造也是值得注意的,最好保留一个无参构造,(血泪教训)

package cn.dawn.day01.entity;

/**
 * Created by Dawn on 2018/5/25.
 */
/*实体*/
public class Teacher {
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

四,小配置Teacher.hbm.xml

  值得注意的是:1.主键生成策咯,2.导入的包名

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.dawn.day01.entity">
    <!--如果上面指定package的话,class的name就不必写全类名-->
    <!--lazy:是否懒加载(延迟加载)        默认值是true,延迟加载-->
    <!--<class name="Teacher">-->
    <!--直接加载-->
    <class name="Teacher">
        <!--主键-->
        <id name="id" column="tid">
            <!--主键生成策咯  assigned程序员自己创建-->
            <!--identity是mysql里的自增,一会做增加操作不必再给主键赋值-->
            <!--increment是先查最大的主键列,在下一条给主键加一-->
            <!--sequence是oracle的主键生成策咯,他一会需要指定序列名字<param name="sequence">序列名</param>-->
            <generator class="assigned"></generator>
        </id>
        <property name="name" column="name"></property>
    </class>
</hibernate-mapping>

五,书写测试类

  1.先写@Before的代码,需要在执行单测前创建事务对象和Session对象

package cn.dawn.day01;

import cn.dawn.day01.entity.Teacher;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * Created by Dawn on 2018/5/25.
 */
public class Test0120180525InsertDeleteUpdate {
    /*事物*/
    Transaction tr=null;
    /*session*/
    Session session=null;

    
    /*在执行之前加载配置,运行事物*/
    @Before
    public void beforeTest(){
        /*加载hibernate核心*/
        Configuration cfg=new Configuration().configure();
        /*创建session工厂*/
        SessionFactory sessionFactory=cfg.buildSessionFactory();
        /*创建session*/
        session = sessionFactory.openSession();
        /*创建事物*/
        tr = session.beginTransaction();
    }

}

  2.创建@After的方法,用于单测结束后提交事务和关闭Session对象

    /*在执行之后,提交事物,关闭session*/
    @After
    public void afterTest(){
        /*提交事物*/
        tr.commit();
        /*关闭session*/
        session.close();
    }

  3.增:根据不同的主键生成策咯,它的新增写法不同

  如果是identity无需往对象set主键id值

  如果是assigned则需要程序员自己创建,必须给set主键值,否者抛异常

    /*Demo01最简单的Hibernate例子,做一下添加操作*/
    public void t1InsertDemo(){
        System.out.println("----------------------------------");
        /*创建一个对象*/
        Teacher teacher=new Teacher();
        teacher.setId(1);
        teacher.setName("孟六");
        /*调用执行*/
        session.save(teacher);
        System.out.println("----------------------------------");
    }

  4.会根据您传进来的主键值改其他属性

    @Test
    /*Demo01最简单的Hibernate例子,做一下添加操作*/
    public void t1InsertDemo(){
        System.out.println("----------------------------------");
        /*创建一个对象*/
        Teacher teacher=new Teacher();
        teacher.setId(1);
        teacher.setName("孟六");
        /*调用执行*/
        session.save(teacher);
        System.out.println("----------------------------------");
    }

  5.删除:只需要一个有主键id的对象,就可以删除您表中的对应的记录

    @Test
    /*删除*/
    public void t2DeleteDemo(){
        System.out.println("----------------------------------");
        Teacher teacher=new Teacher();
        teacher.setId(1);
        session.delete(teacher);
        System.out.println("----------------------------------");
    }

 

作者:晨曦Dawn

转载请注明出处:https://www.cnblogs.com/DawnCHENXI/p/9090482.html

如有错误,请指出,感激不尽!!!!!!!!!!!!!!!!!

 

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
JavaScript 前端开发 Java
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Jsp页面
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Jsp页面
|
7月前
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——OpSessionview实现
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——OpSessionview实现
|
7月前
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——EmpDao层代码
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——EmpDao层代码
|
7月前
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Dept实体类和对应的配置信息
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Dept实体类和对应的配置信息
|
7月前
|
Java
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Action的实现类
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Action的实现类
|
7月前
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——工具类
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——工具类
|
7月前
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——DeptDao层代码
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——DeptDao层代码
|
7月前
|
XML Java 数据库连接
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——hibernate的config文件(hibernate.cfg.xml)
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——hibernate的config文件(hibernate.cfg.xml)
|
SQL XML Java
一篇文章让你马上入门Hibernate
一篇文章让你马上入门Hibernate
|
4月前
|
Java 数据库连接 数据库
告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
287 0