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;
测试类
//更新数据
@Test
public 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">
测试类
@Test
public 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>