Hibernate-ORM:02.Hibernate增删改入门案例
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------
本笔者使用的是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
如有错误,请指出,感激不尽!!!!!!!!!!!!!!!!!
Hibernate-ORM:02.Hibernate增删改入门案例的更多相关文章
- Hibernate——(2)增删改查
案例名称:Hibernate完成增删改查 案例描述:抽取出工具类并完成删除.修改.查询功能. 具体过程: 1.使用上面的例子(Hibernate--(1)Hibernate入门http://blog. ...
- hibernate关联对象的增删改查------查
本篇博客是之前博客hibernate关联对象的增删改查------查 的后继,本篇代码的设定都在前文已经写好,因此读这篇之前,请先移步上一篇博客 //代码片5 SessionFactory sessi ...
- Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查
一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...
- [Django框架 - 静态文件配置、request对象方法初识、 pycharm链接数据库、ORM实操增删改查、django请求生命周期]
[Django框架 - 静态文件配置.request对象方法初识. pycharm链接数据库.ORM实操增删改查.django请求生命周期] 我们将html文件默认都放在templates文件夹下 将 ...
- Struts2+Spring+Hibernate实现员工管理增删改查功能(一)之ssh框架整合
前言 转载请标明出处:http://www.cnblogs.com/smfx1314/p/7795837.html 本项目是我写的一个练习,目的是回顾ssh框架的整合以及使用.项目介绍: ...
- 快速入门GreenDao框架并实现增删改查案例
大家的项目中不可避免的使用到SQLite,为此我们要花费心思编写一个增删改查框架.而一个好的ORM框架则能够给我们带来极大的方便,今天给大家讲解一个非常火热的ORM-GreenDao. 基本概念 Gr ...
- hibernate关联对象的增删改查------增
本文可作为,北京尚学堂马士兵hibernate课程的学习笔记. 这一节,我们看看hibernate关联关系的增删改查 就关联关系而已,咱们在上一节已经提了很多了,一对多,多对一,单向,双向... 其实 ...
- Hibernate进行对象的增删改查
首先我们看看hibernate手动配置步骤 (这个了解一点就可以了,以后是不会自己全部手动配置的) 1. 创建WEB项目 2 下载hibernate-release-4.3.11.F ...
- Hibernate常用api以及增删改查
一 .API的定义 所谓的API全称就是(Application Programming Interface,应用程序编程接口).就是类库对外提供的接口.类.枚举.注解等元素. 如:JDK API ...
随机推荐
- access登录窗口校验代码一
Private Sub login_Click()If IsNull(Me.username) ThenMsgBox "请输入用户名!", vbExclamationElseIf ...
- Grunt的配置和使用
Grunt和Grunt插件是通过NodeJs的包管理工具npm安装并进行管理的. Grunt 0.4.x必须配合NodeJs=>0.8.0版本使用(奇数版本的NodeJs不是稳定的开发版本) ...
- meta 刷新
<meta http-equiv="refresh" content="5;url=地址" /> 5秒后刷新至URL地址
- Django入门四之数据库相关
1. 数据库设置 在settings.py中配置数据库 我首先使用的是sqlite3,所以配置如下 2. 数据库的数据结构定义 #blog/models.py #定义了一个表(Student),表里两 ...
- WEB自动化(Python+selenium)的API
在做Web自动化过程中,汇总了Python+selenium的API相关方法,给公司里的同事做了第二次培训,分享给大家 ...
- Caffe 编译后 make runtest 出现locale::facet::_S_create_c_locale 错误
You might need to append LC_ALL="en_US.UTF-8" to file: /etc/default/locale and reboot your ...
- Linux之SSH密钥认证
1.SSH协议的认识 SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH 是目前 ...
- XSS(跨域脚本攻击)应对之道
1.概念 xss一般分为两类,反射型和存储型. 反射型xss指的是客户端的不安全输入而引起的攻击,例如: 在某网站搜索,搜索结果会显示搜索的关键词,搜索时关键词填入<script>aler ...
- mysql workbench EER图,里面的实线以及虚线的关系
ERWin里面线代表实体间的三种关系:决定关系(Identifying Relationship),非决定关系(None-Identifying Relationship),多对多(Many-To-M ...
- MyBatis缓存详解
MyBatis缓存分为一级缓存和二级缓存 http://www.cnblogs.com/zemliu/archive/2013/08/05/3239014.html mybatis 二级cache h ...