技术框架对MyBatis的CURD操作的学习

MyBatis的CURD操作

导入 JUnit 单元测试框架

在Maven工程的 pom.xml 文件中添加 junit 单元测试框架依赖包,如下:

<!-- 导入 junit 单元测试框架依赖包 -->
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
</dependency>        

注: 如果对 JUnit 单元测试框架不了解的同学,可以看我针对 Java 单元测试框架的详细博客文章。

添加CURD接口方法

package mapper;

import entity.UserEntity;
import org.apache.ibatis.annotations.Param;
import java.util.List;

/**
 * @desc User映射器接口
 * @date 2020/6/19 上午8:59
 */
public interface UserMapper {
    /**
     * 根据年龄查询用户信息
     * @param age 年龄
     * @return user 用户实体集合
     */
    public List<UserEntity> selectUserByAge(int age);

    /**
     * 根据年龄和性别查询用户信息
     * @param userOne 获取年龄
     * @param userTwo 获取性别
     * @return 用户实体集合
     */
    public List<UserEntity> selectUserByAgeAndSex(@Param("userOne") UserEntity userOne,@Param("userTwo") UserEntity userTwo);

    /**
     * 根据姓名和年龄查询用户信息
     * @param name 姓名
     * @param user 获取年龄
     * @return
     */
    public List<UserEntity> selectUserByNameAndAge(@Param("name") String name, @Param("user") UserEntity user);

    /**
     * 查询所有用户信息
     * @return 用户实体集合
     */
    public List<UserEntity> selectUserAll();

    /**
     * 新增用户
     * @param user 用户实体
     * @return 影响行数
     */
    public int insertUser(UserEntity user);

    /**
     * 更新用户姓名
     * @param user 用户姓名
     * @return 影响行数
     */
    public int updateUser(@Param("id") int id,@Param("name") String name);

    /**
     * 根据姓名删除用户
     * @param name 用户姓名
     * @return 影响行数
     */
    public int deleteUserById(int id);
}

添加CURD接口方法对应的 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">
<!--namespace表示命名空间,填写Mapper映射器接口全路径-->
<mapper namespace="mapper.UserMapper">
    <!--结果集映射(ORM)-->
    <resultMap id="userResultMap" type="entity.UserEntity">
        <!-- propery表示UserEntity属性名,column表示tb_user表字段名-->
        <id property="id" column="id" />
        <result property="userName" column="userName" />
        <result property="password" column="password" />
        <result property="name" column="name" />
        <result property="age" column="age" />
        <result property="sex" column="sex" />
        <result property="birthday" column="birthday" />
        <result property="created" column="created" />
        <result property="updated" column="updated" />
    </resultMap>

    <!--select查询语句 id表示接口方法名 resultMap表示引用结果集映射-->
    <select id="selectUserByAge" resultMap="userResultMap">
        select * from tb_user where age > #{age};
    </select>

    <select id="selectUserByAgeAndSex" resultMap="userResultMap">
        select * from tb_user where age > #{userOne.age} and sex = #{userTwo.sex};
    </select>

    <select id="selectUserByNameAndAge" resultMap="userResultMap">
        select * from tb_user where name = #{name} and age > #{user.age};
    </select>

    <select id="selectUserAll" resultMap="userResultMap">
        select * from tb_user;
    </select>

    <insert id="insertUser">
        insert into tb_user (id,userName, password, name, age, sex, birthday, created, updated) values
        (null,#{userName},#{password},#{name},#{age},#{sex},#{birthday},now(),now());
    </insert>

    <update id="updateUser">
        update tb_user set name=#{name} where id=#{id};
    </update>

    <delete id="deleteUserById">
        delete from tb_user where id=#{id};
    </delete>
</mapper>

使用 JUnit 单元测试框架测试 CURD 接口方法

两种执行方式:
  • 使用 SqlSesion 执行 sql 操作
  • 使用 Mapper 接口(推荐)

在 test/java下创建 MyBatisTest.java 文件,如下:

import entity.UserEntity;
import mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * @author benjamin.xu
 * @desc
 * @date 2020/6/23 下午5:36
 */
public class MyBatisTest {
    private UserMapper userMapper;
    private SqlSession sqlSession;

    @Before
    public void setUp() throws Exception {
        // 指定mybatis环境配置文件
        String resource = "mybatis-config.xml";
        // 读取配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // 构建sqlSessionFactory
        SqlSessionFactory sqlSessionFactory
                = new SqlSessionFactoryBuilder().build(inputStream);

        // 获取sqlSession
        sqlSession = sqlSessionFactory.openSession();

        // 获取userMapper实例
        userMapper = sqlSession.getMapper(UserMapper.class);
    }

    @After
    public void tearDown() throws Exception {
        sqlSession.close();
    }

    @Test
    public void selectUserByAgeTest() {
        //使用 SqlSesion 执行 sql 操作
        List<UserEntity> userEntities = sqlSession.selectList("mapper.UserMapper.queryUser",24);
        Assert.assertNotNull(userEntities);
        
        //使用 Mapper 接口(推荐)
        List<UserEntity> userEntities02 = userMapper.selectUserByAge(20);
        Assert.assertNotNull(userEntities02);
    }

    @Test
    public void selectUserAllTest() {
        List<UserEntity> userEntities = userMapper.selectUserAll();
        Assert.assertEquals(2,userEntities.size());
    }

    @Test
    public void insertUserTest() throws Exception{
        UserEntity userEntity = new UserEntity();
        userEntity.setUserName("ww");
        userEntity.setName("王五");
        userEntity.setAge(21);
        userEntity.setPassword("123456");
        userEntity.setSex(1);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date birthday = sdf.parse("1992-01-10");
        userEntity.setBirthday(birthday);

        int result = userMapper.insertUser(userEntity);
        sqlSession.commit(); //提交事务
        Assert.assertEquals(1,result);
    }

    @Test
    public void updateUserTest() {
        int result = userMapper.updateUser(1,"张三三");
        sqlSession.commit();
        Assert.assertEquals(1,result);
    }

    @Test
    public void deleteUserByIdTest() {
        int result = userMapper.deleteUserById(4);
        sqlSession.commit();
        Assert.assertEquals(1,result);
    }

    @Test
    public void selectUserByAgeAndSexTest() {
        UserEntity userEntityOne = new UserEntity();
        userEntityOne.setAge(20);
        UserEntity userEntityTwo = new UserEntity();
        userEntityTwo.setSex(1);

        List<UserEntity> userEntities
                = userMapper.selectUserByAgeAndSex(userEntityOne,userEntityTwo);
        System.out.println(userEntities);
        Assert.assertNotNull(userEntities);
    }

    @Test
    public void selectUserByNameAndAgeTest() {
        UserEntity user = new UserEntity();
        user.setAge(20);

        List<UserEntity> userEntities =
                userMapper.selectUserByNameAndAge("李四",user);
        System.out.println(userEntities);
        Assert.assertNotNull(userEntities);
    }
}

增删改返回值说明

mybatis中对db执行增删改操作,不管是新增、删除、还是修改,最后都会去调用jdbc中对应的方法,要么是调用java.sql.StatementexecuteUpdate的方法,要么是调用java.sql.PreparedStatementexecuteUpdate方法,这2个类的方法名称都是executeUpdate,他们的参数可能不一样,但是他们的返回值都是int,说明增删改的返回值都是int类型的,表示影响的行数,比如插入成功1行返回结果就是1,删除了10行记录,返回就是10,更新了5行记录,返回的就是5。

那么我们通过Mybatis中的Mapper接口来对db增删改的时候,mybatis的返回值支持哪些类型呢?

int类型那肯定是支持的,jdbc执行增删改默认返回int类型,那mybatis当然也支持这个类型。

但是mybatis的返回值比jdbc更强大,对于增删改还支持下面几种类型:

intIntegerlong LongbooleanBooleanvoid

mapper的增删改方法返回值必须为上面的类型,mybatis内部将jdbc返回的int类型转换为上面列表中指定的类型,我们来看一下mybatis这块的源码,源码在下面的方法中:

org.apache.ibatis.binding.MapperMethod#rowCountResult

mybatis中会使用上面这个方法最后会对jdbc 增删改返回的int结果进行处理,处理为mapper接口中增删改方法返回值的类型。

int、Integer、long、Long我们就不说了,主要说一下返回值是boolean、Boolean类型,如果影响的行数大于0了,将返回true。

posted @ 2024-12-03 20:44  BingBing爱化学-04044  阅读(3)  评论(0编辑  收藏  举报