Mybatis-Mapper.xml输入输出映射

在Mybatis中,Mapper.xml主要负责对数据库的具体操作,即增、删、改、查等相关操作,

对于mapper.xml,我们需要掌握一些常用的标签,下面做出介绍。

首先,先对此次讲解数据库表做一个说明,数据库表字段为id、username、sex、birthday、address

使用JavaBean对象实现映射类如下:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.sw.po;  
  2.   
  3. import java.util.Date;  
  4.   
  5. /* 
  6.  *@Author swxctx 
  7.  *@time 2016年11月30日 
  8.  *@Explain:属性名与表的字段对应 
  9.  */  
  10. public class User {  
  11.     private int id;  
  12.     private String username;// 用户姓名  
  13.     private String sex;// 性别  
  14.     private Date birthday;// 生日  
  15.     private String address;// 地址  
  16.     public int getId() {  
  17.         return id;  
  18.     }  
  19.     public void setId(int id) {  
  20.         this.id = id;  
  21.     }  
  22.     public String getUsername() {  
  23.         return username;  
  24.     }  
  25.     public void setUsername(String username) {  
  26.         this.username = username;  
  27.     }  
  28.     public String getSex() {  
  29.         return sex;  
  30.     }  
  31.     public void setSex(String sex) {  
  32.         this.sex = sex;  
  33.     }  
  34.     public Date getBirthday() {  
  35.         return birthday;  
  36.     }  
  37.     public void setBirthday(Date birthday) {  
  38.         this.birthday = birthday;  
  39.     }  
  40.     public String getAddress() {  
  41.         return address;  
  42.     }  
  43.     public void setAddress(String address) {  
  44.         this.address = address;  
  45.     }  
  46.     @Override  
  47.     public String toString() {  
  48.         return "User [id=" + id + ", username=" + username + ", sex=" + sex  
  49.                 + ", birthday=" + birthday + ", address=" + address + "]";  
  50.     }  
  51.       
  52. }  


parameterType-输入映射

parameterType即为输入类型,在Mybatis中,我们对数据库进行相关操作时,则会对sql传入一些值,那么这些值都有其相应的数据类型。


占位符#{}、${}

#{}与${}在开发中比较常用,在sql具有变量时俊辉使用到#{}与${}

#{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符,即类似于Hibnernate的PareStatement中的?。

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- 根据id查询用户信息 -->  
  2. <select id="findUserById" parameterType="int" resultType="user">  
  3.     select * from user where id = #{id}  
  4. </select>  

使用占位符#{}可以防止sql注入,在使用时不需要关心参数值的类型,mybatis会自动进行Java类型和jdbc类型的转换。

#{}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

${}和#{}不同,通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。使用${}不能防止sql注入,但是有时用${}会非常方便,如下的例子:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- 根据名称模糊查询用户信息 -->  
  2. <select id="selectUserByName" parameterType="string" resultType="user">  
  3.    select * from user where username like '%${value}%'  
  4. </select>  

如果本例子使用#{}则传入的字符串中必须有%号,而%是人为拼接在参数中,显然有点麻烦,如果采用${}在sql中拼接为%的方式则在调用mapper接口传递参数就方便很多。

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. //如果使用占位符号则必须人为在传参数中加%  
  2. List<User> list = userMapper.selectUserByName("%解%");  
[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. //如果使用${}原始符号则不用人为在参数中加%  
  2. List<User>list = userMapper.selectUserByName("解");  

比如order by排序,如果将列名通过参数传入sql,根据传的列名进行排序,应该写为:

ORDER BY${columnName}

如果使用#{}将无法实现此功能。


传递pojo对象

在Mybatis中,可使用ognl表达式解析对象字段的值,如下配置所示:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!—传递pojo对象综合查询用户信息 -->  
  2. <select id="findUserByUser" parameterType="user" resultType="user">  
  3.    select * from user where id=#{id} and username like '%${username}%'  
  4. </select>  

#{id}与{username},这里的id与username表示的是user对象中的属性名称。

其中paramwterType=“user”则表示其输入类型为User对象,即使用User对象中的相关属性。


传递pojo包装对象

开发中通过pojo传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),

这时可以使用包装对象传递输入参数。

传递poio包装对象,首先则需要进行包装对象的定义,如下所示:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.sw.po;  
  2.   
  3. import java.util.List;  
  4.   
  5. /* 
  6.  *@Author swxctx 
  7.  *@time 2016年12月2日 
  8.  *@Explain:包装所需要的查询条件(亦可包装其他对象的查询信息)-包装类型 
  9.  */  
  10. public class UserQueryVo {  
  11.     //传入多个id  
  12.     private List<Integer> ids;  
  13.     //用户查询条件  
  14.     private UserCustom userCustom;  
  15.   
  16.     public UserCustom getUserCustom() {  
  17.         return userCustom;  
  18.     }  
  19.   
  20.     public void setUserCustom(UserCustom userCustom) {  
  21.         this.userCustom = userCustom;  
  22.     }  
  23.   
  24.     public List<Integer> getIds() {  
  25.         return ids;  
  26.     }  
  27.   
  28.     public void setIds(List<Integer> ids) {  
  29.         this.ids = ids;  
  30.     }  
  31. }  

映射对象的扩展类如下:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.sw.po;  
  2. /* 
  3.  *@Author swxctx 
  4.  *@time 2016年12月2日 
  5.  *@Explain:User类的扩展类 
  6.  */  
  7. public class UserCustom extends User{  
  8.     //可以扩展用户的信息  
  9. }  

包装对象定义完成后,我们就可以在mapper.xml文件中进行相关的配置:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <select id="findUserList" parameterType="com.sw.po.UserQueryVo" resultType="com.sw.po.UserCustom">  
  2.     select *from user where username=#{username}  
  3. </select>  

传递HashMap

在Mybatis中,亦可通过HashMap输入值,其mapper.xml配置如下:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- 传递hashmap综合查询用户信息 -->  
  2. <select id="findUserByHashmap" parameterType="hashmap" resultType="user">  
  3.    select * from user where id=#{id} and username like '%${username}%'  
  4. </select>  
如上,#{id}与{username}则表示hashmap中的对应key值,经过配置后,配置文件会自动到代码中寻找key为id的字段,如果没有,则会出现异常。
测试代码如下:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Public void testFindUserByHashmap()throws Exception{  
  2.     //获取session  
  3.     SqlSession session = sqlSessionFactory.openSession();  
  4.     //获限mapper接口实例  
  5.     UserMapper userMapper = session.getMapper(UserMapper.class);  
  6.     //构造查询条件Hashmap对象  
  7.     HashMap<String, Object> map = new HashMap<String, Object>();  
  8.     map.put("id"1);  
  9.     map.put("username""Swxctx");  
  10.       
  11.     //传递Hashmap对象查询用户列表  
  12.     List<User>list = userMapper.findUserByHashmap(map);  
  13.     //关闭session  
  14.     session.close();  
  15. }  


ResultType-输出映射

输出类型即为Mybatis执行sql之后结果的输出类型。


简单输出类型

简单输出类型即为常见的数据类型,我们从下面的例子进行理解。

Mapper.xml配置文件:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- 获取用户列表总数 -->  
  2. <select id="findUserCount" parameterType="user" resultType="int">  
  3.    select count(1) from user  
  4. </select>  
如上所示,resultType=“int”,即表示sql执行输出结果为int型的,从sql不难看出,该sql的作用是查询出数据库表的数据总条数,自然其应该为

int型下符合需求。

在这里,不只是int型的数据可用,在实际开发中,我们还会用到例如String、Date、Boolean等数据类型,此类即为常用简单输出类型。


输出poio对象

输出poio对象,显然,在执行sql之后,我们输出的是一个对象;那么如何理解呢,其实结合poio对象来进行理解,也就不难。

例如:现在需要根据用户id查询出一个用户,并且显示该用户所有数据

在前面我们已经介绍过类似JavaBean与数据库表的映射,即为poio对象,poio对象的属性对应了数据库表的字段,要想输出所有数据,那嚒

我们输出poio对象,是否就将数据全部输出了呢?答案是肯定的,输出poio对象,即输出了所有的属性信息。(注:只能输出一条信息,类似于selectOne())

为了加深理解,我们可以通过下面例子进行理解:

mapper.xml文件:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- 根据id查询用户信息 -->  
  2. <select id="findUserById" parameterType="int" resultType="user">  
  3.     select * from user where id = #{id}  
  4. </select>  

mapper接口:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public User findUserById(int id) throws Exception;  

测试类:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Public void testFindUserById() throws Exception {  
  2.     //获取session  
  3.     SqlSession session = sqlSessionFactory.openSession();  
  4.     //获限mapper接口实例  
  5.     UserMapper userMapper = session.getMapper(UserMapper.class);  
  6.     //通过mapper接口调用statement  
  7.     User user = userMapper.findUserById(1);  
  8.     System.out.println(user);  
  9.     //关闭session  
  10.     session.close();  
  11. }  

输出pojo列表

输出pojo列表与上面的输出pojo差别并不大,唯一的差别就是:输出对象输出的是一个对象,而输出对象列表则可以输出多条数据。

例如:查询所有用户名有‘解’的用户,显然可能会有很多用户。因此,我们需要使用输出poio列表的方式进行输出。

实例:mapper.xml

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- 根据名称模糊查询用户信息 -->  
  2. <select id="findUserByUsername" parameterType="string" resultType="user">  
  3.    select * from user where username like '%${value}%'  
  4. </select>  

mapper接口

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public List<User> findUserByUsername(String username) throws Exception;  

测试类:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Public void testFindUserByUsername()throws Exception{  
  2.     //获取session  
  3.     SqlSession session = sqlSessionFactory.openSession();  
  4.     //获限mapper接口实例  
  5.     UserMapper userMapper = session.getMapper(UserMapper.class);  
  6.     //如果使用占位符号则必须人为在传参数中加%  
  7.     //List<User> list = userMapper.selectUserByName("%管理员%");  
  8.     //如果使用${}原始符号则不用人为在参数中加%  
  9.     List<User> list = userMapper.findUserByUsername("管理员");  
  10.     //关闭session  
  11.     session.close();  
  12. }  

输出HashMap

输出pojo对象可以改用hashmap输出类型,将输出的字段名称作为map的key,value为字段值。


resultMap-高级输出映射

resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。

如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。

resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

resultMap的定义:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- 定义ResultMap  
  2. 将select id id_,username username_ from user where id=#{id}查询出来的列与  
  3. pojo(User)类中的属性做映射(对应关系)  
  4. type:ResultMap最终所映射的Java对象类型(可使用别名)  
  5. id:对ResultType于ResultMap的唯一标识  
  6.  -->  
  7.  <resultMap type="user" id="userResultMap">  
  8.     <!-- 查询结果集中的唯一标识(对应于数据库表中字段的唯一标识)  
  9.         colum:查询出的列名  
  10.         property:pojo的属性名字(Type指定的pojo对象  
  11.         最终resultMap对column和property进行映射(做映射关系)  
  12.      -->  
  13.     <id column="id_" property="id"/>  
  14.     <!-- 对普通列的映射定义 -->  
  15.     <result column="username_" property="username"/>  
  16.  </resultMap>  

定义好之后,我们就可以在mapper.xml文件中进行使用了,如下:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- 使用ResultMap进行输出的映射  
  2.     ResultMap:指定已定义的ResultMap的id(该ResultMap在其他的Mapper文件中,需要在前面加上namespace进行指定)  
  3.  -->  
  4. <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">  
  5.     select id id_,username username_ from user where id=#{id}  
  6. </select>  

到这里呢,mapper.xml的常用的标签就完成了,但是还有一个重要的东西,即动态sql,动态sql在Mybatis的开发中十分重要,

那么打算分开进行介绍,在编写完成后会在此处打上链接。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值