深入理解Mapper映射文件

  Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心。

  映射文件中有很多属性,常用的就是parameterType(输入类型)、resultType(输出类型)、resultMap()、rparameterMap()。

  • parameterType(输入类型)

  1、#{}与${}

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

 

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注入,但是有时用${}会非常方便,如下的例子:

  

1   <!-- 根据名称模糊查询用户信息 -->
2     <select id="selectUserByName" parameterType="string" resultType="user">
3        select * from user where username like '%${value}%'
4     </select>

 

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

  //如果使用占位符号则必须人为在传参数中加%

 

  List<User> list = userMapper.selectUserByName("%张三%");

  //如果使用${}原始符号则不用人为在参数中加%

 

  List<User>list = userMapper.selectUserByName("张三");

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

  ORDER BY ${columnName},如果使用#{}将无法实现此功能。

  2、传递简单类型

  传递简单类型只需要注意#{}与${}的使用就可以。

  3、传递pojo对象

  Mybatis使用ognl表达式解析对象字段的值,如下例子:

 

1   <!—传递pojo对象综合查询用户信息 -->
2     <select id="findUserByUser" parameterType="user" resultType="user">
3        select * from user where id=#{id} and username like '%${username}%'
4     </select>

 

  测试代码:

复制代码
 1 Public void testFindUserByUser()throws Exception{
 2         //获取session
 3         SqlSession session = sqlSessionFactory.openSession();
 4         //获限mapper接口实例
 5         UserMapper userMapper = session.getMapper(UserMapper.class);
 6         //构造查询条件user对象
 7         User user = new User();
 8         user.setId(1);
 9         user.setUsername("管理员");
10         //传递user对象查询用户列表
11         List<User>list = userMapper.findUserByUser(user);
12         //关闭session
13         session.close();
14 }
复制代码

  如果将username写错后,会报以下异常

1 org.apache.ibatis.exceptions.PersistenceException: 
2 ### Error querying database.  Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'dusername' in 'class com.luchao.mybatis.first.po.User'
3 ### Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'dusername' in 'class com.luchao.mybatis.first.po.User'

  可以看出MyBatis是通过反射来讲java对象映射到查询参数中的。

  4、传递pojo包装对象

  开发中通过pojo传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。

  (1)、定义包装对象

  定义包装对象将查询条件(pojo)以类组合的方式包装起来。

 

复制代码
 1 public class QueryVo {
 2     private User user;
 3     //自定义用户扩展类
 4     private UserCustom custom;
 5     public User getUser() {
 6         return user;
 7     }
 8     public void setUser(User user) {
 9         this.user = user;
10     }
11     public UserCustom getCustom() {
12         return custom;
13     }
14     public void setCustom(UserCustom custom) {
15         this.custom = custom;
16     }
17 }
复制代码<
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值