• MyBatis--获取参数和各种查询


    获取参数的两种方式

    #{}: 是个占位符,会自动加上' '
    select * from t_user where username = #{username}
    select * from t_user where username = ?
    ${}:字符串拼接,需要手动加上' '
    select * from t_user where username = '${username}'
    select * from t_user where username = 'admin'
    

    在这里插入图片描述

    单个字面量类型的参数

    • 若mapper接口中的方法参数为单个的字面量类型
    • 此时可以使用$ {}和#{}以任意的名称获取参数的值,注意${}需要手动加单引号
    <mapper namespace="com.bijing.mybatis.mapper.UserMapper">
    
        <select id="getUserByUserName" resultType="User">
    
    
            select * from t_user where username = '${username}';
        select>
    mapper>  
    

    多个字面量类型的参数

    • 此时MyBatis会将参数放在map集合中,然后以两种方式存储数据
    • 第一种:arg0,arg1…为键,以参数为值
    • 第二种:param1,Param2…为键,以参数为值
    • 因此只需要通过#{}和${}访问map集合的键,就可以获取相应的值
        
        <select id="checkLogin" resultType="User">
            select * from t_user where username = #{arg0} and password = #{arg1};
        select>
    

    map集合类型的参数

    • 若mapper接口方法的参数为map集合类型的参数,
    • 只需要通过#{}和${}访问map集合的键,就可以获取相应的值
        
        <select id="checkLoginByMap" resultType="User">
            select * from t_user where username = #{username} and password = #{password};
        select>
    

    实体类类型的参数

    • 若mapper接口方法的参数类型为实体类型的参数
    • 只需要通过#{}和$ {}访问实体类中的属性名,就可以获取相对应的属性值,一定要注意${}单引号问题
        
        <insert id="insertUser">
            insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email});
        insert>
    

    使用@Param标识参数

    • 可以在mapper接口方法的参数上设置@Param注解
    • 此时MyBatis会将这些参数放在map中,以两种方式进行存储
    • 第一种:以@Param注解的value属性值为键,以参数为值
    • 第二种:以param1,param2…为键,以参数为值
    • 只需要通过#{}和 访问实体类中的属性名 , 就可以获取相对应的属性值 , 一定要注意 {}访问实体类中的属性名,就可以获取相对应的属性值,一定要注意 访问实体类中的属性名,就可以获取相对应的属性值,一定要注意{}单引号问题
        
        <select id="checkLoginByParam" resultType="User">
            select * from t_user where username = #{username} and password = #{password};
        select>
    

    相关代码

    UserMapper.java

    package com.bijing.mybatis.mapper;
    
    import com.bijing.mybatis.pojo.User;
    import org.apache.ibatis.annotations.Param;
    
    import java.util.Map;
    
    /**
     * @author 毕晶
     * MyBatis获取参数的两种方式:#{}和${}
     * #{}的本质是占位符赋值,${}的本质是字符串拼接
     * 1.若mapper接口方法的参数为单个字面量类型
     * 此时可以通过#{}和${}以任意内容获取参数值,一定要注意${}单引号问题
     * 2.若mapper接口方法的参数为多个的字面量类型
     * 此时=======MyBatis会将参数放在map集合======中,然后以两种方式存储数据
     * 第一种:arg0,arg1...为键,以参数为值
     * 第二种:param1,Param2...为键,以参数为值
     * 因此只需要通过#{}和${}访问map集合的键,就可以获取相应的值
     * 3.若mapper接口方法的参数为map集合类型的参数,
     * 只需要通过#{}和${}访问map集合的键,就可以获取相应的值
     * 4.若mapper接口方法的参数类型为实体类型的参数
     * 只需要通过#{}和${}访问实体类中的属性名,就可以获取相对应的属性值,一定要注意${}单引号问题
     * 5.可以在mapper接口方法的参数上设置@Param注解
     * 此时MyBatis会将这些参数放在map中,以两种方式进行存储
     * 第一种:以@Param注解的value属性值为键,以参数为值
     * 第二种:以param1,param2...为键,以参数为值
     * 只需要通过#{}和${}访问实体类中的属性名,就可以获取相对应的属性值,一定要注意${}单引号问题
     * @date 2022/9/27 15:38
     */
    public interface UserMapper {
        /**
         * 根据用户名查询用户信息
         *
         * @param username
         * @return
         */
        User getUserByUserName(String username);
    
        /**
         * 验证登录
         *
         * @param username
         * @param password
         * @return
         */
        User checkLogin(String username, String password);
    
        /**
         * 验证登录,以map集合为参数
         *
         * @param map
         * @return
         */
        User checkLoginByMap(Map<String, Object> map);
    
        /**
         * 添加用户
         *
         * @param user
         * @return
         */
        int insertUser(User user);
    
        /**
         * 验证登录,使用@param注解
         *
         * @param username
         * @param password
         * @return
         */
        User checkLoginByParam(@Param("username") String username, @Param("password") String password);
    }
    
    

    UserMapper.xml

    
    DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.bijing.mybatis.mapper.UserMapper">
        
        <select id="getUserByUserName" resultType="User">
            
            
            select * from t_user where username = '${username}';
        select>
    
        
        <select id="checkLogin" resultType="User">
            select * from t_user where username = #{arg0} and password = #{arg1};
        select>
        
        <select id="checkLoginByMap" resultType="User">
            select * from t_user where username = #{username} and password = #{password};
        select>
        
        <insert id="insertUser">
            insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email});
        insert>
    
        
        <select id="checkLoginByParam" resultType="User">
            select * from t_user where username = #{username} and password = #{password};
        select>
    
    
    mapper>
    

    ParameterTest.java

    package com.bijing.mybatis.test;
    
    import com.bijing.mybatis.mapper.UserMapper;
    import com.bijing.mybatis.pojo.User;
    import com.bijing.mybatis.utils.SqlSessionUtil;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @author 毕晶
     * @date 2022/9/27 19:04
     */
    public class ParameterTest {
        @Test
        public void testGetUserByUsername() throws Exception {
            SqlSession sqlSession = SqlSessionUtil.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            User admin = mapper.getUserByUserName("admin");
            System.out.println(admin);
        }
    
        @Test
        public void checkLogin() throws Exception {
            SqlSession sqlSession = SqlSessionUtil.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            User user = mapper.checkLogin("admin", "123456");
            System.out.println(user);
        }
    
        @Test
        public void checkLoginByMap() throws Exception {
            SqlSession sqlSession = SqlSessionUtil.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            Map<String, Object> map = new HashMap<>();
            map.put("username", "admin");
            map.put("password", "123456");
            User user = mapper.checkLoginByMap(map);
            System.out.println(user);
        }
    
        @Test
        public void testInsertUser() throws Exception {
            SqlSession sqlSession = SqlSessionUtil.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            User user = new User(null, "小黑子", "abcd", 18, "男", "鸡脚@qq.com");
            int result = mapper.insertUser(user);
            System.out.println(user);
        }
    
        @Test
        public void checkLoginByParam() throws Exception {
            SqlSession sqlSession = SqlSessionUtil.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            User user = mapper.checkLoginByParam("小黑子", "abcd");
            System.out.println(user);
        }
    }
    
    

    MyBatis的各种查询功能

    查询一个实体类对象

        /**
         *若sql语句的查询结果为多条时,一定不能以实体类类型作为方法的返回值
         * 否则会抛出异常TooManyResultsException
         * 若sql语句的查询结果为一条时,此时可以使用实体类类型或者List集合类型来作为方法的返回值
         */
    
        /**
         * 根据id查询用户信息
         *
         * @param id
         * @return
         */
        User getUserById(@Param("id") Integer id);
    

    查询一个list集合

        /**
         * 查询所有用户信息
         *
         * @return
         */
        List<User> getAllUser();
    

    查询单个数据

        /**
         * 查询用户的总数量
         *
         * @return
         */
        Integer getCount();
    

    查询一条数据为map的集合

        /**
         * 根据id查询用户信息为一个map集合
         *
         * @param id
         * @return
         */
        Map<String, Object> getUserByIdToMap(@Param("id") Integer id);
    

    查询多条数据为map的集合

        /**
         * 查询所有的用户信息为map集合
         * 若查询的数据有多条的时候,并且要将每条数据转换为map集合
         * 此时有两种解决方案:
         * 1.将mapper接口方法的返回值设置为泛型是map的list集合
         * 2.可以将每条数据的所转换的Map集合放到一个大的Map集合中,
         * 但是必须通过@MapKey注解设置大的Map集合的键,键对应的值就是所转换的Map集合
         *
         * @return
         */
    //    List> getAllUserToMap();
    
        //把当前查询到的数据所转换的Map集合放到一个大的Map集合中,通过MapKey注解设置大的Map集合的键,键对应的值就是所转换的Map集合
        @MapKey("id")
        Map<String, Object> getAllUserToMap();
    

    注意:有时查询到的数据没有实体类时,就要将它转换成一个map

    特殊sql的执行

    模糊查询

     /**
         * 通过用户名模糊查询用户信息
         *
         * @param name
         * @return
         */
        List<User> getUserByLike(@Param("name") String name);
    

    尽量使用第三种方式

        
        <select id="getUserByLike" resultType="User">
            
            
            select * from t_user where username like "%"#{name}"%";
        select>
    

    批量删除

        /**
         * 批量删除
         *
         * @param ids
         */
        void deleteMoreUser(@Param("ids") String ids);
    
        
        <delete id="deleteMoreUser">
            
            delete from t_user where id in(${ids});
        delete>
    

    动态设置表名

        /**
         * 动态设置表名,查询用户信息
         *
         * @param tableName
         * @return
         */
        List<User> getUserList(@Param("tableName") String tableName);
    
    
    <select id="getUserList" resultType="User">
        
        select * from ${tableName};
    select>
    

    添加功能获取自增的主键

        /**
         * 添加用户信息,并获取自增主键
         *
         * @param user
         */
        void insertUser(User user);
    
        
        
        <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
            insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email})
        insert>
    
  • 相关阅读:
    Gradient Descent
    对象的构造和析构
    RabbitMQ(八)【高级 - 过期时间 TTL】
    .NET如何快速比较两个byte数组是否相等
    基于Go语言GoFrame+Vue+ElementUI实现的权限控制系统
    17.WEB渗透测试--Kali Linux(五)
    【Linux常用命令】
    C Primer Plus(6) 中文版 第14章 结构和其他数据形式 14.7 向函数传递结构的信息
    【系统架构设计师】第四章 计算机网络
    微信小程序开发软件哪个好用?有3个判断条件!
  • 原文地址:https://blog.csdn.net/weixin_43903745/article/details/127076475