封面:洛小汐

作者:潘潘

在理解中执行,在执行中理解,学习技术也循此道。

前言

上一篇文章 《Mybatis系列全解(二):Mybatis简介与环境搭建》 ,我们对 Mybatis 做了初步讲解,并搭建了一套基本环境,共同完成了一次查询操作。所以本篇文章我们在此基础上,继续拓展了插入、修改、删除三种操作,把我们的CRUD基础操作进行完善。

目录

1、Mybatis查询操作回顾

2、插入操作

3、修改操作

4、删除操作

5、总结

Mybatis查询操作回顾

默认已安装 Java 开发环境、Mysql数据库、Maven 环境。

Mybatis 的查询分为7个步骤:

1、创建 maven 工程

2、添加 MyBatis 仓库坐标(非maven项目则引入jar包)

3、创建user数据表

4、编写User实体类

5、编写映射文件UserMapper.xml

6、编写核心文件SqlMapConfig.xml

7、编写测试类

1、创建 maven 工程

2、添加 MyBatis 仓库坐标


<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies> <!--mybatis坐标-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency> <!--mysql驱动坐标-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</dependency> <!--单元测试坐标-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency> <!--日志坐标-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency> </dependencies>

3、创建user数据表


CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) DEFAULT NULL,
`password` varchar(50) DEFAULT NULL,
`birthday` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

4、编写User实体类


package com.panshenlian.pojo; /**
* @Author: panshenlian
* @Description: 用户实体
* @Date: Create in 2:08 2020/11/28
*/
public class User {
private int id;
private String username;
private String password;
private String birthday; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getBirthday() {
return birthday;
} public void setBirthday(String birthday) {
this.birthday = birthday;
} @Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", birthday='" + birthday + '\'' +
'}';
}
}

5、编写映射文件UserMapper.xml


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="userMapper"> <select id="findAll" resultType="com.panshenlian.pojo.User">
select * from User
</select> </mapper>

6、编写核心文件SqlMapConfig.xml


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="/UserMapper.xml" />
</mappers>
</configuration>

7、编写测试类


package com.panshenlian.service; import com.panshenlian.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test; import java.io.IOException;
import java.io.InputStream;
import java.util.List; /**
* @Author: panshenlian
* @Description: 体验测试类
* @Date: Create in 2:21 2020/11/28
*/
public class MybatisTest { @Test
public void testQueryUser01() throws IOException { //加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); // 获得sqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //获得sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(); // 执行sql语句
List<User> userList = sqlSession.selectList("userMapper.findAll"); // 打印结果
for (User user : userList) {
System.out.println(user);
} // 释放资源
sqlSession.close();
} }

最终通过 Junit 单元测试,运行结果符合预期

工程结构参考

插入操作

Mybatis的插入数据操作,我们一共需要两步:

  1. 在映射文件UserMapper.xml中添加插入语句

<!-- 插入用户操作 -->
<insert id="insertUser"
parameterType="com.panshenlian.pojo.User" > insert into user(username,password,birthday)
values ( #{username}, #{password},#{birthday}) </insert>
  1. 编写插入User实体对象的 Java 代码

@Test
public void testInsertUser01() throws IOException { //加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); // 获得sqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //获得sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(); // 准备插入数据库的对象
User insertUser = new User();
insertUser.setBirthday("2020-12-01");
insertUser.setUsername("panpan");
insertUser.setPassword("888"); // 执行sql语句
int rows = sqlSession.insert("userMapper.insertUser",insertUser); // 打印结果
System.out.println(rows); // 提交事务
sqlSession.commit(); // 释放资源
sqlSession.close();
}

注意:当 sqlSession 执行插入、更新、删除操作时,需要提交事务,如果 openSession() 的时候使用无参构造函数,那么需要手动调用 commit() 进行事务提交,对应的插入、更新、删除操作才最终执行成功,如果是使用 openSession(true) 来打开session ,那么则表示事务自动提交,无需手工再调用 commit() 。

插入操作时,在映射文件中我们没有配置 resultType参数,即返回结果类型我们没有配置,Mybatis 默认返回 int 类型,表示插入操作影响的记录数。

上例插入操作执行结果为:1 ,表示插入成功,影响记录数量为1条。

插入操作注意问题

1、插入语句使用 insert 标签

2、在映射文件中使用 parameterType 属性指定要插入的数据类型

3、Sql语句中使用#{实体属性名}方式引用实体中的属性值

4、插入操作使用的API是sqlSession.insert(“命名空间.id”,实体对象);

5、插入操作涉及数据库数据变化,所以要使用sqlSession对象显示的提交事务,即sqlSession.commit()

修改操作

Mybatis的修改数据操作,同插入操作,也是需要两步:

  1. 在映射文件UserMapper.xml中添加修改语句

<!-- 修改用户操作 -->
<insert id="updateUser" parameterType="com.panshenlian.pojo.User" > update user set username =#{username} where id = #{id} </insert>
  1. 编写修改User实体对象的 Java 代码

@Test
public void testUpdateUser01() throws IOException { //加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); // 获得sqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //获得sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(); User updateUser = new User();
updateUser.setUsername("新的用户名PanPan");
updateUser.setId(1); // 执行sql语句
int rows = sqlSession.update("userMapper.updateUser",updateUser); // 打印结果
System.out.println(rows); // 提交事务
sqlSession.commit(); // 释放资源
sqlSession.close();
}

执行结果如下,成功修改 id =1 的数据记录,新用户名为 新的用户名PanPan

修改操作注意问题

1、修改语句使用update标签

2、修改操作使用的API是sqlSession.update(“命名空间.id”,实体对象);

删除操作

Mybatis的删除数据操作,同以上插入与修改操作,也是需要两步:

  1. 在映射文件UserMapper.xml中添加删除语句

<!-- 删除用户操作 -->
<insert id="deleteUser" parameterType="com.panshenlian.pojo.User" > delete from user where id=#{id} and username = #{username} </insert>
  1. 编写删除User实体对象的 Java 代码

@Test
public void testDeleteUser01() throws IOException { //加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); // 获得sqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //获得sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(); User deleteUser = new User();
deleteUser.setUsername("新的用户名PanPan");
deleteUser.setId(1); // 执行sql语句
int rows = sqlSession.delete("userMapper.deleteUser",deleteUser); // 打印结果
System.out.println(rows); // 提交事务
sqlSession.commit(); // 释放资源
sqlSession.close();
}

执行结果如下,成功删除 id =1 ,username=新的用户名PanPan的数据记录。

删除操作注意问题

1、删除语句使用 delete 标签

2、Sql语句中使用#{实体属性名}引用传递的对象属性

3、删除操作使用的API是sqlSession.delete(“命名空间.id”,Object);

删除操作也可以通过执行id的方式进行删除,例如在映射文件中把参数设置为parameterType=“java.lang.Integer”,实际 API 是sqlSession.delete(“命名空间.id”,1);

总结

我们通过本文介绍,基本掌握了 Mybatis 最基础的 CRUD 操作,后续,我们逐步深入。

本篇完,本系列下一篇我们讲《 Mybatis系列全解(四):XML配置文件与API介绍 》。

Mybatis系列全解(三):Mybatis简单CRUD使用介绍的更多相关文章

  1. Mybatis系列全解(八):Mybatis的9大动态SQL标签你知道几个?提前致女神!

    封面:洛小汐 作者:潘潘 2021年,仰望天空,脚踏实地. 这算是春节后首篇 Mybatis 文了~ 跨了个年感觉写了有半个世纪 ... 借着女神节 ヾ(◍°∇°◍)ノ゙ 提前祝男神女神们越靓越富越嗨 ...

  2. Mybatis系列全解(七):全息视角看Dao层两种实现方式之传统方式与代理方式

    封面:洛小汐 作者:潘潘 一直以来 他们都说为了生活 便追求所谓成功 顶级薪水.名牌包包 还有学区房 · 不过 总有人丢了生活 仍一无所获 · 我比较随遇而安 有些事懒得明白 平日里问心无愧 感兴趣的 ...

  3. Mybatis系列全解(六):Mybatis最硬核的API你知道几个?

    封面:洛小汐 作者:潘潘 2020 年的大疫情,把世界撕成几片. 时至今日,依旧人心惶惶. 很庆幸,身处这安稳国, 兼得一份安稳工. · 东家常讲的一个词:深秋心态 . 大势时,不跟风.起哄, 萧条时 ...

  4. Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件

    封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...

  5. Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解

    封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...

  6. Mybatis系列全解(二):Mybatis简介与环境搭建

    封面:洛小汐 作者:潘潘 Mybatis 是一套持久层框架,灵活易用,特别流行. 前言 Mybatis系列全解,我们预计准备10+篇文章,让我们了解到 Mybatis 的基本全貌,真正从入门到上手,从 ...

  7. 应用程序框架实战三十六:CRUD实战演练介绍

    从本篇开始,本系列将进入实战演练阶段. 前面主要介绍了一些应用程序框架的概念和基类,本来想把所有概念介绍完,再把框架内部实现都讲完了,再进入实战,这样可以让初学者基础牢靠.不过我的精力很有限,文章进度 ...

  8. mybatis 配置文件全解

    目录 properties settings typeAliases mappers properties mybatis配置文件中,可以像代码一样定义变量,然后在配置文件的其他地方使用,比如数据库连 ...

  9. 深入浅出Mybatis系列(一)---Mybatis入门

    最近两年 springmvc + mybatis 的在这种搭配还是蛮火的,楼主我呢,也从来没真正去接触过mybatis, 趁近日得闲, 就去学习一下mybatis吧. 本次拟根据自己的学习进度,做一次 ...

随机推荐

  1. 2019 Multi-University Training Contest 5——permutation 2

    传送门 题意: t组输入,之后每组例子有三个数n.x.y代表在一个以x为开头y为结尾的长为n的数组里面,开头和结尾数据已经固定,让你从1--n中找其他数据填入数组中 (每个数据不能重复使用),使它满足 ...

  2. Codeforces Round #655 (Div. 2) C. Omkar and Baseball (思维)

    题意:有一个数组,每次可以修改子数组,但是修改后每个元素的位置都必须变化,求最少修改多少次使得这个数组有序. 题解:假如这个数组本来就有序,我们直接输出0.否则,对于数组两端,假如它们有序,那么我们可 ...

  3. 大数据去重(data deduplication)方案

    数据去重(data deduplication)是大数据领域司空见惯的问题了.除了统计UV等传统用法之外,去重的意义更在于消除不可靠数据源产生的脏数据--即重复上报数据或重复投递数据的影响,使计算产生 ...

  4. [Golang]-6 超时处理、非阻塞通道操作、通道的关闭和遍历

    目录 超时处理 非阻塞通道操作 通道的关闭 通道遍历 超时处理 超时 对于一个连接外部资源,或者其它一些需要花费执行时间的操作的程序而言是很重要的. 得益于通道和 select,在 Go中实现超时操作 ...

  5. Kubernets二进制安装(15)之安装部署coredns

    在运维主机上(mfyxw50.mfyxw.com)准备Coredns镜像文件,以docker镜像文件的方式部署到Kubernetes集群中去. 1.下载coredns镜像 [root@mfyxw50 ...

  6. spring再学习之AOP实操

    一.spring导包 2.目标对象 public class UserServiceImpl implements UserService { @Override public void save() ...

  7. codeforces 1076E Vasya and a Tree 【dfs+树状数组】

    题目:戳这里 题意:给定有n个点的一棵树,顶点1为根.m次操作,每次都把以v为根,深度dep以内的子树中所有的顶点(包括v本身)加x.求出最后每个点的值为多少. 解题思路:考虑到每次都只对点及其子树操 ...

  8. Tomcat基本原理

    思考 :怎样让Tomcat具备Web服务的功能呢? 在服务端用HTTP来监听,协议不好写,不妨用Java封装好的Socket作为监听. class MyTomcat{ ServerSocket ser ...

  9. sqli-libs(7) bool盲注

    首先打开网页后,发现页面显示outfile,  对不起,看不懂,  就直接加 ' 发现报错了 后来,查看源码得知 他是两个括号括起来的 我们就可以构造我们的payload了, 首先查询当前数据库的长度 ...

  10. es6 curry function

    es6 curry function // vuex getters export const getAdsFilterConfig = (state) => (spreader) => ...