Mybatis学习笔记(七)——输入输出映射
2018-03-19 14:44
302 查看
本博客源码下载:戳我一下
Mybatis学习笔记汇总:戳我一下
输入映射
一、#{}
与${}
#{}实现的是向
prepareStatement中的预处理语句中设置参数值,
sql语句中
#{}表示一个占位符即
?。
<!-- 根据id查询用户信息 --> <select id="findUserById" parameterType="int" resultType="user"> select * from user where id = #{id} </select>
使用占位符
#{}可以有效防止
sql注入,在使用时不需要关心参数值的类型,
mybatis会自动进行java类型和jdbc类型的转换。
#{}可以接收简单类型值或
pojo属性值,如果
parameterType传输单个简单类型值,
#{}括号中可以是value或其它名称。
${}和
#{}不同,通过
${}可以将
parameterType传入的内容拼接在sql中且不进行jdbc类型转换,
${}可以接收简单类型值或pojo属性值,如果
parameterType传输单个简单类型值,
${}括号中只能是value。使用
${}不能防止
sql注入,但是有时用
${}会非常方便,如下的例子:
<!-- 根据名称模糊查询用户信息 --> <select id="selectUserByName" parameterType="string" resultType="user"> select * from user where username like '%${value}%' </select>
如果本例子使用
#{}则传入的字符串中必须有
%号,而
%是人为拼接在参数中,显然有点麻烦,如果采用
${}在sql中拼接为
%的方式则在调用
mapper接口传递参数就方便很多。
二、传递pojo对象
Mybatis使用
ognl表达式解析对象字段的值,如下例子:
<!—传递pojo对象综合查询用户信息 --> <select id="findUserByUser" parameterType="user" resultType="user"> select * from user where id=#{id} and username like '%${username}%' </select>
上边
#{}中的是user对象中的字段名称。
测试:
Public void testFindUserByUser()throws Exception{ //获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); //构造查询条件user对象 User user = new User(); user.setId(1); user.setUsername("贾一帆"); //传递user对象查询用户列表 List<User>list = userMapper.findUserByUser(user); //关闭session session.close(); }
异常测试:
Sql中字段名输入错误后测试,
username改为
dusername测试结果报错:
org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'dusername' in 'class cn.itcast.mybatis.po.User' ### Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'dusername' in 'class cn.itcast.mybatis.po.User'
三、传递pojo包装对象
开发中通过pojo传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。1、定义用户包装对象
package com.jiayifan.po; public class UserCustom extends User { //可以扩展用户信息 }
2、定义包装对象
package com.jiayifan.po; /** * 包装类型 * @author 贾一帆 * */ public class UserQueryVo { //在这里包装所需要的查询条件 //用户查询条件 private UserCustom userCustom; //可以包装其他查询条件,订单,商品 public UserCustom getUserCustom() { return userCustom; } public void setUserCustom(UserCustom userCustom) { this.userCustom = userCustom; } }
3、配置
UserMapper.xml
<!-- 用户信息的综合查询 #{userCustom.sex}:取出包装对象中性别的值 ${userCustom.username}:取出包装对象中的名称 --> <select id="findUserList" parameterType="UserQueryVo" resultType="UserCustom"><!-- 这里使用了别名,在SqlMapConfig中配置 --> select * from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%' </select>
说明:
mybatis底层通过
ognl从
pojo中获取属性值:
#{userCustom.sex},
userCustom即是传入的包装对象的属性。
UserQueryVo是别名,即上边定义的包装对象类型。
四、传递hashmap
Sql映射文件定义如下:<!-- 传递hashmap综合查询用户信息 --> <select id="findUserByHashmap" parameterType="hashmap" resultType="user"> select * from user where id=#{id} and username like '%${username}%' </select>
上边
#{}和
${}中的是hashmap的key。
测试:
Public void testFindUserByHashmap()throws Exception{ //获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); //构造查询条件Hashmap对象 HashMap<String, Object> map = new HashMap<String, Object>(); map.put("id", 1); map.put("username", "管理员"); //传递Hashmap对象查询用户列表 List<User>list = userMapper.findUserByHashmap(map); //关闭session session.close(); }
异常测试:
传递的map中的key和sql中解析的key不一致。
测试结果没有报错,只是通过key获取值为空。
输出映射
一、输出简单类型
1、配置UserMapper.xml
<!-- 使用resultMap进行输出映射 --> <!-- 用户信息的综合查询总数 --> <select id="findUserCount" parameterType="UserQueryVo" resultType="int"> select count(*) from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%' </select>
2、为
UserMapper.java添方法
//用户信息的综合查询总数 public int findUserCount(UserQueryVo userQueryVo) throws Exception;
3、测试:
void testFindUserCount() throws Exception { SqlSession sqlSession = sessionFactory.openSession(); //得到UserMapper对象,Mybatis自动生成mapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //调用userMapper方法 //创建包装对象,设置查询条件 UserQueryVo userQueryVo = new UserQueryVo(); UserCustom userCustom = new UserCustom(); userCustom.setSex("1"); userCustom.setUsername("小明"); userQueryVo.setUserCustom(userCustom); int count = userMapper.findUserCount(userQueryVo); System.out.println(count); sqlSession.close(); }
4、总结:
输出简单类型必须查询出来的结果集有一条记录,最终将第一个字段的值转换为输出类型。
使用
sqlSession的
selectOne可查询单条记录。
二、输出pojo对象和pojo列表
这个一直都在用,就不解释了。三、resultType总结:
输出pojo对象和输出pojo列表在sql中定义的resultType是一样的。返回单个pojo对象要保证sql查询出来的结果集为单条,内部使用
sqlSession.selectOne方法调用,mapper接口使用pojo对象作为方法返回值。
返回pojo列表表示查询出来的结果集可能为多条,内部使用
sqlSession.selectList方法,mapper接口使用
List<pojo>对象作为方法返回值。
四、输出hashmap
输出pojo对象可以改用hashmap输出类型,将输出的字段名称作为map的key,value为字段值。五、resultMap
的使用
resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过
resultMap将字段名和属性名作一个对应关系 ,
resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
1、配置
UserMapper.xml
<!-- 使用resultMap进行输出映射 --> <!-- 定义ResultMap 将SELECT id _id_,username _username_ FROM USER 查询出来的值和User类中的属性做一个映射 type:ResultMap最终映射的java对象类型,可以使用别名 id:对ResultMap的唯一标识 --> <resultMap type="user" id="userResultMap"> <!-- id表示查询的结果集中的唯一标识(主键列) column:指得是查询出来的列名 property:指的是pojo中的属性名 最终ResultMap对column和property做一个映射关系 --> <id column="_id_" property="id"/> <!-- result:对普通列映射定义 --> <result column="_username_" property="username"/> </resultMap> <!-- resultMap:指定定义的ResultMap的id,如果这个ResultMap在其他的 mapper文件中,需要在前面加namespace(命名空间) --> <select id="findUserResultMap" parameterType="int" resultMap="userResultMap"> SELECT id _id_,username _username_ FROM USER WHERE id=#{id} </select>
2、为
UserMapper.java添方法
//ResultMap使用 public List<User> findUserResultMap(int id) throws Exception;
3、测试:
void testFindUserResultMap() throws Exception { SqlSession sqlSession = sessionFactory.openSession(); //得到UserMapper对象,Mybatis自动生成mapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //调用userMapper方法 //创建包装对象,设置查询条件 List<User> user = userMapper.findUserResultMap(1); System.out.println(user); sqlSession.close(); }
相关文章推荐
- Mybatis学习笔记(七)【输入映射】
- MyBatis 学习 (三) 输入输出映射
- J2EE系列之MyBatis学习笔记(四)-- mybatis关系映射(一对一映射)
- Mapper.xml映射文件---Mybatis学习笔记(八)
- JavaWeb学习笔记-mybatis-13-mybatis配置-mapper映射配置
- mybatis学习笔记(7)-输出映射
- Mybatis学习笔记(八)【输出映射】
- Mybatis学习笔记:(二) java中的实体(对象、List、Set)关系怎样与数据库关联映射
- MyBatis学习笔记-03.MyBatis中五种成功映射数据库字段与实体类属性不一致的解决方案
- mybatis学习四之输入输出映射以及动态sql
- JavaWeb学习笔记-mybatis-15-输出映射
- mybatis学习笔记(十二) 映射配置文件详解
- mybatis resultMap映射学习笔记
- mybatis学习笔记(二) 多pojo,复杂映射
- MyBatis-Spring 学习笔记一 SqlSessionFactoryBean以及映射器类
- mybatis resultMap映射学习笔记
- Mybatis学习笔记——映射
- Mybatis学习笔记三(Mybatis SQL映射文件)
- JavaWeb学习笔记-mybatis-14-输入映射
- Mapper.xml映射文件---Mybatis学习笔记(八)