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 ...
随机推荐
- java 定时任务多线程处理
@Configuration@EnableSchedulingpublic class ScheduleConfig implements SchedulingConfigurer, AsyncCon ...
- StackExchange.Redis使用配置
转自:http://www.cnblogs.com/deosky/p/4848403.html Configurationredis有很多不同的方法来配置连接字符串 , StackExchange.R ...
- [Micropython]TPYBoard v202 v102+v202 家庭无线温湿度检测
一.实验器件 1.TPYBoard v102 1块 2.TPYBoard v202 1块 3.Nokia 5110LCD显示屏 1块 4.DHT11温湿度传感器 1个 5.micro USB 数据线 ...
- Android测试(一):在Android中测试App
原文:https://developer.android.com/training/testing/index.html 测试你的App是开发过程中的重要组成部分.通过对应用程序持续的运行测试,你可以 ...
- redis学习(二)——String数据类型
一.概述 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型的 ...
- Linux Namespace : 简介
在初步的了解 docker 后,笔者期望通过理解 docker 背后的技术原理来深入的学习和使用 docker,接下来的几篇文章简单的介绍下 linux namespace 的概念以及基本用法. na ...
- 小程序解决方案 Westore - 组件、纯组件、插件开发
数据流转 先上一张图看清 Westore 怎么解决小程序数据难以管理和维护的问题: 非纯组件的话,可以直接省去 triggerEvent 的过程,直接修改 store.data 并且 update,形 ...
- 一次linux服务器黑客入侵后处理
场景: 周一上班centos服务器ssh不可用,web和数据库等应用不响应.好在vnc可以登录 使用last命令查询,2号之前的登录信息已被清空,并且sshd文件在周六晚上被修改,周日晚上2点服务器 ...
- 通过 sass-resources-loader 全局注册 Sass/Less 变量
使用webpack引入sass/less全局变量 sass或者less都提供变量设置,在需求切换主题的项目中使用less或者sass变量,只要修改变量值,编译后所有用到该变量的样式都会被修改为你想要的 ...
- Linux查看端口
1.lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000 2.netstat -tunlp |grep 端口号 用于查看指定的端口号的进程情况 ...