Mybatis快速入门(2)

导读:本篇文章讲解 Mybatis快速入门(2),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

CSDN话题挑战赛第2期
参赛话题:学习笔记

学习之路,长路漫漫,需要您的陪伴。
关注一波,您的关注是我最大的动力。

Mybatis

上一篇文章Mybatis快速入门(1)我们介绍了Mybatis的简单CRUD,那么当有传参时如何接收呢?
MyBatis获取参数值的两种方式:${}和#{}

${}的本质就是字符串拼接,#{}的本质就是占位符赋值

${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引
号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自
动添加单引号

1)Mybatis获取参数值

①单个字面量类型的参数

若mapper接口中的方法参数为单个的字面量类型

此时可以使用${}和#{}以任意的名称获取参数的值,注意${}需要手动加单引号

②多个字面量类型的参数

若mapper接口中的方法参数为多个时

此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1…为键,以参数为值;以

param1,param2…为键,以参数为值;因此只需要通过${}和#{}访问map集合的键就可以获取相对应的

值,注意${}需要手动加单引号

③map集合类型的参数

若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中

只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号

④实体类类型的参数

若mapper接口中的方法参数为实体类对象时

此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号

⑤使用@Param标识参数

可以通过@Param注解标识mapper接口中的方法参数

此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;以

param1,param2…为键,以参数为值;只需要通过${}和#{}访问map集合的键就可以获取相对应的值,

注意${}需要手动加单引号

2)Mybatis的各种查询功能

因为测试时经常需要用到sqlsession,所以我们抽取出来封装成一个工具类SqlSessionUtils

public class SqlSessionUtils {

    public static SqlSession getSqlSession(){
        SqlSession sqlSession = null;
        try {
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
            sqlSession = sqlSessionFactory.openSession(true);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sqlSession;
    }
}

①查询实体类对象

    SelectMapper 
	/* 
     * 查询一条记录
     */
    User getUserById(@Param("id")Integer id);
    SelectMapper.xml
	<!--User getUserById(@Param("id")Integer id);-->
    <select id="getUserById" resultType="User">
        select * from t_user where id = ${id}
    </select>
	测试
	@Test
    public void TestGetUserById() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        System.out.println(mapper.getUserById(8));
    }

查询一个list集合

    SelectMapper 
	/*
     * 查询所有记录
     */
    List<User> getAllUser();
    SelectMapper .xml
    <!--List<User> getAllUser();-->
    <select id="getAllUser" resultType="User">
        select * from t_user;
    </select>
    测试
	@Test
    public void TestGetAllUser() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        mapper.getAllUser().forEach(System.out::println);
    }

③ 查询单个数据

    SelectMapper 
    /*
     * 查询记录条数
     */
    Integer getCount();
    SelectMapper .xml
    <!--Integer getCount();-->
    <select id="getCount" resultType="Integer">
        select count(*) from t_user;
    </select>
    测试
    @Test
    public void TestGetCount() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        System.out.println(mapper.getCount());
    }

④查询一条数据为map集合

    SelectMapper 
    /*
     * 查询一条记录
     */
    Map<String,Object> getUserByIdToMap(@Param("id")Integer id);
    SelectMapper .xml
    <!--Map<String,Object> getUserByIdToMap(@Param("id")Integer id);-->
    <select id="getUserByIdToMap" resultType="map">
        select * from t_user where id = ${id}
    </select>
    测试
    @Test
    public void TestGetUserByIdToMap() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        System.out.println(mapper.getUserByIdToMap(8));
    }

⑤查询多条数据为map集合

    SelectMapper 
    /*
     * 查询所有记录(map)
     */
   	  //方法1:
//    List<Map<String,Object>> getAllUserToMap();
      //方法2:
     /*
      *  将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,
      * 就会产生多个map集合,并 且最终要以一个map的方式返回数据,此时需要
      * 通过@MapKey注解设置map集合的键,值是每条数据所对应的 map集合
      */
    @MapKey("id")
    Map<String,Object> getAllUserToMap();
    SelectMapper .xml
	<!--方法1与方法2 xml的写法一致-->
    <!--List<Map<String,Object>> getAllUserToMap();-->
    <select id="getAllUserToMap" resultType="map">
        select * from t_user;
    </select>
    测试
    @Test
    public void TestGetAllUserToMap() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        //方法1的输出方式
//        mapper.getAllUserToMap().forEach(System.out::println);
        //方法2的输出方式
        System.out.println(mapper.getAllUserToMap());
    }

3)Mybatis的获取参数举例

在ParameterMapper 接口中创建以下方法

public interface ParameterMapper {

    /*
     * 插入用户
     */
    int insertUser(User user);

    /*
     * 根据用户输入的账户和密码验证登录(Param)
     */
    User checkLoginByParam(@Param("username")String username,@Param("password")String password);

    /*
     * 根据用户输入的账户和密码验证登录(map)
     */
    User checkLoginByMap(Map<String,Object> map);

    /*
     * 根据用户名获取用户信息
     */
    User getUserByUserName(String username) ;

    /*
     * 根据用户输入的账户和密码验证登录
     */
    User checkLogin(String username,String password);
    /*
     * 查询所有的员工信息
     **/
    List<User> getAllUser() ;
}

在对应的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="com.atguigu.mybatis.mapper.ParameterMapper">

    <!--User getUserByUserName(String username) ;-->
    <select id="getUserByUserName" resultType="user">
        <!--select * from t_user where username = #{username}-->
        select * from t_user where username = '${username}'
    </select>

    <!--    User checkLogin(String username,String password) ;-->
    <select id="checkLogin" resultType="user">
        <!--select * from t_user where username = #{arg0} and password = #{arg1}-->
        select * from t_user where username = '${param1}' and password = '${param2}'
    </select>


    <!--User checkLoginByMap(Map<String,Object> map);-->
    <select id="checkLoginByMap" resultType="user">
        <!--select * from t_user where username = #{username} and password = #{password}-->
        select * from t_user where username = '${username}' and password = '${password}'
    </select>

    <!--    int insertUser(User user);-->
    <insert id="insertUser">
        insert into t_user values(null,#{username},#{password},#{age}, #{sex},#{email})
    </insert>

    <!--List<User> getAllUser() ;-->
    <select id="getAllUser" resultType="user">
        select * from t_user;
    </select>

</mapper>

测试类写法:

public class ParameterMapperTest {

    @Test
    public void testInsertUser() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
        int res = parameterMapper.insertUser(new User(1,"李四","123",24,'男',"123@qq.com"));
        System.out.println(res);
    }

    @Test
    public void testcheckLoginByMap() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
        Map<String,Object> map = new HashMap<>();
        map.put("username","admin");
        map.put("password","123456");
        User user = parameterMapper.checkLoginByMap(map);
        System.out.println(user);
    }

    @Test
    public void testcheckLogin() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
        User user = parameterMapper.checkLogin("admin","123456");
        System.out.println(user);
    }


    @Test
    public void testGetUserByUserName() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
        User user = parameterMapper.getUserByUserName("admin");
        System.out.println(user);
    }


    @Test
    public void testGetAllUser() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
        List<User> list = parameterMapper.getAllUser();
        list.forEach(System.out::println);
    }
}
/*
 * 总结:
 * Mybatis获取参数值的两种方式:#{},${}
 * ${}本质是字符串连接
 * #{}本质是占位符赋值
 * Mybatis获取参数值的各种情况
 * 1.mapper接口方法的参数为单个的字面量类型
 * 可以通过${}和#{}以任意的名称获取参数值,但是需要注意单引号问题
 * 2.mapper接口方法的参数为多个时
 * 此时mybatis会将参数封装在一个map集合里,以两种方式进行存储
 * a > 以arg0,arg1...为键,以参数为值
 * b > 以param1,param2...为键,以参数为值
 * 因此只需通过#{},${}以键的方式访问值即可,但是需要注意${}的单引号问题
 * 3.mapper接口方法的参数为多个时,也可以自定义map
 *   提前将参数放进map集合,以map为参数传递,
 *   直接通过#{},${}以自己设定的键访问值即可,但是需要注意${}的单引号问题
 * 4.mapper接口方法的参数是实体类类型
 * 只需通过#{},${}以属性的方式访问属性值即可,但是需要注意${}的单引号问题
 * 5.使用@Param注解命名参数
 * 此时mybatis会将参数封装在一个map集合里,以两种方式进行存储
 * a > 以@Param的值为键,以参数为值
 * b > 以param1,param2...为键,以参数为值
 * 因此只需通过#{},${}以键的方式访问值即可,但是需要注意${}的单引号问题
 *
 *
 * 总结:总的可分为两种情况,一个是参数是实体类的,一个是参数是使用@Param注解
 */

4)特殊SQL的执行

即#{}和${}什么时候能用什么时候不能用

Mapper接口中的写法:

public interface SqlMapper {
    /*
     * 模糊查询测试(like)
     */
    List<User> getUserByLike(@Param("username")String username);

    /*
     * 批量删除
     */
    int deleteMore(@Param("ids")String ids);

    /*
     * 查询指定表的所有数据(动态获取表名)
     */
    List<User> getUserByTableName(@Param("tableName")String tableName);

    /*
     * 插入数据获取主键
     */
    void insertUser(User user);
}

对应的xml文件中对应的写法:

	<!--List<User> getUserByLike(@Param("username")String username);-->
    <select id="getUserByLike" resultType="user">
        <!--用#{username}不行,会被当成字符串,不会解析,即 %?%,想用#号只能用第二三种-->
        <!--select * from t_user where username like '%${username}%'-->
        <!--select * from t_user where username like concat('%',#{username},'%')-->
        <!--最常用-->
        select * from t_user where username like "%"#{username}"%"
    </select>

    <!--int deleteMore(@Param("ids")String ids);-->
    <delete id="deleteMore">
        <!--不能用#{},解析时会自动加上单引号,会报错-->
        delete from t_user where id in (${ids});
        <!--delete from t_user where id > #{ids};-->
    </delete>

    <!--List<User> getUserByTableName(@Param("tableName")String tableName);-->
    <select id="getUserByTableName" resultType="user">
        <!--不能用#{},解析时会自动加上单引号,而表名不能加单引号,会报错-->
        select * from ${tableName};
    </select>

    <!--
        void insertUser(User user);
        将表中自增的字段赋值到实体类中
        useGeneratedKeys:设置当前标签中的sql使用了自增的主键
        keyProperty:将自增的主键的值赋值给传输到映射文件中的参数(这里是User)的某个属性(的id属性)
    -->
    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
        insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email})
    </insert>

测试类的写法:

	@Test
    public void testGetUserByLike() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SqlMapper mapper = sqlSession.getMapper(SqlMapper.class);
        System.out.println(mapper.getUserByLike("a"));
    }

    @Test
    public void testDeleteMore() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SqlMapper mapper = sqlSession.getMapper(SqlMapper.class);
        int res = mapper.deleteMore("5");
        System.out.println(res);
    }

    @Test
    public void testGetUserByTableName() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SqlMapper mapper = sqlSession.getMapper(SqlMapper.class);
        List<User> list = mapper.getUserByTableName("t_user");
        System.out.println(list);
    }

    @Test
    public void testInsertUser() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SqlMapper mapper = sqlSession.getMapper(SqlMapper.class);
        User user = new User(0,"王五","123",23,'男',"123@qq.com");
        mapper.insertUser(user);
        System.out.println(user);
        //输出结果:User{id=10, username='王五', password='123', age=23, sex=男, email='123@qq.com'}
    }

点赞,关注,收藏,您的支持是我更新的最大动力!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/118508.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!