区块链技术博客
www.b2bchain.cn

笔记02 Mapper接口传参

这篇文章主要介绍了笔记02 Mapper接口传参的讲解,通过具体代码实例进行17732 讲解,并且分析了笔记02 Mapper接口传参的详细步骤与相关技巧,需要的朋友可以参考下https://www.b2bchain.cn/?p=17732

本文实例讲述了2、树莓派设置连接WiFi,开启VNC等等的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7039.html。具体如下:

文章目录

  • mapper接口传参的各种方式
    • 传递一个java对象参数
    • 多参数传递[email protected]
    • 传递集合参数
    • ResultHandler作为参数

mapper接口传参的各种方式

传递一个参数  传递一个Map参数  传递一个javabean参数  多参数中用@param指定参数名称  java编译中参数名称的处理  mapper接口传参源码分析  传递1个Collection参数  传递1个List参数  传递1个数组参数  mybatis对于集合处理源码分析  ResultHandler作为参数的用法 

UserModel

@Setter @Getter @NoArgsConstructor @AllArgsConstructor @Builder @ToString public class UserModel {     private Long id;     private String name;     private Integer age;     private Double salary;     private Integer sex; }  

UserMapper

public interface UserMapper {     /**      * 通过name查询      *      * @param name      * @return      */     UserModel getByName(String name);      /**      * 通过map查询      *      * @param map      * @return      */     List<UserModel> getByMap(Map<String, Object> map);      /**      * 通过UserFindDto进行查询      *      * @param userFindDto      * @return      */     List<UserModel> getListByUserFindDto(UserFindDto userFindDto);      /**      * 通过id或者name查询      *      * @param id      * @param name      * @return      */     UserModel getByIdOrName(@Param("userId") Long id, @Param("userName") String name);      /**      * 查询用户id列表      *      * @param idCollection      * @return      */     List<UserModel> getListByIdCollection(Collection<Long> idCollection);      /**      * 查询用户id列表      *      * @param idList      * @return      */     List<UserModel> getListByIdList(List<Long> idList);      /**      * 查询用户id列表      *      * @param idArray      * @return      */     List<UserModel> getListByIdArray(Long[] idArray);      void getList(ResultHandler<UserModel> resultHandler);  }  

测试类

@Slf4j public class test {      private InputStream in;     private SqlSession sqlSession;     private UserMapper userMapper;      @Before//用于在测试方法执行之前执行     public void init()throws Exception{     //1.读取配置文件,生成字节输入流     in = Resources.getResourceAsStream("Mybatis.xml");     //2.获取SqlSessionFactory     SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);     //3.获取SqlSession对象     sqlSession = factory.openSession(true);     //4.获取dao的代理对象         userMapper = sqlSession.getMapper(UserMapper.class);     }      @After//用于在测试方法执行之后执行     public void destroy()throws Exception{         //提交事务         sqlSession.commit();         //6.释放资源         sqlSession.close();         in.close();     }       @Test     public void getByName(){             UserModel model = userMapper.getByName("kk");             System.out.println(model);     }      @Test     public void getByMap() {              Map<String, Object> map = new HashMap<>();             map.put("id", 1L);             map.put("name", "张学友");             List<UserModel> userModelList = userMapper.getByMap(map);             userModelList.forEach(item -> {                 log.info("{}", item);             });         }      @Test     public void getByJavaBean(){         UserFindDto build = UserFindDto.builder().userId(1L).userName("kk").build();         List<UserModel> listByUserFindDto = userMapper.getListByUserFindDto(build);         listByUserFindDto.forEach(item->{             log.info("{}",item);         });     }   }  

Mybatis.xml

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"         "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--properties  typeAliases environments 都有严格顺序 -->     <!-- 引入外部jdbc配置 -->     <properties resource="jdbc.properties"/>     <!--为包下所有的类取别名,默认首字母小写-->     <typeAliases>         <package name="com.zju.demo1.model"></package>         <package name="com.zju.demo1.dto"></package>     </typeAliases>     <!-- 环境配置,可以配置多个环境 -->     <environments default="kk">         <environment id="kk">             <!-- 事务管理器工厂配置 -->             <transactionManager type="JDBC"/>             <!-- 数据源工厂配置,使用工厂来创建数据源 -->             <dataSource type="POOLED">                 <property name="driver" value="${jdbc.driver}"/>                 <property name="url" value="${jdbc.url}"/>                 <property name="username" value="${jdbc.username}"/>                 <property name="password" value="${jdbc.password}"/>             </dataSource>         </environment>     </environments>      <mappers>         <package name="com.zju.demo1.mapper"/>     </mappers> </configuration> 

UserMapper.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.zju.demo1.mapper.UserMapper">      <!-- 通过name查询 -->     <select id="getByName" resultType="userModel">         <![CDATA[         SELECT * FROM t_user WHERE name = #{value} LIMIT 1         ]]>     </select>                      <!--todo resultType 不是resultMap-->     <select id="getByMap" resultType="userModel">        <![CDATA[         SELECT * FROM t_user WHERE id=#{id} OR name = #{name}         ]]>    </select>       <!-- 通过map查询 -->     <select id="getListByUserFindDto" parameterType="userFindDto" resultType="userModel">         <![CDATA[         SELECT * FROM t_user WHERE id=#{userId} OR name = #{userName}         ]]>     </select>      <!-- 通过id或者name查询 -->     <select id="getByIdOrName" resultType="userModel">         <![CDATA[         SELECT * FROM t_user WHERE id=#{userId} OR name = #{userName} LIMIT 1         ]]>     </select>      <!-- 通过用户id列表查询 -->     <select id="getListByIdCollection" resultType="userModel">         <![CDATA[         SELECT * FROM t_user WHERE id IN (#{collection[0]},#{collection[1]})         ]]>     </select>      <!-- 通过用户id列表查询 -->     <select id="getListByIdList" resultType="userModel">         <![CDATA[         SELECT * FROM t_user WHERE id IN (#{list[0]},#{collection[1]})         ]]>     </select>      <!-- 通过用户id列表查询 -->     <select id="getListByIdArray" resultType="userModel">         <![CDATA[         SELECT * FROM t_user WHERE id IN (#{array[0]},#{array[1]})         ]]>     </select>      <select id="getList" resultType="userModel">         <![CDATA[         SELECT * FROM t_user         ]]>     </select> </mapper> 

传递单个参数和Map简单

传递一个java对象参数

当参数比较多,但是具体有多少个参数我们是确定的时候,我们可以将这些参数放在一个javabean对象中。

如我们想通过userId和userName查询,可以定义一个dto对象,属性添加对应的get、set方法,如:

@Getter @Setter @ToString @Builder @NoArgsConstructor @AllArgsConstructor public class UserFindDto {     private Long userId;     private String userName; } 

UserMapper中新增一个方法,将UserFindDto作为参数:

/**  * 通过UserFindDto进行查询  * @param userFindDto  * @return  */ List<UserModel> getListByUserFindDto(UserFindDto userFindDto); 

对应的UserMapper.xml中这么写,如下:

 <!-- 通过map查询 -->     <select id="getListByUserFindDto" parameterType="userFindDto" resultType="userModel">         <![CDATA[         SELECT * FROM t_user WHERE id=#{userId} OR name = #{userName}         ]]>     </select> 

测试类中添加

 @Test     public void getByJavaBean(){         UserFindDto build = UserFindDto.builder().userId(1L).userName("kk").build();         List<UserModel> listByUserFindDto = userMapper.getListByUserFindDto(build);         listByUserFindDto.forEach(item->{             log.info("{}",item);         });     }  

总结:
传递java对象的方式相对于map的方式更清晰一些,可以明确知道具体有哪些参数,而传递map,我们是不知道这个map中具体需要哪些参数的,map对参数也没有约束,参数可以随意传,建议多个参数的情况下选择通过java对象进行传参。

多参数传递[email protected]

笔记02 Mapper接口传参
测试

 @Test     public void getByIdOrName(){         UserModel model = userMapper.getByIdOrName(1L, "kk");         System.out.println(model);     } 

传递集合参数

Collection–collection List–list 数组–array

  List<UserModel> getListByIdList(List<Long> idList); List<UserModel> getListByIdCollection(Collection<Long> idCollection); 

笔记02 Mapper接口传参
笔记02 Mapper接口传参

<!-- 通过用户id列表查询 -->     <select id="getListByIdArray" resultType="userModel">         <![CDATA[         SELECT * FROM t_user WHERE id IN (#{array[0]},#{array[1]})         ]]>     </select> 

ResultHandler作为参数

用法
查询的数量比较大的时候,返回一个List集合占用的内存还是比较多的,比如我们想导出很多数据,实际上如果我们通过jdbc的方式,遍历ResultSet的next方法,一条条处理,而不用将其存到List集合中再取处理。

mybatis中也支持我们这么做,可以使用ResultHandler对象,犹如其名,这个接口是用来处理结果的,先看一下其定义:

public interface ResultHandler<T> {    void handleResult(ResultContext<? extends T> resultContext);  } 

里面有1个方法,方法的参数是ResultContext类型的,这个也是一个接口,看一下源码:

public interface ResultContext<T> {    T getResultObject();    int getResultCount();    boolean isStopped();    void stop();  } 

4个方法:

getResultObject:获取当前行的结果  getResultCount:获取当前结果到第几行了  isStopped:判断是否需要停止遍历结果集  stop:停止遍历结果集 

ResultContext接口有一个实现类org.apache.ibatis.executor.result.DefaultResultContext,mybatis中默认会使用这个类。

案例
我们遍历t_user表的所有记录,第2条遍历结束之后,停止遍历,实现如下:

新增一个方法

void getList(ResultHandler<UserModel> resultHandler); 

对应的UserMapper.xml新增sql操作,如下:

<select id="getList" resultType="com.javacode2018.chat03.demo4.model.UserModel">     <![CDATA[     SELECT * FROM t_user     ]]> </select> 

测试

@Test public void getList() {     log.info("----------");     try (SqlSession sqlSession = this.sqlSessionFactory.openSession(true);) {         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);         userMapper.getList(context -> {             //将context参数转换为DefaultResultContext对象             DefaultResultContext<UserModel> defaultResultContext = (DefaultResultContext<UserModel>) context;             log.info("{}", defaultResultContext.getResultObject());             //遍历到第二条之后停止             if (defaultResultContext.getResultCount() == 2) {                 //调用stop方法停止遍历,stop方法会更新内部的一个标志,置为停止遍历                 defaultResultContext.stop();             }         });     } } 

本文转自互联网,侵权联系删除笔记02 Mapper接口传参

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 笔记02 Mapper接口传参
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们