使用 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 ...
随机推荐
- mysqldump 导出数据表,和数据
目录 导出数据库表与数据 导出数据表数据 导出多个表数据 只导出数据 只导出创建表的数据 导出数据库表与数据 mysqldump -uroot -p caomall>tmp.sql 导出数据表数 ...
- P1196 [NOI2002]银河英雄传说(并查集)
P1196 [NOI2002]银河英雄传说(并查集) 本题关键 用两个一维数组表示了一个稀疏的二维数组. 这两个一维数组一个表示祖先(就是最前面那个),一个表示距离祖先的距离. 并且还有一个关键点是, ...
- linux 和win7 双系统模式下 忘记win7 密码的修改方法
首先登陆linux系统,在linux 系统下找到win7系统的安装盘(比如为C盘), (1)进入到C://windows/system32下 找到osk.exe 文件,并将其剪切到其他的地方(记住这个 ...
- Vue.js 项目接口管理
在vue开发中,会涉及到很多接口的处理,当项目足够大时,就需要定义规范统一的接口,如何定义呢? 本文使用vue-cli生成的项目举例. 第一步.在src目录下新建一个文件夹http,在http目录下建 ...
- PCB Genesis拼SET画工艺边 实现方法(一)
在PCB行业中,客户提供的PCB尺寸较小,为方便PCB加工,并生产提高生产效率,通常小于80X80mm需拼板处理的, 拼板要求可能来自按户指定拼板,也有可能是由工厂自行拼板,但对于CAM来说就需将PC ...
- maptalks 如何加载 ArcGIS 瓦片图层
最近需要加载 ArcGIS 瓦片图层,运行官网加载 ArcGIS 瓦片图层的 demo 是没有问题的.如果把 ArcGIS 瓦片图层 URL 换成是自已发布的 ArcGIS 地图服务,发现加载不出来, ...
- 认识BACnet协议
一.什么是BACnet? BACnet,Building Automation and Control networks的简称,即楼宇自动化与控制网络.是用于智能建筑的通信协议. 一般楼宇自控设备从功 ...
- HDU4947GCD Array(莫比乌斯反演+树状数组)
题面 传送门 题解 orz ljz 相当于每一个数要加上 \[v\times [\gcd(i,n)=d]=v\times [\gcd(i/d,n/d)=1]=v\times \sum_{p|{i\ov ...
- 【js】JavaScript parser实现浅析
最近笔者的团队迁移了webpack2,在迁移过程中,笔者发现webpack2中有相当多的兼容代码,虽然外界有很多声音一直在质疑作者为什么要破坏性更新,其实大家也都知道webpack1那种过于“灵活”的 ...
- PROTEUS快捷键与部分知识点
缩放 有以下几种方法对原理图进行缩放: 移动鼠标需要所放的地方,滚动鼠标滑轮进行缩放. 移动师表需要缩放的地方,按键盘F6放大,F7缩小 按下ShIFT键,鼠标左键拖拽出需要放大的区域,这叫SHIFT ...