本次全部学习内容:MyBatisLearning

 
输入映射:
通过parameType指定输入参数的类型,类型可以是简单类型,hashmap,pojo等
 
 
传递pojo的包装对象
需求:
即使一个综合查询,需要传入多个查询的条件
 
开始敲代码了......

 
在这次使实践里面,需要新建两个类,和使用之前的的测试类进行测试
 
 
新建UserCustomer.java主要是继承User.java其他的代码不写
public class UserCustomer extends User{
}

在UserView.java中:

   //在这里包装所需要的查询条件

     //用户综合查询查询条件
private UserCustomer userCustomer;
public UserCustomer getUserCustomer() {
return userCustomer;
}
public void setUserCustomer(UserCustomer userCustomer) {
this.userCustomer = userCustomer;
}
在UserMapper.java中定义综合查询的方法
     //综合查询
public List<User> findBySelect(UserView userView) throws Exception;

在UserMapper.xml文件中实现查询的代码:

     <!-- 综合查询 -->
<select id="findBySelect" parameterType="com.MrChengs.po.UserView" resultType="com.MrChengs.po.UserCustomer" >
select * from user where user.id=#{userCustomer.id} and user.username like '%${userCustomer.username}%'
</select>
 
讲解:parameterType这个是我们输入参数的类型,#{userCustomer.id}由此可以定位到UserView.java这个类面,在进行定位就是userCustomer,
      对userCustomer在进一步就是UserCustomer这个类,他是继承User这个类,此时到User这个类,已经到底,我们可以发现id这和属性,这个userCustomer.id相当于一个连点的方法
            resultType:使我们综合查询的类型,此时使userCustomer
 
测试类中:
    //综合查询
@Test
public void testfindBySelect() throws Exception{
SqlSession sqlSession = getSqlSessionFactory().openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); UserView userView = new UserView(); UserCustomer userCustomer = new UserCustomer();
userCustomer.setId(16);
userCustomer.setUsername("小明"); userView.setUserCustomer(userCustomer); List<User> user = mapper.findBySelect(userView);
for(User u : user){
System.out.println(u);
}
sqlSession.close();
}

查询成功:

DEBUG [main] - ==>  Preparing: select * from user where user.id=? and user.username like '%小明%'
DEBUG [main] - ==> Parameters: 16(Integer)
DEBUG [main] - <== Total: 1
User [id=16, username=张小明, birthday=null, sex=1, address=河南郑州]

生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList (返回集合对象调用 ).

 
 
 
 
输出映射:
对于resultType:
使用此属性进行输出映射时,只有在查询出来的列和pojo中的属性名一致,该列才可以映射成功
若查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象
只要查询出来的列名和pojo中的属性名有一个一致,就会创建pojo对象
 
现在来实现一个测试的例子:
在UserMapper.java的接口类中:
     //擦寻用户信息总数
public int findUserCount(UserView userView) throws Exception;

在UserMapper.xml文件中:

<!-- 输出映射查询用户信息总数 -->
<select id="findUserCount" parameterType="com.MrChengs.po.UserView" resultType="int">
select count(*) From user where sex=#{userCustomer.sex} and user.username like '%${userCustomer.username}%'
</select>
 在测试类中进行测试:

//查询用户信息总数
@Test
public void testfindUserCount() throws Exception{
SqlSession sqlSession = getSqlSessionFactory().openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); UserView userView = new UserView(); UserCustomer userCustomer = new UserCustomer();
userCustomer.setSex(1);
userCustomer.setUsername("小明"); userView.setUserCustomer(userCustomer); int count = mapper.findUserCount(userView);
System.out.println(count);
sqlSession.close();
}

结果:

DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 963522361.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@396e2f39]
DEBUG [main] - ==> Preparing: select count(*) From user where sex=? and user.username like '%小明%'
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
3
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@396e2f39]

输出pojo对象和输出pojo列表在sql中定义的resultType是一样的。
 
返回单个pojo对象要保证sql查询出来的结果集为单条,内部使用session.selectOne方法调用,mapper接口使用pojo对象作为方法返回值。
 
返回pojo列表表示查询出来的结果集可能为多条,内部使用session.selectList方法,mapper接口使用List<pojo>对象作为方法返回值。
 
 
 
 
resultMap:
resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
 
 
 
下面是代码的实践:
测试:
在UserMapper.java接口中:
//测试resultMap
public User findByMap(int id) throws Exception;

在UserMapper.xml中:

<!-- 简单测试resultMap的使用 -->
<!-- type:resultMap最终映射的java 对象类型,可以使用别名/全类名 -->
<!-- id:使当前resultMap的唯一标识 --> <resultMap type="com.MrChengs.po.User" id="ByMap"> <!-- id标识查询结果的唯一标识 -->
<!-- column:查询出来的列名 -->
<!-- property:type指定类型的pojo类型的映射属性,最终resultMap对cloumn和property做出一对一的映射 -->
<id column="_id" property="id"/> <!-- result:对普通列名的映射 -->
<!-- column:查询出来的列名 -->
<!-- property:和type的类型一一映射 -->
<result column="_username" property="username"/>
</resultMap>
<select id="findByMap" parameterType="int" resultMap="ByMap">
select id _id,username _username from user where id=#{id}
</select>
可以在sql软件中测试select id _id,username _username from user where id=?  查看我们得到的结果。
 
<id />:此属性表示查询结果集的唯一标识,非常重要。如果是多个字段为复合唯一约束则定义多个<id />。
 
Property:表示person类的属性。
 
Column:表示sql查询出来的字段名。
 
Column和property放在一块儿表示将sql查询出来的字段映射到指定的pojo类属性上。
 
<result />:普通结果,即pojo的属性。
 
在测试类中:
//测试resultMap
@Test
public void testfindByMap() throws Exception{
SqlSession sqlSession = getSqlSessionFactory().openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.findByMap(1);
System.out.println(user); sqlSession.close();
}
结果:
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 2050835901.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7a3d45bd]
DEBUG [main] - ==> Preparing: select id _id,username _username from user where id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
User [id=1, username=王五, birthday=null, sex=0, address=null]
小结:
 
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
 
 
 
 
 
 
 
 
 
 
 
 

MaBatis(5)输入/输出映射的更多相关文章

  1. mybatis入门基础(四)----输入映射和输出映射

    一:输入映射 通过parameterType指定输入参数的类型,类型可以是简单类型.hashmap.pojo的包装类型. 1.1.传递pojo的包装对象 1.1.1.需求描述 完成用户信息的综合查询, ...

  2. 【Mybatis架构】输入、输出映射

    前言综述:   其实在我们分析Mybatis的查询缓存或者是一些简介的时候,我们就不难看到有关于Mybatis输入输出映射的东西,比如说: 但是一直没有想起来系统的来总结一下这方面的相关知识,偶然看到 ...

  3. Spring+SpringMVC+MyBatis深入学习及搭建(四)——MyBatis输入映射与输出映射

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6878529.html 前面有讲到Spring+SpringMVC+MyBatis深入学习及搭建(三)——My ...

  4. 【mybatis深度历险系列】mybatis中的输入映射和输出映射

    在前面的博文中,小编介绍了mybatis的框架原理以及入门程序,还有mybatis中开发到的两种方法,原始开发dao的方法和mapper代理方法,今天博文,我们来继续学习mybatis中的相关知识,随 ...

  5. JAVAEE——Mybatis第二天:输入和输出映射、动态sql、关联查询、Mybatis整合spring、Mybatis逆向工程

    1. 学习计划 1.输入映射和输出映射 a) 输入参数映射 b) 返回值映射 2.动态sql a) If标签 b) Where标签 c) Sql片段 d) Foreach标签 3.关联查询 a) 一对 ...

  6. mybatis基础系列(二)——基础语法、别名、输入映射、输出映射

    增删改查 mapper根节点及其子节点 mybatis框架需要读取映射文件创建会话工厂,映射文件是以<mapper>作为根节点,在根节点中支持9个元素,分别为insert.update.d ...

  7. Mybatis学习总结(四)——输入映射和输出映射

    在前面几篇文章的例子中也可以看到mybatis中输入映射和输出映射的身影,但是没有系统的总结一下,这篇博客主要对这两个东东做一个总结.我们知道mybatis中输入映射和输出映射可以是基本数据类型.ha ...

  8. mybatis进阶--输入映射和输出映射

    我们知道,mapper.xml是我们配置操作数据库的sql语句的地方.其中每个sql语句对应着一个方法,每个方法都有自己的输入输出参数类型.那么这些类型都是怎么配置的呢?今天我们来一起学习下. 输入映 ...

  9. mybatis进阶--mapper输入映射和输出映射

    我们知道,mapper.xml是我们配置操作数据库的sql语句的地方.其中每个sql语句对应着一个方法,每个方法都有自己的输入输出参数类型.那么这些类型都是怎么配置的呢?今天我们来一起学习下. 输入映 ...

随机推荐

  1. 创建WPF用户控件

    wpf用户自定义控件和winform创建方法类似,这里先纠正一个误区,就是有很多人也是添加,然后新建,然后是新建用户控件库,但是为什么编译好生成后Debug目录下还是只有exe文件而没有dll文件呢? ...

  2. .NET Unity IOC框架使用实例

    1.IOC简介 IOC(Inversion of Control), 控制反转 DI (Dependency Injection),依赖注入 IOC的基本概念是:不创建对象,但是描述创建它们的方式.在 ...

  3. 一:SpringMVC架构流程

    架构流程: 1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3.处理器映射器根据请求url ...

  4. 导出maven项目依赖的jar包

    注意使用mvn命令是需要配置好maven的环境变量 一.导出到自定义目录中 在maven项目下创建lib文件夹,输入以下命令: mvn dependency:copy-dependencies -Do ...

  5. POJ 1185 炮兵阵地 经典的 状态压缩dp

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16619   Accepted: 6325 Description ...

  6. 7、srpingboot改变JDK版本

    在pom.xml中加上 <plugin> <artifactId>maven-compiler-plugin</artifactId> <configurat ...

  7. 学习笔记2_Day09_servlet的细节

    Servlet细节 l  不要在Servlet中创建成员!创建局部变量即可! l  可以创建无状态成员! l  可以创建有状态的成员,但状态必须为只读的! 1 Servlet与线程安全 因为一个类型的 ...

  8. PHP三维优先级运算

    昨天去某大型公司面试,做了一套面试题,整套面试题的基础要求比较高,对于js的使用有一定的要求.在本次面试中碰到PHP三维运算优先级的问题,先看题: <?php $b=20; $c=40; $a= ...

  9. cf1043E. Mysterious Crime(二分 前缀和)

    题意 题目链接 Sol 考场上做完前四题的时候大概还剩半个小时吧,那时候已经困的不行了. 看了看E发现好像很可做?? 又仔细看了几眼发现这不是sb题么... 先考虑两个人,假设贡献分别为\((x, y ...

  10. 移动端mate标签设置

    <meta name="viewport" content="width=device-width,height=device-height,initial-sca ...