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(); }数据库
运行测试类:
我们可以看到数据更改成功,因为我们的传入的参数类型为user对象,那么我们怎么获取需要更新的数据呢,就通过ognl表达式可以去解析user对象中的成员变量,而我们的User.xml中
UPDATE t_user set _name = #{_name},_money = #{_money} WHERE id = #{id}
中的#{_money}和#{id}和我们对象的成员变量中的名称相同,因此才会更改成功,倘若我们把_money改成money再执行就会报错:org.apache.ibatis.exceptions.PersistenceException:
### Error updating database. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'money' in 'class com.firtDay.sqlMapconFig.User'
表示找到参数值。
### 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)