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 ...
随机推荐
- 转://Window下安装Oracle ASM单实例数据库
之前做的Oracle ASM实验都是基于Linux或者Unix操作系统的,最近想试试如何在Windows环境下使用Oracle ASM.本文介绍如何在windows下创建裸设备,并创建ASM磁盘组以及 ...
- 五、Oracle 分组查询、视图
一.分组函数1.avg:平均分2.sum:求和3.max:最大值4.min:最小值注意:前面四个必须针对数值字段,且参数只能是一个5.count:求个数 二.分组查询1.语法是 group by 分组 ...
- ActiveMQ 控制台使用方法
一.为什么使用ActiveMQ 在总线的设计中可能会使用到JMS(Java Message Service)通道, Java消息服务(JMS)超越了生产商专有的MOM(Message-Oriented ...
- ScriptManager的几个属性和方法
ScriptManager的几个属性和方法 一.EnablePageMethods ScriptManager的EnablePageMethods属性用于设定客户端javascript直接调用服务 ...
- docker 12 docker容器数据卷
数据卷概念 ♣我们知道,当我们把一个运行中的容器关闭后,容器里的数据就没有了(如果你做了docker commit操作,数据会保留到新的镜像里面).所以我们就需要用容器数据卷把容器数据进行持久化储存. ...
- JUnit5 快速指南
JUnit5 快速指南 version: junit5 1. 安装 2. JUnit 注解 3. 编写单元测试 3.1. 基本的单元测试类和方法 3.2. 定制测试类和方法的显示名称 3.3. 断言( ...
- redis底层设计(五)——内部运作机制
5.1 数据库 5.1.1 数据库的结构: Redis 中的每个数据库,都由一个redis.h/redisDb 结构表示: typedef struct redisDb { // 保存着数据库以整数表 ...
- 内联函数:static inline 和 extern inline 的含义
引入内联函数的目的是为了解决程序中函数调用的效率问题. 函数是一种更高级的抽象.它的引入使得编程者只关心函数的功能和使用方法,而不必关心函数功能的具体实现:函数的引入可以减少程序的目标代码,实现程序代 ...
- Java执行JavaScript脚本破解encodeInp()加密
一:背景 在模拟登录某网站时遇到了用户名和密码被JS进行加密提交的问题,如图: 二:解决方法 1.我们首先需要获得该JS加密函数,一般如下: conwork.js var keyStr = " ...
- Windows Community Toolkit 4.0 - DataGrid - Part02
概述 在上面一篇 Windows Community Toolkit 4.0 - DataGrid - Part01 中,我们针对 DataGrid 控件的 CollectionView 部分做了详细 ...