使用 MyBatis 对表执行 CRUD 操作
说明:
1、CRUD: C -- create R -- read U -- update D -- delete
2、Mybatis 的 SQL 核心配置文件中 SQL 语句的参数的传递使用 #{...}
3、以用户表为例讲解 CRUD 操作
1、定义 UserMapper 接口
UserMapper.java 文件的内容如下:
package cn.mybatis.dao; import java.util.List;
import org.apache.ibatis.annotations.Param;
import cn.mybatis.pojo.User; public interface UserMapper { /**
* 查询用户表记录数
* @return
*/
public int count(); /**
* 查询用户表所有用户
* @return
*/
public List<User> findAllUser(); /**
* 单条件查询:根据用户名称查询用户列表(模糊查询)
* @param userName 用户名称
* @return
*/
public List<User> getUserListByUserName(String userName); /**
* 多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:对象入参)
* @param user 对象入参
* @return
*/
public List<User> getUserListByUserNameAndUserRole(User user); /**
* 添加操作:实现向用户表添加用户
* @param user 对象入参
* @return
*/
public int addUser(User user); /**
* 修改操作:实现根据用户 id 修改用户信息的操作
* @param user 对象入参
* @return
*/
public int update(User user); /**
* 修改操作:实现根据用户 id 修改用户密码(使用 @param 注解实现)
* @param id
* @param pwd
* @return
*/
public int updatePwd(@Param("id")Integer id,@Param("userPwd")String pwd); /**
* 删除操作:实现根据用户 id 删除用户的操作
* @param id 用户 id
* @return
*/
public int delete(Integer id);
}
2、定义 sql 映射文件(.xml)
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="cn.mybatis.dao.UserMapper"> <!-- MyBatis 实现查询操作,使用的是 select 元素来映射插入语句 --> <!-- 查询用户表记录数 (*/0/1)-->
<select id="count" resultType="int">
select count(1) as count from smbms_user
</select> <!-- 查询用户表所有用户 -->
<select id="findAllUser" resultType="user">
select * from smbms_user
</select> <!--单条件查询:根据用户名称查询用户列表(模糊查询); 参数传递:#{参数名}-->
<select id="getUserListByUserName" resultType="user" parameterType="string">
SELECT * FROM smbms_user WHERE userName LIKE CONCAT('%',#{userName},'%')
</select> <!--多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:对象入参); 参数传递:#{属性名}(参数对象中的属性名) -->
<select id="getUserListByUserNameAndUserRole" resultType="user" parameterType="user">
SELECT * FROM smbms_user WHERE userName LIKE CONCAT('%',#{userName},'%') AND userRole=#{userRole}
</select> <!--
1、MyBatis 实现增加操作,使用的是 insert 元素来映射插入语句
2、添加操作:实现向用户表添加用户; 参数传递:#{属性名}(参数对象中的属性名)
-->
<insert id="addUser" parameterType="user">
INSERT INTO `smbms_user` (`userCode`,`userName`,`userPassword`,`gender`,`birthday`,`phone`,`address`,`userRole`,`createdBy`,`creationDate`)
VALUES (#{userCode},#{userName},#{userPassword},#{gender},#{birthday},#{phone},#{address},#{userRole},#{createdBy},#{creationDate})
</insert> <!--
1、MyBatis 实现修改操作:使用的是 update 元素来映射修改语句
2、修改操作:实现根据用户 id 修改用户信息的操作 ; 参数传递:#{属性名}(参数对象中的属性名)
-->
<update id="update" parameterType="user">
UPDATE `smbms_user`
SET `userCode`=#{userCode},`userName`=#{userName},`userPassword`=#{userPassword},
`gender`=#{gender},`birthday`=#{birthday},`phone`=#{phone},`address`=#{address},
`userRole`=#{userRole},`modifyBy`=#{modifyBy},`modifyDate`=#{modifyDate}
where id=#{id}
</update> <!--修改操作:实现根据用户 id 修改用户密码(使用 @param 注解实现)-->
<update id="updatePwd">
UPDATE `smbms_user` SET userPassword=#{userPwd} WHERE id=#{id}
</update> <!--
1、MyBatis 实现删除操作,是使用 delete 元素来映射删除语句
2、删除操作:实现根据用户 id 删除用户的操作
-->
<delete id="delete" parameterType="integer">
DELETE FROM `smbms_user` WHERE id=#{id}
</delete>
</mapper>
3、编写单元测试类
UserMapperTest.java 文件的内容如下:
package cn.mybatis.test; import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import cn.mybatis.dao.UserMapper;
import cn.mybatis.pojo.User;
import cn.mybatis.util.MyBatisUtil; public class UserMapperTest { SqlSession session = null; @Test // 测试获取 session
public void test() {
System.err.println(MyBatisUtil.getSqlSession());
} @Before // 每次执行 @Test 方法之前会执行这个方法
public void initSession() {
session = MyBatisUtil.getSqlSession();
} @After // 每次执行 @Test 方法之后会执行这个方法
public void closeSession() {
MyBatisUtil.close(session);
} @Test // 测试查询用户表记录数
public void testCount() {
int count = 0;
count = session.getMapper(UserMapper.class).count();
System.out.println(count);
} @Test // 测试查询用户表所有用户
public void testFindAllUser() {
List<User> userList = null;
userList = session.getMapper(UserMapper.class).findAllUser();
for (User user : userList) {
System.out.println(user);
}
} @Test // 测试根据用户名称查询用户列表(模糊查询)
public void testGetUserListByUserName() {
List<User> userList = null;
String userName = "李";
userList = session.getMapper(UserMapper.class).getUserListByUserName(userName);
for (User user : userList) {
System.out.println(user);
}
} @Test // 测试多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表
public void testGetUserListByUserNameAndUserRole() {
List<User> userList = null;
User user = new User();
user.setUserName("孙");
user.setUserRole(3);
userList = session.getMapper(UserMapper.class).getUserListByUserNameAndUserRole(user);
for (User u : userList) {
System.out.println(u);
}
} @Test // 测试添加操作:实现向用户表添加用户
public void testAddUser() {
int count = 0;// 返回执行 SQL 影响的行数
try {
User user = new User();
user.setUserCode("weixin");
user.setUserName("魏子轩");
user.setUserPassword("123456");
Date birthday;
birthday = new SimpleDateFormat("yyyy-MM-dd").parse("1997-08-15");
user.setBirthday(birthday);
user.setAddress("深圳市南山区南头古城");
user.setGender(20);
user.setPhone("18926477245");
user.setUserRole(1);
user.setCreatedBy(1);
user.setCreationDate(new Date());
count = session.getMapper(UserMapper.class).addUser(user);
// 模拟异常,进行回滚
// int i=2/0;
session.commit(); // 提交事务(MyBatisUtil 中设置了不自动提交事务,因此手动提交)
} catch (ParseException e) {
e.printStackTrace();
session.rollback();// 发生异常就回滚
count = 0;
}
System.out.println(count);
} @Test // 测试修改操作:实现根据用户 id 修改用户信息的操作
public void testUpdate() {
int count = 0;// 返回执行 SQL 影响的行数
try {
User user = new User();
user.setId(16);
user.setUserCode("liuxinxin");
user.setUserName("刘鑫鑫");
user.setUserPassword("123456");
Date birthday = new SimpleDateFormat("yyyy-MM-dd").parse("1996-08-15");
user.setBirthday(birthday);
user.setAddress("江西南昌");
user.setGender(2);
user.setPhone("13340090067");
user.setUserRole(2);
user.setModifyBy(1);
user.setModifyDate(new Date());
count = session.getMapper(UserMapper.class).update(user);
// 模拟异常,进行回滚
// int i=2/0;
session.commit(); // 提交事务(MyBatisUtil 中设置了不自动提交事务,因此手动提交)
} catch (ParseException e) {
e.printStackTrace();
session.rollback();// 发生异常就回滚
count = 0;
}
System.out.println(count);
} @Test // 测试修改操作:实现根据用户 id 修改用户密码(使用 @param 注解实现)
public void updatePwd() {
int count = 0;// 返回执行 SQL 影响的行数
Integer id = 1;
String pwd = "123456";
count = session.getMapper(UserMapper.class).updatePwd(id, pwd);
session.commit(); // 提交事务(MyBatisUtil 中设置了不自动提交事务,因此手动提交)
System.out.println(count);
} @Test // 测试删除操作:实现根据用户 id 删除用户的操作
public void testDelete() {
int count = 0; // 返回执行 SQL 影响的行数
try {
Integer id = 16;
count = session.getMapper(UserMapper.class).delete(id);
session.commit(); // 提交事务(MyBatisUtil 中设置了不自动提交事务,因此手动提交)
} catch (Exception e) {
e.printStackTrace();
session.rollback();// 发生异常就回滚
count = 0;
}
System.out.println(count);
}
}
注意点
1、为了使数据库查询的结果和返回类型中的属性能够自动匹配以便开发,对于 MySQL 数据库和 JavaBean 都会采用同一套命名规则,即 Java 命名驼峰规则,这样就不需要再做映射(注:数据库表的字段名和属性名不一致的情况下需要手动映射)。注意参数的传递使用 #{ 参数名 },它告诉 MyBatis 生成 PreparedStatement 参数。
2、MyBatis 传入参数类型可以是 Java 基础数据类型,但是只适用于一个参数的情况,通过 {参数名}即可获取传入的值。若是多参数入参,需要复杂数据类型来支持,包括 Java 实体类、Map,通过#{属性名}或#{Map的key}来获取传入的参数值。
3、对于增删改(insert,update,delete)这类数据库更新操作,需要注意两点:
(1)该类型的操作本身默认返回执行 SQL 影响的行数,所以 DAO 层的接口方法的返回值一般设置为 int 类型。最好不要返回 boolean 类型。
(2) insert、update、delete 元素中均没有 resultType 属性,只有查询操作需要对返回结果类型( resultType / resultMap )进行相应的指定。
使用 MyBatis 对表执行 CRUD 操作的更多相关文章
- 使用MyBatis对表执行CRUD操作
一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: <?xml version="1.0&quo ...
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013540.html 上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybati ...
- MyBatis入门学习教程-使用MyBatis对表执行CRUD操作
上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
一.使用MyBatis对表执行CRUD操作--基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: 1 <?xml version="1.0&q ...
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
上一篇博文MyBatis学习总结(一)——MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...
- MyBatis学习总结_02_使用MyBatis对表执行CRUD操作
一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: 1 <?xml version="1.0&q ...
- 【转】MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
[转]MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作 上一篇博文MyBatis学习总结(一)——MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据, ...
- 【Mybatis】MyBatis对表执行CRUD操作(三)
本例在[Mybatis]MyBatis配置文件的使用(二)基础上继续学习对表执行CRUD操作 使用MyBatis对表执行CRUD操作 1.定义sql映射xml文件(EmployeeMapper.xml ...
- MyBatis学习笔记(二)——使用MyBatis对表执行CRUD操作
转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4262895.html 上一篇博文MyBatis学习总结(一)——MyBatis快速入门中我们讲了如何使用My ...
- 二:MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
上一篇博文MyBatis学习总结(一)——MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...
随机推荐
- [Android6.0][RK3399] 双屏异显代码实现流程分析(二)【转】
本文转载自:http://blog.csdn.net/dearsq/article/details/55050125 Patch Code dtsi rk3399-androiddtsi rk3399 ...
- 【POJ 3233】Matrix Power Series
[题目链接] 点击打开链接 [算法] 要求 A^1 + A^2 + A^3 + ... + A^k 考虑通过二分来计算这个式子 : 令f(k) = A^1 + A^2 + A ^ 3 + ... + ...
- pycharm打开多个项目并存
问题: 有时我们需要打开多个项目,而现在的做法是: 原有的a项目不动,新打开一个pycharm来打开b项目, 或者 在原有的a项目中打开b项目并覆盖a项目,即a项目与b项目不能共存 需求: 有时我们 ...
- 再读headfirst-原则与模式摘录
原则 1.找到原则中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起 2.针对接口编程,而不是针对实现编程 3.多用组合,少用继承 4.依赖倒置原则:要依赖抽象,不要依赖具体类(不 ...
- codeforces 402E - Strictly Positive Matrix【tarjan】
首先认识一下01邻接矩阵k次幂的意义:经过k条边(x,y)之间的路径条数 所以可以把矩阵当成邻接矩阵,全是>0的话意味着两两之间都能相连,也就是整个都要在一个强连通分量里,所以直接tarjan染 ...
- Sql 主键设置
1.开发数据库时常用命名规范 1>.使用不包含数字的单数表名,如果必要的话可以增加模块名前缀. 2>.对于主键的命名,使用表名+ID的形式. 3>.作为外键的列的名字应该与它们所对应 ...
- 基于.Net Core的API框架的搭建(3)
5.加入缓存支持 我们希望为项目增加缓存支持,我们选择Redis做为缓存数据库. 首先,我们在Services目录增加一个缓存接口类ICacheService: using System; using ...
- 制作并发布个人CocoaPods库
随着对 CocoaPods 越来越多的依赖,我们也可以尝试把自己的库发布到它上面. 1.在Github上新建一个项目(名字我随便取了一个,其他步骤截图为WCUIKit).自己做相应修改即可. 2.克隆 ...
- 图论 HDOJ 5348 MZL's endless loop
题目传送门 /* 题意:给一个n个点,m条边的无向图,要求给m条边定方向,使得每个定点的出入度之差的绝对值小于等于1. 输出任意一种结果 图论:一个图,必定存在偶数个奇度顶点.那么从一个奇度定点深搜, ...
- DFS(连通块) HDU 1241 Oil Deposits
题目传送门 /* DFS:油田问题,一道经典的DFS求连通块.当初的难题,现在看上去不过如此啊 */ /************************************************ ...