Mybatis-Mapper.xml输入输出映射
2016-12-04 12:53
387 查看
在Mybatis中,Mapper.xml主要负责对数据库的具体操作,即增、删、改、查等相关操作,
对于mapper.xml,我们需要掌握一些常用的标签,下面做出介绍。
首先,先对此次讲解数据库表做一个说明,数据库表字段为id、username、sex、birthday、address
使用JavaBean对象实现映射类如下:
parameterType-输入映射
parameterType即为输入类型,在Mybatis中,我们对数据库进行相关操作时,则会对sql传入一些值,那么这些值都有其相应的数据类型。
#{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符,即类似于Hibnernate的PareStatement中的?。
使用占位符#{}可以防止sql注入,在使用时不需要关心参数值的类型,mybatis会自动进行java类型和jdbc类型的转换。
#{}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
${}和#{}不同,通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。使用${}不能防止sql注入,但是有时用${}会非常方便,如下的例子:
如果本例子使用#{}则传入的字符串中必须有%号,而%是人为拼接在参数中,显然有点麻烦,如果采用${}在sql中拼接为%的方式则在调用mapper接口传递参数就方便很多。
比如order by排序,如果将列名通过参数传入sql,根据传的列名进行排序,应该写为:
ORDER BY${columnName}
如果使用#{}将无法实现此功能。
传递pojo对象
在Mybatis中,可使用ognl表达式解析对象字段的值,如下配置所示:
#{id}与{username},这里的id与username表示的是user对象中的属性名称。
其中paramwterType=“user”则表示其输入类型为User对象,即使用User对象中的相关属性。
这时可以使用包装对象传递输入参数。
传递poio包装对象,首先则需要进行包装对象的定义,如下所示:
映射对象的扩展类如下:
包装对象定义完成后,我们就可以在mapper.xml文件中进行相关的配置:
测试代码如下:
ResultType-输出映射
输出类型即为Mybatis执行sql之后结果的输出类型。
简单输出类型
简单输出类型即为常见的数据类型,我们从下面的例子进行理解。
Mapper.xml配置文件:
int型下符合需求。
在这里,不只是int型的数据可用,在实际开发中,我们还会用到例如String、Date、Boolean等数据类型,此类即为常用简单输出类型。
例如:现在需要根据用户id查询出一个用户,并且显示该用户所有数据
在前面我们已经介绍过类似JavaBean与数据库表的映射,即为poio对象,poio对象的属性对应了数据库表的字段,要想输出所有数据,那嚒
我们输出poio对象,是否就将数据全部输出了呢?答案是肯定的,输出poio对象,即输出了所有的属性信息。(注:只能输出一条信息,类似于selectOne())
为了加深理解,我们可以通过下面例子进行理解:
mapper.xml文件:
mapper接口:
测试类:
例如:查询所有用户名有‘解’的用户,显然可能会有很多用户。因此,我们需要使用输出poio列表的方式进行输出。
实例:mapper.xml
mapper接口
测试类:
resultMap-高级输出映射
resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
resultMap的定义:
定义好之后,我们就可以在mapper.xml文件中进行使用了,如下:
到这里呢,mapper.xml的常用的标签就完成了,但是还有一个重要的东西,即动态sql,动态sql在Mybatis的开发中十分重要,
那么打算分开进行介绍,在编写完成后会在此处打上链接。
动态Sql文章链接如下(2017-3)
点击打开链接
对于mapper.xml,我们需要掌握一些常用的标签,下面做出介绍。
首先,先对此次讲解数据库表做一个说明,数据库表字段为id、username、sex、birthday、address
使用JavaBean对象实现映射类如下:
package com.sw.po; import java.util.Date; /* *@Author swxctx *@time 2016年11月30日 *@Explain:属性名与表的字段对应 */ public class User { private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address + "]"; } }
parameterType-输入映射
parameterType即为输入类型,在Mybatis中,我们对数据库进行相关操作时,则会对sql传入一些值,那么这些值都有其相应的数据类型。占位符#{}、${}
#{}与${}在开发中比较常用,在sql具有变量时俊辉使用到#{}与${}#{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符,即类似于Hibnernate的PareStatement中的?。
<!-- 根据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接口传递参数就方便很多。
//如果使用占位符号则必须人为在传参数中加% List<User> list = userMapper.selectUserByName("%解%");
//如果使用${}原始符号则不用人为在参数中加% List<User>list = userMapper.selectUserByName("解");
比如order by排序,如果将列名通过参数传入sql,根据传的列名进行排序,应该写为:
ORDER BY${columnName}
如果使用#{}将无法实现此功能。
传递pojo对象
在Mybatis中,可使用ognl表达式解析对象字段的值,如下配置所示:<!—传递pojo对象综合查询用户信息 --> <select id="findUserByUser" parameterType="user" resultType="user"> select * from user where id=#{id} and username like '%${username}%' </select>
#{id}与{username},这里的id与username表示的是user对象中的属性名称。
其中paramwterType=“user”则表示其输入类型为User对象,即使用User对象中的相关属性。
传递pojo包装对象
开发中通过pojo传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。
传递poio包装对象,首先则需要进行包装对象的定义,如下所示:
package com.sw.po; import java.util.List; /* *@Author swxctx *@time 2016年12月2日 *@Explain:包装所需要的查询条件(亦可包装其他对象的查询信息)-包装类型 */ public class UserQueryVo { //传入多个id private List<Integer> ids; //用户查询条件 private UserCustom userCustom; public UserCustom getUserCustom() { return userCustom; } public void setUserCustom(UserCustom userCustom) { this.userCustom = userCustom; } public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } }
映射对象的扩展类如下:
package com.sw.po; /* *@Author swxctx *@time 2016年12月2日 *@Explain:User类的扩展类 */ public class UserCustom extends User{ //可以扩展用户的信息 }
包装对象定义完成后,我们就可以在mapper.xml文件中进行相关的配置:
<select id="findUserList" parameterType="com.sw.po.UserQueryVo" resultType="com.sw.po.UserCustom"> select *from user where username=#{username} </select>
传递HashMap
在Mybatis中,亦可通过HashMap输入值,其mapper.xml配置如下:<!-- 传递hashmap综合查询用户信息 --> <select id="findUserByHashmap" parameterType="hashmap" resultType="user"> select * from user where id=#{id} and username like '%${username}%' </select>如上,#{id}与{username}则表示hashmap中的对应key值,经过配置后,配置文件会自动到代码中寻找key为id的字段,如果没有,则会出现异常。
测试代码如下:
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", "Swxctx"); //传递Hashmap对象查询用户列表 List<User>list = userMapper.findUserByHashmap(map); //关闭session session.close(); }
ResultType-输出映射
输出类型即为Mybatis执行sql之后结果的输出类型。简单输出类型
简单输出类型即为常见的数据类型,我们从下面的例子进行理解。Mapper.xml配置文件:
<!-- 获取用户列表总数 --> <select id="findUserCount" parameterType="user" resultType="int"> select count(1) from user </select>如上所示,resultType=“int”,即表示sql执行输出结果为int型的,从sql不难看出,该sql的作用是查询出数据库表的数据总条数,自然其应该为
int型下符合需求。
在这里,不只是int型的数据可用,在实际开发中,我们还会用到例如String、Date、Boolean等数据类型,此类即为常用简单输出类型。
输出poio对象
输出poio对象,显然,在执行sql之后,我们输出的是一个对象;那么如何理解呢,其实结合poio对象来进行理解,也就不难。例如:现在需要根据用户id查询出一个用户,并且显示该用户所有数据
在前面我们已经介绍过类似JavaBean与数据库表的映射,即为poio对象,poio对象的属性对应了数据库表的字段,要想输出所有数据,那嚒
我们输出poio对象,是否就将数据全部输出了呢?答案是肯定的,输出poio对象,即输出了所有的属性信息。(注:只能输出一条信息,类似于selectOne())
为了加深理解,我们可以通过下面例子进行理解:
mapper.xml文件:
<!-- 根据id查询用户信息 --> <select id="findUserById" parameterType="int" resultType="user"> select * from user where id = #{id} </select>
mapper接口:
public User findUserById(int id) throws Exception;
测试类:
Public void testFindUserById() throws Exception { //获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); //通过mapper接口调用statement User user = userMapper.findUserById(1); System.out.println(user); //关闭session session.close(); }
输出pojo列表
输出pojo列表与上面的输出pojo差别并不大,唯一的差别就是:输出对象输出的是一个对象,而输出对象列表则可以输出多条数据。例如:查询所有用户名有‘解’的用户,显然可能会有很多用户。因此,我们需要使用输出poio列表的方式进行输出。
实例:mapper.xml
<!-- 根据名称模糊查询用户信息 --> <select id="findUserByUsername" parameterType="string" resultType="user"> select * from user where username like '%${value}%' </select>
mapper接口
public List<User> findUserByUsername(String username) throws Exception;
测试类:
Public void testFindUserByUsername()throws Exception{ //获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); //如果使用占位符号则必须人为在传参数中加% //List<User> list = userMapper.selectUserByName("%管理员%"); //如果使用${}原始符号则不用人为在参数中加% List<User> list = userMapper.findUserByUsername("管理员"); //关闭session session.close(); }
输出HashMap
输出pojo对象可以改用hashmap输出类型,将输出的字段名称作为map的key,value为字段值。resultMap-高级输出映射
resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
resultMap的定义:
<!-- 定义ResultMap 将select id id_,username username_ from user where id=#{id}查询出来的列与 pojo(User)类中的属性做映射(对应关系) type:ResultMap最终所映射的Java对象类型(可使用别名) id:对ResultType于ResultMap的唯一标识 --> <resultMap type="user" id="userResultMap"> <!-- 查询结果集中的唯一标识(对应于数据库表中字段的唯一标识) colum:查询出的列名 property:pojo的属性名字(Type指定的pojo对象 最终resultMap对column和property进行映射(做映射关系) --> <id column="id_" property="id"/> <!-- 对普通列的映射定义 --> <result column="username_" property="username"/> </resultMap>
定义好之后,我们就可以在mapper.xml文件中进行使用了,如下:
<!-- 使用ResultMap进行输出的映射 ResultMap:指定已定义的ResultMap的id(该ResultMap在其他的Mapper文件中,需要在前面加上namespace进行指定) --> <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap"> select id id_,username username_ from user where id=#{id} </select>
到这里呢,mapper.xml的常用的标签就完成了,但是还有一个重要的东西,即动态sql,动态sql在Mybatis的开发中十分重要,
那么打算分开进行介绍,在编写完成后会在此处打上链接。
动态Sql文章链接如下(2017-3)
点击打开链接
相关文章推荐
- (转)MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql
- MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql
- MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql
- mybatis的mapper代理,SqlMapConfig.xml中配置,输入和输出映射使用案例
- Mybatis - SqlMapConfig.xml , 输入映射 ,输出映射 ,动态sql ,sql片段
- mybatis进阶--mapper输入映射和输出映射
- Mybatis学习(05)-mapper代理方法开发dao && 输入映射和输出映射
- mybatis进阶--mapper输入映射和输出映射
- 【MyBatis学习06】输入映射和输出映射
- 【Mybatis架构】输入、输出映射
- 【Mybatis架构】输入、输出映射
- 【mybatis深度历险系列】mybatis中的输入映射和输出映射
- MyBatis基础学习:XML映射文件(Mapper.xml)
- Mybatis深入了解(四)----输入输出映射
- mybatis 输入映射和输出映射
- mybatis源码学习之执行过程分析(2)——config.xml配置文件和mapper.xml映射文件解析过程
- 【MyBatis学习06】输入映射和输出映射
- Mybatis 输入和输出映射
- mybatis入门基础(四)----输入映射和输出映射
- Mybatis深入了解(四)----输入输出映射