MyBatis各种类型查询数据的参数绑定

1、前言

在使用MyBatis框架时,不可避免的需要和各种数据来打交道 ,可能的形式有查询出来一个实体对象,一个列表,一个map或者直接是一个基本类型。

为了方便说明,把所有能查的数据类型都用一个接口来进行定义:

public interface SelectMapper {
    /**
     * 根据id查询用户信息
     */
    User getUserById(@Param("id") Integer id);

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

    /**
     * 查询用户信息的总记录数
     */
    Integer getCount();

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

    /**
     * 查询所有用户信息为map集合
     */
//    List<Map<String, Object>> getAllUserToMap();
    @MapKey("id")
    Map<String, Object> getAllUserToMap();
}

2、查询一个实体类对象

查询一个实体对象的SelectMapper接口定义

public interface SelectMapper {
    /**
     * 根据id查询用户信息
     */
    User getUserById(@Param("id") Integer id);
}

对应的配置文件内容

<!--    User getUserById(@Param("id") Integer id);-->
    <select id="getUserById" resultType="User">
        select * from t_user where id = #{id}
    </select>

resultType写的就是返回值的类型
测试类:

    /**
     * MyBatis的各种查询功能:
     * 1。 若查询出的数据只有一条,可以通过实体类对象 / list集合 / map集合 来接收
     * 2。 若查询处的数据有多条,一定不能通过实体类对象来接收,此时会抛出TooManyResultsException
     */
    @Test
    public void testGetUserById(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        User userById = mapper.getUserById(4);
        System.out.println(userById);
    }

字段名和属性名无法映射处理

由于字段名和属性名不一致,而且没有创建映射关系,java中是驼峰的命名方式,而我们mysql中是下划线的命名方式,所以这时,我们就需要一些操作来将它们进行对应。
比如我们查询到的数据是;

Emp{empId=null,empName='null',age=20,gender='男'}

一般我们有三种手段来保持一致;

  1. 为查询的字段设置别名,和属性名保持一致
  2. 当字段符合MySQL的要求使用_,而属性符合java的要求使用驼峰
    此时可以在Mybatis的核心配置文件中设置一个全局配置,可以自动将下划线映射为驼峰
    emp_id--》empId ,emp_name--》empName
  3. 使用resultMap自定义映射处理

方式一:起别名

select emp_id empId,emp_name empName,age,gender from t_emp where emp_id = #{empId}

方式二:使用全局配置文件配置映射规则

    <settings>
        <!--将下划线映射为驼峰-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <select id="getEmpByEmpId" resultType="Emp">
        select * from t_emp where emp_id = #{empId}
    </select>

方式三:自定义resultmap

resultMap:设置自定义映射
resultMap 所有属性

id表示自定义映射的唯一标识
type查询的数据要映射的实体类的类型

子标签:

id设置主键的映射关系
result设置普通字段的映射关系
association设置多对一的映射关系(处理集合类型的属性)
collection设置一对多的映射关系(处理集合类型的属性)

属性:

property设置映射关系中实体类中的属性名,必须是处理的实体类类型中的属性名
column设置映射关系中表中的字段名,必须是sql查询出的某个字段
代码示例:
    <resultMap id="empResultMap" type="Emp">
        <id column="emp_id" property="empId"></id>
        <result column="emp_name" property="empName"></result>
        <result column="age" property="age"></result>
        <result column="gender" property="gender"></result>
    </resultMap>
 
    <!--    Emp getEmpByEmpId(@Param("empId") Integer empId);-->
    <select id="getEmpByEmpId" resultMap="empResultMap">
        select * from t_emp where emp_id = #{empId}
    </select>

3、查询一个list集合

SelectMapper接口:

public interface SelectMapper {
	/**
     * 查询所有用户信息
     */
    List<User> getAllUser();
}

配置文件

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

测试类:

    /**
     * MyBatis的各种查询功能:
     * 1。 若查询出的数据只有一条,可以通过实体类对象 / list集合 / map集合 来接收
     * 2。 若查询处的数据有多条,一定不能通过实体类对象来接收,此时会抛出TooManyResultsException
     */
    @Test
    public void testGetUserById(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        List<User> allUser = mapper.getAllUser();
        allUser.forEach(user -> System.out.println(user));
    }

4、查询单个数据

SelectMapper接口:

public interface SelectMapper {
    /**
     * 查询用户信息的总记录数
     */
    Integer getCount();
}

配置文件:

<!--    Integer getCount();-->
<!--    integer写大小写都可以,写 Integer/integer/_int/_integer  都可以,都是java.lang.Integer的别名-->
    <select id="getCount" resultType="java.lang.Integer">
        select count(*) from t_user
    </select>

测试类:

    /**
     * 获取记录数
     *
     * MyBatis中设置了默认的类型别名
     * Java.lang.Integer -> int, integer
     * int -> _int, _integer
     * Map -> map
     * List -> list
     */
    @Test
    public void testGetCount(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        System.out.println(mapper.getCount());
    }

其实对于很多基本类型数据,都有对应的别名,在returnType中不用写全类名,直接写对应的别名也是一样的。
而对于自己自定义的实体,也可以通过在全局配置文件中配置。配置形式有一下两种;

  • 第一种方法,给单独的某个实体类配置别名,如同下面的形式
<!--为实体类com.demo.dao.User配置一个别名User-->
<typeAliases>
    <typeAlias type="com.demo.dao.User" alias="User"/>
</typeAliases>
  • 第二种方法,批量为某个包下的所有实体类设置别名,配置形式如下
<!-- 为com.demo.dao包下的所有实体类配置别名,
MyBatis默认的设置别名的方式就是去除类所在的包后的简单的类名,
比如com.demo.dao.User这个实体类的别名就会被设置成User
 -->
<typeAliases>
        <package name="com.demo.dao"/>
</typeAliases>

在这里插入图片描述

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

SelectMapper接口:

public interface SelectMapper {
    /**
     * 根据id查询用户信息为一个map集合
     */
    Map<String, Object> getUserByIdToMap(Integer id);
}

配置文件

<!--        Map<String, Object> getUserByIdToMap(Integer id);-->
    <select id="getUserByIdToMap" resultType="map">
        select * from t_user where id = #{id}
    </select>

测试类:

    /**
     * 如果没有实体类对象,就把它映射成map集合
     * 从数据库中查询数据,将其映射为map集合
     * 例如把它传到网页端,就映射成json对象,所以转成map很常用
     *
     * 以字段为键
     */
    @Test
    public void testgetUserByIdToMap(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        System.out.println(mapper.getUserByIdToMap(4));
    }

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

SelectMapper接口:

public interface SelectMapper {
    /**
     * 查询所有用户信息为map集合,每一条记录是一个map
     */
    Map<String, Object> getAllUserToMap();
}

配置文件:

<!--        Map<String, Object> getAllUserToMap();-->
    <select id="getAllUserToMap" resultType="map">
        select * from t_user
    </select>

现在是查多条数据放在map集合里,我们会发现报错
在这里插入图片描述
我们现在查询的结果有4条,但是我们返回值设置的是个Map集合,我们一条数据转换的就是map,这时候4条数据转换4map,我们用一个map集合返回值是获取不到的。我们用的还是selectOne方法,只能获取一个结果,但是我们查询出来的结果有4条。

方式一、直接使用List来接受

既然我们一条数据转换为一个map,多条数据则是放到一个可以存储map集合的List集合中,返回值可以这样写

/**
 * 查询所有的用户信息为map集合
 * @return
 */
List<Map<String,Object>> getAllUserToMap();
@Test
public void testGetAllUserToMap(){
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
	List<Map<String, Object>> list = mapper.getAllUserToMap();
	System.out.println(list);
}

在这里插入图片描述

方式二、使用Map+@MapKey(“id”)接受

我们在接口中的方法还是可以这么写:Map<String,Object> getAllUserToMap();

因为Map集合也可以存储多条数据,但是maplist不一样,你可以直接把每条数据转换为的map放在list中,但是不能把每条数据转换为的map放在map集合中,因为map是键值对,我们查出来的数据作为值,但是谁作为键呢?所以说这时候要用到一个注解@Mapkey(),这是把我们当前查询的数据所转换的map集合,放到一个大的map集合中,通过这个注解,可以设置map集合的键。这里写的就是我们所查询出来的数据的字段,比如说我们把查询出来的id作为map的键,值就是当前的每一条数据所转换为的map集合。

@MapKey("id")
Map<String,Object> getAllUserToMap();
@Test
public void testGetAllUserToMap(){
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
	Map<String, Object> map = mapper.getAllUserToMap();
	System.out.println(map);
}	

在这里插入图片描述

注:

若查询的数据有多条时,并且要将每条数据转为map集合
此时有2种解决方案:

  1. mapper接口的方法返回值设置为泛型是maplist集合
  2. 可以将每条数据转换的map集合放在一个大的map中,但是必须要通过@MapKey注解,将查询的某个字段的值作为大的map的键
@MapKey("id")
Map<String, Object> getAllUserToMap();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis-plus是MyBatis增强工具包,用于简化CRUD操作。该工具包为MyBatis提供了一些高效,有用,即用的功能,使用它可以有效地节省您的开发时间。 Mybatis-plus特征: 与MyBatis完全兼容 启动时自动配置 开箱即用的用于操作数据库的界面 强大而灵活的条件包装器 生成主键的多种策略 Lambda样式的API 全能和高度可定制的代码生成器 自动分页操作 SQL注入防御 支持活动记录 支持可插拔的自定义界面 内置许多有用的扩展 Mybatis-plus功能: 1、单表CURD(简单 + 批量)操作,自动完成(支持 like 比较等查询)。 2、分页插件,Count查询自动或自定义SQL查询。 3、Spring根据不同环境加载不同配置支持(支持typeAliasesPackage通配符扫描)。 【自动生成Entity  Mapper  Service文件】 Mybatis-plus更新日志: v3.4.3 增加瀚高数据库支持 增加注解 Order By 支持默认排序 Wrapper exists notExists orderBy groupBy 支持参数绑定 Wrapper 支持 setParamAlias 其它优化 优化 KeyGenerator 支持多实现多数据源注入 增强 ServiceImpl 泛型推断,解决多继承与代理问题 新增 PageDto 用于微服务对象传输序列化 新增 Page 提供静态 of 构造方式 增加代理 MethodHandleProxies 对 lambda 调试支持 调整 ActiveRecord 日志对象初始化 调整 ActiveRecord 模式 Model 类开发 pkVal 方法外部可用 删除标记过时代码 优化枚举值获取方式 分页 count 安全处理 Sequence 方法支持重写支持 升级 Mybatis 3.5.7 修复自动配置 lazy-initialization 无属性提示 修复 mysql on duplicate key update 字段名判断为表名问题 修复 lambda 条件 npe 异常 重构 lambda 信息提取方法 获取 lambda 信息不在序列化 合并 gitee pulls/ 141 fixed github issues/3208 3016 fixed github issues/3482 数据权限处理器支持 union all 调整事务未启用打印提示信息 单元测试优化相关依赖升级
MyBatis是一种使用XML或注解与数据库进行交互的Java持久层框架。在MyBatis中,各种SQL指令和参数都需要绑定Java对象上,使用不同的参数类型可以使我们更轻松地操作数据库。 在MyBatis中,参数类型包括基本数据类型、包装类、Java Bean、Map和注解@Param等几种。 1. 基本数据类型和包装类:例如int、double、float等基本类型以及它们对应的包装类型Integer、Double、Float等都可以作为参数类型。在SQL语句中,我们使用#{}或${}占位符来代替这些参数。 2. Java Bean:我们也可以将自己封装的Java类作为参数传递给MyBatis的SQL语句。在这种情况下,可以使用“.”符号将属性名连接在一起进行映射。例如: ```java public class User { private int id; private String name; private int age; //getter和setter } <select id="getUserById" resultType="com.example.User"> select * from user where user_id = #{id} </select> ``` 3. Map类型:MyBatis中也可以使用Map类型来传递参数。使用Map类型的好处是我们可以灵活地在程序中添加或删除参数。例如: ```java <select id="getUserById" resultType="com.example.User"> select * from user where user_id = #{map.userId} </select> ``` 4. 注解@Param:使用@Param注解可以给SQL语句中的参数指定一个名称,使我们更加方便地调用。例如: ```java @Select("select * from user where user_name = #{name}") User getUserByName(@Param("name") String name); ``` 总之,在使用MyBatis框架的时候,我们要根据实际情况选择不同的参数类型,在这些参数类型中进行转化操作,方便我们与数据库进行交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值