MyBatis之旅-Mybatis进阶

  上一篇博文中讲过了如何创建一个简单的mybatis程序,这一篇博文中要讲的是进一步深入了解和使用mybatis。

  在上一篇博文中的例子是根据id来查找一个用户,id是一个简单的int类型,那么如果要根据一个用户对象来查询一个用户应该怎么做啦?只需要对<select>节点进行简单的修改即可。

  <select id="selectByUser" paramterType="test.User" resuiltType="test.User">

    select * from user where name like '%${name}%' and password=#{password} 

  </select>

  这里有两个新的东西,第一个就是${},之前在使用简单类型作为输入参数的时候我们使用的是#{},而${}的意思是拼装sql,也就是${}会将输入参数不加修饰的传入到这里,而如果是#{}而且传入的参数为字符串,那么它会自动为传入的参数值加上单引号,比如这里的#{password},结果是password='123',而'%${name}%'的结果是'%张三%',如果是'%#{name}%',那么结果就变成了'%'张三'%'。这就是#{}和${}的区别。

  第二个就是paramterType是一个包装类型,而且select语句中有两个参数,而mapper接口定义的方法中只有一个输入参数,那么这个怎么解决啦?这里的name和password和User类也就是paramterType定义的类型中的name和password属性相同,那么mybatis就会自动的将传入参数User中的name赋值到这里${name}和#{password}。这就是mybatis中的包装类型输入参数。还可以这样来定义传入参数${user.name}、#{user.passwrod},这里的user就是调用mapper接口的selectByUser时传入的User对象。传出参数也可以使用包装类型,结果类型中如果包含和sql查询结果相同名称的属性,那么mybatis就会把查询具有相同名称的结果内容封装到结果参数中,例如:修改一下select节点的sql,

    select id id_,name name_ from user where name like '%${name}%' and password=#{password}

  这是为查询结果的字段定义了别名,但是User对象中没有id_和name_这两个同名称的属性,所以这两个结果就不会被封装到User结果参数中,为了将这两个结果封装到User结果参数中有两种解决方案,就是使用一个包装类型继承User然后定义id_和name_,并绑定到User的id和name属性上,另一种方案则是mybatis提供了resultMap的来解决。正常的方式是使用resultMap来处理。resultMap是映射文件中的一个节点,例如:

  <resultMap type="test.User" id="userResultMap"> <!-- 其中type是输出结果参数类型,id是唯一标准 -->

    <id column="id_" property="id" /> <!-- id节点是唯一主键 column是查询结果,property是属性名称 -->

    <result column="name_" property="name" /> <!-- result是普通列 -->

  </resultMap>


然后在select 节点上加入resultMap="userReusltMap" 这里的userResultMap就是上面定义的resultMap的id,这样就能将其关联,然后输出结果参数就能够正确封装查询结果。


  后面是if foreach sql片段的东西,这三个东西比较简单,需要的时候可以在查询相关资料。

你可能感兴趣的:(输入参数类型,pojo包装类型的输入输出参数,mybatis进阶)