Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心。
输入参数映射
parameterType(输入类型)
传递简单类型:
如: <select id="queryUserById" parameterType="Integer" resultType="User">select * from t_user where id = #{id}</select>
如上中parameterType为输入类型、resultType为输出类型,sql语句中记得用占位符#{}(防sql注入功能并且默认加'`'飘字符)或者${}(相反)进行sql拼接。
传递pojo对象
Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。
补充:什么叫ognl表达式? OGNL表达式是Object-Graph Navigation Language的缩写,是一种功能强大的表达式语言,通过简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转换。
ognl表达式的使用?
首先看一个代码:
User.xml中
<update id="updateUser" parameterType="com.firtDay.sqlMapconFig.User">UPDATE t_user set _name = #{_name},_money = #{_money} WHERE id = #{id}</update>
User.java中
public Integer id;private String _name;private int _money;
测试类
//更新数据@Testpublic void testDemo5(){SqlSession openSession = sqlSessionFactory.openSession();User user = new User();user.setId(1);user.set_name("魏杰");user.set_money(1000);int update = openSession.update("updateUser", user);openSession.commit();openSession.close();}
数据库
UPDATE t_user set _name = #{_name},_money = #{_money} WHERE id = #{id}
### Error updating database. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'money' in 'class com.firtDay.sqlMapconFig.User'
表示找到参数值。
传递pojo包装对象
开发中通过可以使用pojo传递查询条件。
查询条件可能是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如查询用户信息的时候,将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。
包装对象:Pojo类中的一个属性是另外一个pojo。
需求:根据用户名模糊查询用户信息,查询条件放到QueryVo的user属性中。
Mapper接口
public interface mapper {User queryUserById(Integer id);User queryUserByIdQueryVo(QueryVo vo);Integer queryUserCount();User queryUserByName(User user);List<User> queryUserByIds(QueryVo vo);List<User> queryUserByIds(List<Integer> ids);List<User> queryUserByIds(Integer[] ids);List<OrderDemo> queryOrders();//一对一List<UserDemo> queryOrdersDemo();//一对多
}
编写QueryVo
public class QueryVo implements Serializable{/*** */private static final long serialVersionUID = 1L;private User user;private List<Integer> ids;public User getUser() {return user;}public void setUser(User user) {this.user = user;}public List<Integer> getIds() {return ids;}public void setIds(List<Integer> ids) {this.ids = ids;}}
xml中传递参数类型设置
<select id="queryUserByIds" resultType="User" parameterType="QueryVo">
测试类
@Testpublic void testDemo2(){SqlSession openSession = sqlSessionFactory.openSession();mapper m = openSession.getMapper(mapper.class);User user = new User();user.setId(3);
// 知识点一QueryVo vo = new QueryVo();vo.setUser(user);user = m.queryUserByIdQueryVo(vo);System.out.println(user);System.out.println("----------------");user = m.queryUserById(user.getId());System.out.println(user);System.out.println("---------------------------");Integer queryUserCount = m.queryUserCount();System.out.println(queryUserCount);openSession.close();}
resultType(输出类型)
简单参数类型、输出pojo对象、输出pojo列表(List,resultType仍然为user)
resultMap
resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
如果mapper.xml中sql查询列(user_id)和Order类属性(userId)不一致,所以查询结果不能映射到pojo中。
需要定义resultMap,把orderResultMap将sql查询列(user_id)和Order类属性(userId)对应起来
代码演示:
<?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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,Mapper动态代理开发的时候使用,需要指定Mapper的类路径 -->
<mapper namespace="cn.itcast.mybatis.mapper.OrderMapper"><!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo --><!-- id:设置ResultMap的id --><resultMap type="order" id="orderResultMap"><!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id --><!-- property:主键在pojo中的属性名 --><!-- column:主键在数据库中的列名 --><id property="id" column="id" /><!-- 定义普通属性 --><result property="userId" column="user_id" /><result property="number" column="number" /><result property="createtime" column="createtime" /><result property="note" column="note" /></resultMap><!-- 查询所有的订单数据 --><select id="queryOrderAll" resultMap="orderResultMap">SELECT id, user_id,number,createtime, note FROM `order`</select></mapper>