mybatis学习笔记(第二部分)

简介: 自学笔记

5、MyBatis获取参数值的两种方式

  • MyBatis获取参数值的两种方式:${}和#{}
  • ${}的本质就是字符串拼接,#{}的本质就是占位符赋值
  • ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号;

5.1、单个字面量类型的参数

  • 若mapper接口中的方法参数为单个的字面量类型
  • 此时可以使用${}和#{}以任意的名称获取参数的值,注意{}需要手动加单引号
  • mapper接口,此时只有一个参数
public interface UserMapper {
   
    //根据用户名查询用户信息
    User getUserByUsername(String username);
  • mapper接口映射
<!--User getUserByUsername(String username);-->
    <select id="getUserByUsername" resultType="user">
        SELECT * FROM t_user WHERE username = #{
   username}
    </select>
  • 测试
public class ParameterTest {
   
    @Test
    public void testGetUserByUsername(){
   
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserByUsername("admin");
        System.out.println(user);
    }

5.2、多个字面量类型的参数

  • 若mapper接口中的方法参数为多个时
  • 此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1...为键,以参数为值;以 param1,param2...为键,以参数为值;因此只需要通过${}和#{}访问map集合的键就可以获取相 对应的 值,注意​{}需要手动加单引号
  • mapper接口,此时有两个参数
public interface UserMapper {
   
    //根据用户名密码验证登录的功能
    User checkLogin(String username,String password);
}
  • mapper接口映射
<!--checkLogin(String username,String password);-->
    <select id="checkLogin" resultType="User">
        SELECT * FROM t_user WHERE #{
   param1} and password = #{
   param2}
    </select>
  • 测试
 @Test
    public void checkLogin(){
   
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.checkLogin("admin", "123456");
        sqlSession.close();
    }

5.3、map集合类型的参数

  • 若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在 map中
  • 只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意​{}需要手动加单引号
  • mapper接口,用map集合去自定义
public interface UserMapper {
   
    //验证登录(以map集合作为参数)
    User checkLoginByMap(Map<String,Object>map);
}
  • mapper接口映射
<!--User checkLoginByMap(Map<String,Object>map);-->
<select id="checkLoginByMap" resultType="user">
    SELECT * FROM t_user WHERE username =#{
   username} AND password =#{
   password}
</select>
  • 测试
    @Test
    public void checkLoginByMap(){
   
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Map<String,Object> map = new HashMap<>();
        map.put("username","admin");
        map.put("password","123456");
        mapper.checkLoginByMap(map);
        sqlSession.close();
    }

5.4、实体类类型的参数

  • 若mapper接口中的方法参数为实体类对象时
  • 此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意​{}需要手动加单引号
  • mapper接口
public interface UserMapper {
   
    //添加用户信息的功能
    void insertUser(User user);
}
  • mapper接口映射
<!-- void insertUser(User user);-->
    <insert id="insertUser" >
        INSERT INTO t_user VALUES(NULL,#{
   username},#{
   password},#{
   age},#{
   sex},#{
   email})
    </insert>
  • 测试
@Test
    public void testInsertUser(){
   
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = new User(null,"root","112345",3,"男","1545@qq.com");
        mapper.insertUser(user);
        sqlSession.close();
    }

5.5、使用@Param标识参数

  • mapper接口
public interface UserMapper {
   
    //验证登录(使用param注解)
    User CheckLoginByParam(@Param("username") String username, @Param("password") String password);
}
  • mapper接口映射
<!--(使用param注解)
    User CheckLoginByParam(@Param("username") String username, @Param("password") String password);-->
    <select id="CheckLoginByParam" resultType="user">
        SELECT * FROM t_user WHERE username = #{
   username} AND password = #{
   password}
    </select>
  • 测试
@Test
    public void testCheckLoginByParam(){
   
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.CheckLoginByParam("admin", "123456");
        sqlSession.close();
    }
  • 可以通过@Param注解标识mapper接口中的方法参数
  • 此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;以 param1,param2...为键,以参数为值;只需要通过${}和#{}访问map集合的键就可以获取相对应 的值,注意​{}需要手动加单引号

5.6、总结

Mybatis获取参数值的两种方式:#{} ${}
#{}的本质是占位符赋值,${}的本质是字符串拼接
1、若mapper接口方法的参数为单个的字面量类型
此时#{}和{mathJaxContainer[0]}{}的单引号问题

2、若mapper接口方法的参数为多个的字面量类型
此时mybatis会将参数放在map集合中,以两种方式存储数据
 1)以arg0,arg1...为键,以参数为值
 2)以param1,param2,...为键,以参数为值
因此,只需要通过#{}访问map的键来获取map的值。也可${},注意单引号

下面省略说明{mathJaxContainer[1]}{}实现,且注意加单引号
3、若mapper接口方法的参数为一个map集合类型的参数
只需要通过#{}访问map集合的键来获取map的值。

4、若mapper接口方法的参数为实体类类型的参数
只需要通过#{}访问实体类中的属性名,就可以获取响应的属性值
什么是属性:是get方法去掉‘get’之后的字符串,首字母小写的名称。
因为有时候没有声明成员变量,但是可以在getset方法中去访问到对应的属性的

5、可以在mapper接口方法的参数上设置@param注解
此时Mybatis会将这些参数放在map中,以两种方式进行存储
1)以@Param注解的value属性值为键,以参数为值
2)以param1,param2...为键,以参数为值

真正使用的就是两种情况:
1.使用注解(包括了情况1,2,3,5  这些情况下建议都用注解)
2.使用实体类对象,直接通过实体类属性获取值就可

6、MyBatis的各种查询功能

6.1、查询一个实体类对象

    /**
     * 若sql语句查询的结果为多条时,一定不能以实体类类型作为方法的返回值
     * 否则会抛出异常TooManyResultsException,因为底层调用sqlSession.selectOne方法
     *
     */
    //根据id查询用户信息
    User getUserById(@Param("id") Integer id);
<!--User getUserById(@Param("id") int id);-->
<select id="getUserById" resultType="User">
select * from t_user where id = #{id}
</select>

6.2、查询一个list集合

/**
* 查询所有用户信息
* @return
*/
List<User> getUserList();
<!--List<User> getUserList();-->
<select id="getUserList" resultType="User">
select * from t_user
</select>
  • 当查询的数据为多条时,不能使用实体类作为返回值,否则会抛出异常
  • TooManyResultsException;但是若查询的数据只有一条,可以使用实体类或集合作为返回值

6.3、查询单个数据

/**
* 查询用户的总记录数
* @return
* 在MyBatis中,对于Java中常用的类型都设置了类型别名
* 例如: java.lang.Integer-->int|integer
* 例如: int-->_int|_integer
* 例如: Map-->map,List-->list
*/
int getCount();
<!--int getCount();-->
<select id="getCount" resultType="_integer">
select count(id) from t_user
</select>

6.4、查询一条数据为map集合

/**
* 根据用户id查询用户信息为map集合
* @param id
* @return
*/
Map<String, Object> getUserToMap(@Param("id") int id);
<!--Map<String, Object> getUserToMap(@Param("id") int id);-->
<!--结果: {password=123456, sex=男 , id=1, age=23, username=admin}-->
<select id="getUserToMap" resultType="map">
select * from t_user where id = #{id}
</select>

6.5、查询多条数据为map集合

  • 方式一:
/**
* 查询所有用户信息为map集合
* @return
* 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,此
时可以将这些map放在一个list集合中获取
*/
List<Map<String, Object>> getAllUserToMap();
<!--Map<String, Object> getAllUserToMap();-->
<select id="getAllUserToMap" resultType="map">
select * from t_user
</select>
  • 方式二:
/**
* 查询所有用户信息为map集合
* @return
* 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,并
且最终要以一个map的方式返回数据,此时需要通过@MapKey注解设置map集合的键,值是每条数据所对应的
map集合
*/
@MapKey("id")
Map<String, Object> getAllUserToMap();
<!--Map<String, Object> getAllUserToMap();-->
<!--
{
1={password=123456, sex=男, id=1, age=23, username=admin},
2={password=123456, sex=男, id=2, age=23, username=张三},
3={password=123456, sex=男, id=3, age=23, username=张三}
}
-->
<select id="getAllUserToMap" resultType="map">
select * from t_user
</select>
相关文章
|
1月前
|
SQL Java 关系型数据库
MyBatisPlus学习笔记(SpringBoot版)
MyBatisPlus学习笔记(SpringBoot版)
99 0
|
8月前
|
XML Java 数据库连接
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-mybatis的概述2
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-mybatis的概述2
37 0
|
8月前
java202304java学习笔记第六十六天-ssm-mybatis-接口代理方法实现
java202304java学习笔记第六十六天-ssm-mybatis-接口代理方法实现
30 0
|
7月前
|
SQL Java 关系型数据库
|
7月前
|
SQL Java 关系型数据库
|
7月前
|
SQL Java 关系型数据库
|
8月前
java202304java学习笔记第六十六天-ssm-mybatis的dao层实现1
java202304java学习笔记第六十六天-ssm-mybatis的dao层实现1
24 0
|
8月前
java202304java学习笔记第六十六天-ssm-mybatis中dao层实现-动态sql-foreach之2
java202304java学习笔记第六十六天-ssm-mybatis中dao层实现-动态sql-foreach之2
33 0
|
8月前
java202304java学习笔记第六十六天-ssm-mybatis中dao层实现-动态sql-if之1
java202304java学习笔记第六十六天-ssm-mybatis中dao层实现-动态sql-if之1
24 0