MyBatis基础:MyBatis数据基本操作(2)
1. MyBatis映射器
2. MyBatis数据基本操作
示例项目结构:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>libing</groupId>
<artifactId>com-helloworld-api</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>com-helloworld-api Maven Webapp</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.43</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0-b07</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>com-helloworld-api</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
pom.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/helloworld?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments> <mappers>
<mapper resource="mappers/RoleMapper.xml" />
</mappers>
</configuration>
mybatis-config.xml
package com.libing.helloworld.model;
public class Role {
private Integer id;
private String roleName;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
}
Role.java
<?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="com.libing.helloworld.dao.IRoleDao">
<resultMap id="baseResultMap" type="com.libing.helloworld.model.Role">
<id property="id" column="id" />
<result property="roleName" column="role_name" />
</resultMap> <select id="findAll" resultMap="baseResultMap">
SELECT
id,
role_name
FROM
role
ORDER BY id ASC
</select> <select id="findBySearchText" resultMap="baseResultMap">
SELECT
id,
role_name
FROM
role
WHERE
role_name LIKE CONCAT(CONCAT('%',#{searchText,jdbcType=VARCHAR}),'%')
ORDER BY id ASC
</select> <select id="findById" resultMap="baseResultMap">
SELECT
id,
role_name
FROM
role
WHERE id = #{id}
</select> <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.libing.helloworld.model.Role">
INSERT role
(
role_name
)
VALUES
(
#{roleName}
)
</insert> <update id="update" parameterType="com.libing.helloworld.model.Role">
UPDATE role
SET
role_name=#{roleName}
WHERE
id = #{id}
</update> <delete id="deleteById">
DELETE FROM role
WHERE
id = #{id}
</delete> <delete id="deleteByIds" parameterType="java.util.List">
DELETE FROM role
WHERE
id IN
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</delete>
</mapper>
RoleMapper.xml
package com.libing.helloworld.test; import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import com.libing.helloworld.dao.IRoleDao;
import com.libing.helloworld.model.Role; public class RoleTest {
SqlSession sqlSession = null; @Before
public void init() {
String resource = "mybatis-config.xml";
InputStream inputStream = RoleTest.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
} @Test
public void findAll() {
try {
IRoleDao roleDao = sqlSession.getMapper(IRoleDao.class);
List<Role> roles = roleDao.findAll(); Assert.assertNotNull(roles);
Assert.assertTrue(roles.size() > 0);
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
} @Test
public void findById() {
try {
IRoleDao roleDao = sqlSession.getMapper(IRoleDao.class);
Role role = roleDao.findById(1); Assert.assertNotNull(role);
Assert.assertNotNull(role.getRoleName());
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
} @Test
public void insert() {
try {
IRoleDao roleDao = sqlSession.getMapper(IRoleDao.class); Role role = new Role();
role.setRoleName("测试");
int result = roleDao.insert(role); // 只插入一条记录
Assert.assertEquals(1, result);
// id不为null
Assert.assertNotNull(role.getId());
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.rollback();
sqlSession.close();
}
} public void Update() {
try {
IRoleDao roleDao = sqlSession.getMapper(IRoleDao.class); Role role = roleDao.findById(1);
Assert.assertNotNull(role); role.setRoleName("测试");
int result = roleDao.update(role); // 只修改一条记录
Assert.assertEquals(1, result); // 修改后的值
Assert.assertEquals("测试", roleDao.findById(1).getRoleName());
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.rollback();
sqlSession.close();
}
} @Test
public void deleteById() {
try {
IRoleDao roleDao = sqlSession.getMapper(IRoleDao.class); Assert.assertNotNull(roleDao.findById(1)); // 调用删除方法
Assert.assertEquals(1, roleDao.deleteById(1));
// 再次查询,判断是否为null
Assert.assertNull(roleDao.findById(1));
} catch (Exception e) {
e.printStackTrace();
} finally {
// 由于sqlSessionFactory.openSession()是不自动提交的,不手动执行sqlSession.commit()不会提交到数据库
sqlSession.rollback();
sqlSession.close();
}
} @Test
public void deleteByIds() {
try {
List<Integer> ids = new ArrayList<Integer>();
ids.add(1);
ids.add(2); IRoleDao roleDao = sqlSession.getMapper(IRoleDao.class);
int result = roleDao.deleteByIds(ids); Assert.assertTrue(result > 0);
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.rollback();
sqlSession.close();
}
}
}
RoleTest.java
package com.libing.helloworld.dao; import java.util.List; import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectKey;
import org.apache.ibatis.annotations.Update; import com.libing.helloworld.model.Role; public interface IRoleDao { @Select("SELECT id,role_name FROM role")
@Results( value = {
@Result(id = true, property = "id", column = "id"),
@Result(property="roleName", column="role_name")
})
List<Role> findAll(); @Select("SELECT id,role_name FROM role WHERE role_name LIKE CONCAT(CONCAT('%',#{searchText}),'%')")
@Results( value = {
@Result(id = true, property = "id", column = "id"),
@Result(property="roleName", column="role_name")
})
List<Role> findBySearchText(@Param("searchText") String searchText); @Select("SELECT id,role_name FROM role WHERE id = #{id}")
@Results( value = {
@Result(id = true, property = "id", column = "id"),
@Result(property="roleName", column="role_name")
})
Role findById(Integer id); @Insert({
"INSERT INTO role(id,role_name)",
" VALUES ",
"(#{id}, #{roleName})"
})
@Options(useGeneratedKeys = true, keyProperty = "id")
@SelectKey(statement="select last_insert_id()", keyProperty = "id", before = false, resultType = int.class)
int insert(Role role); @Update({
"UPDATE role SET ",
"role_name = #{roleName} ",
"WHERE id = #{id}"
})
int update(Role role); @Delete("DELETE FROM role WHERE id = #{id}")
int deleteById(Integer id); int deleteByIds(List<Integer> ids); }
IRoleDao.java
2.1 select
基于XML方式:
<resultMap id="baseResultMap" type="com.libing.helloworld.model.Role">
<id property="id" column="id" />
<result property="roleName" column="role_name" />
</resultMap> <select id="findAll" resultMap="baseResultMap">
SELECT
id,
role_name
FROM
role
ORDER BY id ASC
</select>
基于注解方式:
@Select("SELECT id,role_name FROM role")
@Results( value = {
@Result(id = true, property = "id", column = "id"),
@Result(property="roleName", column="role_name")
})
List<Role> findAll();
单元测试:
@Test
public void findAll() {
try {
IRoleDao roleDao = sqlSession.getMapper(IRoleDao.class);
List<Role> roles = roleDao.findAll(); Assert.assertNotNull(roles);
Assert.assertTrue(roles.size() > 0);
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
}
XML中大于符号与小于符号转义:
> >
< <
或使用 <![CDATA[ ]]>
<select id="findAll" resultMap="baseResultMap">
SELECT
id,
role_name
FROM
role
WHERE id >= 10
ORDER BY id ASC
</select>
<select id="findAll" resultMap="baseResultMap">
SELECT
id,
role_name
FROM
role
WHERE id <![CDATA[>=]]> 10
ORDER BY id ASC
</select>
Role findById(Integer id);
<select id="findById" resultMap="baseResultMap">
SELECT
id,
role_name
FROM
role
WHERE
id = #{id}
</select>
@Test
public void findById() {
try {
IRoleDao roleDao = sqlSession.getMapper(IRoleDao.class);
Role role = roleDao.findById(1); Assert.assertNotNull(role);
Assert.assertNotNull(role.getRoleName());
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
}
@Select("SELECT id,role_name FROM role WHERE id = #{id}")
@Results( value = {
@Result(id = true, property = "id", column = "id"),
@Result(property="roleName", column="role_name")
})
Role findById(Integer id);
传递多个参数:
1>. 使用Map传递参数
List<Role> findByMap(Map<String, String> params);
<select id="findByMap" parameterType="map" resultMap="baseResultMap">
SELECT
id,
role_name
FROM
role
WHERE
id != #{id}
AND
role_name = #{roleName}
</select>
@Test
public void findByMap() {
try {
Map<String, String> params = new HashMap<String, String>();
params.put("id", "1");
params.put("roleName", "管理员");
IRoleDao roleDao = sqlSession.getMapper(IRoleDao.class);
List<Role> roles = roleDao.findByMap(params); Assert.assertNotNull(roles);
Assert.assertTrue(roles.size() > 0);
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
}
2>. 使用注解方式传递参数
import org.apache.ibatis.annotations.Param;
List<Role> findByAnnotation(@Param("id") Integer id, @Param("roleName") String roleName);
<select id="findByAnnotation" resultMap="baseResultMap">
SELECT
id,
role_name
FROM
role
WHERE
id != #{id}
AND
role_name = #{roleName}
</select>
3>. 使用JavaBean传递参数
package com.libing.helloworld.params;
public class RoleParam {
private Integer id;
private String roleName;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
}
RoleParam.java
List<Role> findByRoleParam(RoleParam params);
<select id="findByRoleParam" parameterType="com.libing.helloworld.params.RoleParam" resultMap="baseResultMap">
SELECT
id,
role_name
FROM
role
WHERE
id != #{id}
AND
role_name = #{roleName}
</select>
传递多个参数总结:
◊ 使用Map方式:Map扩展和维护困难,在实际应用中废弃这种传递参数方式。
◊ 使用@Param注解方式:参数个数<=5时是最佳的传参方式。
◊ JavaBean方式:当参数个数大于5个时,建议使用JavaBean方式。
2.2 insert
MyBatis在执行Insert语句之后返回一个整数,表示插入的记录数。
int insert(Role role);
<insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.libing.helloworld.model.Role">
INSERT role
(
role_name
)
VALUES
(
#{roleName}
)
</insert>
其中,useGeneratedKeys:配置MyBatis使用JDBC的getGeneratedKeys()来获取由数据库内部生成的主键值,keyProperty:指定主键字段。
@Test
public void insert() {
try {
IRoleDao roleDao = sqlSession.getMapper(IRoleDao.class); Role role = new Role();
role.setRoleName("测试");
int result = roleDao.insert(role); // 只插入一条记录
Assert.assertEquals(1, result);
// id不为null
Assert.assertNotNull(role.getId());
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.rollback();
sqlSession.close();
}
}
@Insert({
"INSERT INTO role(id,role_name)",
" VALUES ",
"(#{id}, #{roleName})"
})
@Options(useGeneratedKeys = true, keyProperty = "id")
@SelectKey(statement="select last_insert_id()", keyProperty = "id", before = false, resultType = int.class)
int insert(Role role);
2.3 update
MyBatis在执行update语句之后返回一个整数,表示更新的记录数。
int update(Role role);
<update id="update" parameterType="com.libing.helloworld.model.Role">
UPDATE role
SET
role_name = #{roleName}
WHERE
id = #{id}
</update>
@Test
public void Update() {
try {
IRoleDao roleDao = sqlSession.getMapper(IRoleDao.class); Role role = roleDao.findById(1);
Assert.assertNotNull(role); role.setRoleName("测试");
int result = roleDao.update(role); // 只修改一条记录
Assert.assertEquals(1, result); // 修改后的值
Assert.assertEquals("测试", roleDao.findById(1).getRoleName());
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.rollback();
sqlSession.close();
}
}
@Update({
"UPDATE role SET ",
"role_name = #{roleName} ",
"WHERE id = #{id}"
})
int update(Role role);
2.4 delete
MyBatis在执行delete语句之后返回一个整数,表示删除的记录数。
int deleteById(Integer id);
<delete id="deleteById">
DELETE FROM role
WHERE
id = #{id}
</delete>
@Test
public void deleteById() {
try {
IRoleDao roleDao = sqlSession.getMapper(IRoleDao.class); Assert.assertNotNull(roleDao.findById(1)); // 调用删除方法
Assert.assertEquals(1, roleDao.deleteById(1));
// 再次查询,判断是否为null
Assert.assertNull(roleDao.findById(1));
} catch (Exception e) {
e.printStackTrace();
} finally {
// 由于sqlSessionFactory.openSession()是不自动提交的,不手动执行sqlSession.commit()不会提交到数据库
sqlSession.rollback();
sqlSession.close();
}
}
@Delete("DELETE FROM role WHERE id = #{id}")
int deleteById(Integer id);
删除多条记录:
int deleteByIds(List<Integer> ids);
<delete id="deleteByIds" parameterType="java.util.List">
DELETE FROM role
WHERE
id IN
<foreach collection="list" index="index" item="item" open="("
separator="," close=")">
#{item}
</foreach>
</delete>
@Test
public void deleteByIds() {
try {
List<Integer> ids = new ArrayList<Integer>();
ids.add(1);
ids.add(2); IRoleDao roleDao = sqlSession.getMapper(IRoleDao.class);
int result = roleDao.deleteByIds(ids); Assert.assertTrue(result > 0);
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.rollback();
sqlSession.close();
}
}
MyBatis基础:MyBatis数据基本操作(2)的更多相关文章
- MyBatis基础入门《十三》批量新增数据
MyBatis基础入门<十三>批量新增数据 批量新增数据方式1:(数据小于一万) xml文件 接口: 测试方法: 测试结果: =============================== ...
- MyBatis基础入门《十二》删除数据 - @Param参数
MyBatis基础入门<十二>删除数据 - @Param参数 描述: 删除数据,这里使用了@Param这个注解,其实在代码中,不使用这个注解也可以的.只是为了学习这个@Param注解,为此 ...
- MyBatis基础入门《十 一》修改数据
MyBatis基础入门<十 一>修改数据 实体类: 接口类: xml文件: 测试类: 测试结果: 数据库: 如有问题,欢迎纠正!!! 如有转载,请标明源处:https://www.cnbl ...
- MyBatis基础入门《十》添加数据
MyBatis基础入门<十>添加数据 描述: 修改了实体类:TblClient.java,将其字段:cbirthday 由String类型改成了Date类型. TblClient.java ...
- Mybatis入门 Mybatis存在的意义 解决的问题 基本操作
Mybatis入门 Mybatis的作用 解决的问题 基本操作 为什么要学MyBatis 我们链接操作数据库需要做的步骤 package Test; import java.sql.*; public ...
- JAVA之Mybatis基础入门--框架搭建与简单查询
JAVA中,操作数据库有JDBC.hibernate.Mybatis等技术,今天整理了下,来讲一讲下Mybatis.也为自己整理下文档: hibernate是一个完全的ORM框架,是完全面向对象的.但 ...
- mybatis基础系列(四)——关联查询、延迟加载、一级缓存与二级缓存
关本文是Mybatis基础系列的第四篇文章,点击下面链接可以查看前面的文章: mybatis基础系列(三)——动态sql mybatis基础系列(二)——基础语法.别名.输入映射.输出映射 mybat ...
- mybatis基础系列(一)——mybatis入门
好久不发博客了,写博文的一个好处是能让心静下来,整理下之前学习过的一些知识一起分享,大神路过~ mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射. ...
- MyBatis基础入门《十九》动态SQL(set,trim)
MyBatis基础入门<十九>动态SQL(set,trim) 描述: 1. 问题 : 更新用户表数据时,若某个参数为null时,会导致更新错误 2. 分析: 正确结果: 若某个参数为nul ...
随机推荐
- PHP 2 语句 数据类型 字符串函数 常量
在 PHP 中,有两种基本的输出方法:echo 和 print. 在本教程中,我们几乎在每个例子中都会用到 echo 和 print.因此,本节为您讲解更多关于这两条输出语句的知识. PHP echo ...
- go中rune和byte的用处
参考:https://www.jianshu.com/p/4fbf529926ca rune是用来区分字符值和整数值的 byte 等同于int8,即一个字节长度,常用来处理ascii字符 rune 等 ...
- Node.js读取文件内容并返回值(非异步)
主要解决的问题的,以最近VsCode插件开发为例,每次请求都需要token,而vscode并不支持cookie这样的存储,所以就采用粗暴点办法,存到某个用户目录下并读取. 源码如下: var fs=r ...
- JS中navigator对象详解
<code class="language-html"><!doctype html> <html> <head> <meta ...
- Python排序算法——选择排序
有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10787340.html 一.选择排序(Sele ...
- 反射那点基础-Method
目录 1 获取 Method 1.1 方法 1.2 实例 2 Method 的方法 2.1 Java 方法基础知识 2.2 修饰符相关方法 2.2.1 获取修饰符 2.2.2 判断是否为 defaul ...
- matplotlib 入门之Pyplot tutorial
文章目录 pyplot 介绍 修饰你的图案 格式字符串 [color][marker][line] Colors Markers Line Styles 利用关键字作图(大概是数据映射到属性吧) 传入 ...
- PS调出清新淡雅外景女生背影照
首先,依然是前期事项. 这套图是八月份下午三点多在草地上拍的(好像标题的秋日欺骗了大众XD),阳光很烈,不过也因为这样,能拍出比较清新的蓝天.用的是腾龙70-200 2.8VC拍摄,长焦在拍这种空旷大 ...
- jupyter使用
jupyter使用 安装 在anaconda3的安装路径中,尽量避免使用汉字或者括号. 启动 在Windows上正确安装Anaconda3,确认配置好环境变量,然后再命令行中输入jupyter not ...
- mysql_建表
建表 某字段多个默认值 创建表时,对多选多的字段设置两个以上的默认值时,两个默认值之间用逗号','隔开,不能加空格. create table student2( id int not null, n ...