MyBatis 详解(三)

发布于 2021-07-25  102 次阅读


CRUD

package ml.guest997.mapper;

import ml.guest997.pojo.User;
import java.util.List;

public interface UserMapper {
    //增加用户
    int addUser(User user);
    //删除用户
    int deleteUser(int id);
    //修改用户
    int updateUser(User user);
    //查询用户
    List<User> getUserList();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!--UserMapper.xml-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--必须指定命名空间,用于接口绑定-->
<mapper namespace="ml.guest997.mapper.UserMapper">
    <!--下面的参数设置必须与接口中的一一对应。id 就是接口中的方法名,而 parameterType 是参数类型;如果参数类型是对象类型,类属性名和数据库字段名必须相同;对象属性可以直接取出来-->
    <insert id="addUser" parameterType="ml.guest997.pojo.User">
        insert into mybatis.user (id, name, pwd) values (#{id},#{name},#{pwd})
    </insert>
    <delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id = #{id}
    </delete>
    <update id="updateUser" parameterType="ml.guest997.pojo.User">
        update mybatis.user set name = #{name},pwd = #{pwd} where id = #{id}
    </update>
    <!--下面的参数设置必须与接口中的一一对应。id 就是接口中的方法名,而 resultType 是 sql 语句执行后的返回类型;如果返回的是对象类型,类属性名和数据库字段名必须相同。只有 select 语句有 resultType 属性-->
    <select id="getUserList" resultType="ml.guest997.pojo.User">
        select * from mybatis.user
    </select>
</mapper>
package ml.guest997.mapper;

import ml.guest997.pojo.User;
import ml.guest997.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;

public class UserMapperTest {
    @Test
    public void addUser(){
        //获取 SqlSession 对象
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        //通过 SqlSession 对象的 getMapper 方法获取一个 Mapper 接口后,就可以调用它的方法了。而 sql 语句是在 MyBatis 核心配置文件加载映射文件时就读取出来了,在需要时再传给 SqlSession 对象。
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int result = userMapper.addUser(new User(4, "test", "123456"));
        if (result > 0){
            System.out.println("插入成功!");
        } else {
            System.out.println("插入失败!");
        }
        //增删改一定要提交事务,否则是不会持久化到数据库的。
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void deleteUser(){
        //获取 SqlSession 对象
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        //通过 SqlSession 对象的 getMapper 方法获取一个 Mapper 接口后,就可以调用它的方法了。而 sql 语句是在 MyBatis 核心配置文件加载映射文件时就读取出来了,在需要时再传给 SqlSession 对象。
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int result = userMapper.deleteUser(4);
        if (result > 0){
            System.out.println("删除成功!");
        } else {
            System.out.println("删除失败!");
        }
        //增删改一定要提交事务,否则是不会持久化到数据库的。
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void updateUser(){
        //获取 SqlSession 对象
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        //通过 SqlSession 对象的 getMapper 方法获取一个 Mapper 接口后,就可以调用它的方法了。而 sql 语句是在 MyBatis 核心配置文件加载映射文件时就读取出来了,在需要时再传给 SqlSession 对象。
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int result = userMapper.updateUser(new User(4, "zyp997", "666666"));
        if (result > 0){
            System.out.println("修改成功!");
        } else {
            System.out.println("修改失败!");
        }
        //增删改一定要提交事务,否则是不会持久化到数据库的。
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void getUserList(){
        //获取 SqlSession 对象
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        //通过 SqlSession 对象的 getMapper 方法获取一个 Mapper 接口后,就可以调用它的方法了。而 sql 语句是在 MyBatis 核心配置文件加载映射文件时就读取出来了,在需要时再传给 SqlSession 对象。
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = userMapper.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }
}

万能 Map

关于项目使用 Map 和实体类作为参数的优缺点:https://blog.csdn.net/qq78827534/article/details/80954178/

//Map 传参增加用户
int addUser02(Map<String,Object> map);
<!--Map 中的键不需要与数据库字段名相同,Map 中的键也是可以直接取出来-->
<insert id="addUser02" parameterType="map">
    insert into mybatis.user (id, name, pwd) values (#{user_id},#{user_name},#{user_pwd})
</insert>
@Test
public void addUser02(){
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    Map<String, Object> map = new HashMap<>();
    map.put("user_id",4);
    map.put("user_name","test");
    map.put("user_pwd","123456");
    int result = userMapper.addUser02(map);
    if (result > 0){
        System.out.println("插入成功!");
    } else {
        System.out.println("插入失败!");
    }
    //增删改一定要提交事务,否则是不会持久化到数据库的。
    sqlSession.commit();
    sqlSession.close();
}

模糊查询

参数中带有通配符

//模糊查询用户
List<User> getUser(String name);
<!--只有一个基本类型参数的情况下,可以不写 parameterType 属性-->
<select id="getUser" resultType="ml.guest997.pojo.User">
    select * from mybatis.user where name like #{name}
</select>
@Test
public void getUser(){
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    List<User> userList = userMapper.getUser("%g%");
    for (User user : userList) {
        System.out.println(user);
    }
    sqlSession.close();
}
/*结果为
User{id=1, name='Guest997', pwd='123456'}
User{id=2, name='GUEST997', pwd='123456'}
User{id=3, name='guest997', pwd='123456'}
*/

可以从结果看出,MySql 的查询是不区分大小写的。而想要区分大小写,可以在建表时加上 binary 关键字以区分大小写,如下:

create table tablename(
   `str` char(20) binary
);

或者是在查询时加上 binary 关键字以区分大小写,如下修改 XML 文件:

<select id="getUser" resultType="ml.guest997.pojo.User">
    select * from mybatis.user where binary name like #{name}
</select>

修改后的运行结果为:

User{id=3, name='guest997', pwd='123456'}

sql 语句拼接时带有通配符(可能发生 sql 注入问题)

由于与上面的代码几乎一样,只是 sql 语句改变了一点以及参数不带通配符,故下面就只给出 sql 语句。

<select id="getUser" resultType="ml.guest997.pojo.User">
    select * from mybatis.user where binary name like "%"#{name}"%"
</select>