MyBatis的输入和输出映射
MyBatis的输入和输出映射,通过parameterType完成输入映射,通过resultType和resultMap完成输出映射。
1、输入映射parameterType
输入映射中,可以给出类的全名,也可以给出类的别名,但是别名必须是MyBatis内部定义或者自定义的,可以选择JavaBean、Map等简单的参数类型传递给SQL。
1.1基本类型
基本类型可以使用别名的方式,如果想要查看常见的 Java 类型内建的相应的类型别名,点击这里,它们都是不区分大小写的。(具体的测试方法可以看我上一篇写的博客)
1 | <delete id="deleteUserById" parameterType="Integer"> |
1.2自定义对象
输入类型还可以为自定义的对象,在书写Sql语句获取数值的时候,可以使用”#{对象字段名}”的方式取得数值。以下就是通过输入一个自定义对象的方式将参数传递给SQL,实现修改指定用户名的功能。(具体的测试方法可以看我上一篇写的博客)
1 | <update id="updateUser" parameterType="io.xiezhenyu98.bean.User"> |
1.3自定义包装类
输入类型还可以为自定义的包装类,在书写SQL语句获取数值的时候,可以使用”#{包装类字段.被包装类字段}”的方法获得数值。
UserVo.java包装类
1 | public class UserVo { |
UserMapper.java接口
1 | //通过UserVo id查询一个用户 |
UserMapper.xml映射文件
1 | <!-- 查找用户UserVo --> |
测试方法
1 |
|
结果
1 | User [u_id=1, u_username=老王, u_password=123, u_sex=1, u_createTime=null, u_cid=1] |
2、输出映射resultType、resultMap
2.1resultType
resultType,定义类的全路径,在允许自动匹配的情况下,结果集将通过JavaBean的规范映射,数据库中表的字段名和JavaBean中的字段名对应,或定义为int、double、float、map等参数,也可以使用别名,但是要符合别名的规范,且不能和resultMap同时使用。resultType是常用的参数之一,比如统计总条数时可以把它设置为int。
2.1.1基本类型
输出映射的基本类型和输入映射的基本类型一样,可以使用别名的方式,如果想要查看常见的 Java 类型内建的相应的类型别名,点击这里,它们都是不区分大小写的。以下是查询用户总数返回Integer的返回值。
1 | <!-- 查询用户总条数 --> |
2.1.2自定义类型
输出映射的自定义类型(具体的测试方法可以看我上一篇写的博客)
1 | <!-- 查找用户 --> |
2.2resultMap
resultMap,它是映射集的引用,将执行强大的映射功能。可以使用resultType、resultMap的其中一个,resultMap能提供自定义映射规则的机会,数据库中表的字段名和JavaBean中的字段名不对应,则需要添加自定义映射。resultMap是MyBatis最复杂的元素,可以配置映射规则、级联、typeHandler等等。
2.2.1Bean对象字段与数据库中字段不匹配
创建Country实例,实例中Country的id与数据库中的不匹配(数据库中的为c_id)
1 | public class Country { |
创建CountryMapper接口
1 | import java.util.List; |
创建CountryMapper映射文件
1 |
|
测试方法
1 |
|
结果
1 | Country [id=1, c_countryname=中国, c_capital=北京] |
在这里如果我们将resultMap改成resultType的话,id将查询不到。
1 | <select id="selectAll" resultType="country"> |
结果
1 | Country [id=null, c_countryname=中国, c_capital=北京] |
2.2.2关联查询
2.2.2.1一对一
一个用户只对应一个国家。(在单表查询的时候,javaBean对象的字段和数据库字段一致的时候可以省略但在多表查询的时候,我们要查询什么字段,就必须把什么字段列在映射文件上)
UserVo包装类
1 | public class UserVo extends User{ |
UserMapper接口
1 | //查询所有用户的包装类 |
UserMapper.xml映射文件
1 | <!-- 查询所有用户的包装类 --> |
测试方法
1 |
|
结果:查询到了所有的用户,以及用户的国家,没有国家的用户也查询到了
1 | UserVo [country=Country [id=1, c_countryname=中国, c_capital=null], getU_id()=1, getU_username()=老王, getU_sex()=1] |
2.2.2.1一对多
一个国家有多个用户。
CountryVo包装类
1 | import java.util.List; |
CountryMapper接口
1 | //查询所有的CountryVo |
CountryMapper映射文件
1 | <!-- 查询所有的CountryVo --> |
测试方法
1 |
|
结果:查询出了,一个国家有几个用户
1 | CountryVo [userList=[User [u_id=1, u_username=老王, u_password=null, u_sex=null, u_createTime=null, u_cid=null], User [u_id=4, u_username=王司机, u_password=null, u_sex=null, u_createTime=null, u_cid=null], User [u_id=6, u_username=李师傅, u_password=null, u_sex=null, u_createTime=null, u_cid=null], User [u_id=9, u_username=王五, u_password=null, u_sex=null, u_createTime=null, u_cid=null]], toString()=Country [id=1, c_countryname=中国, c_capital=北京]] |
原文作者: 谢振瑜
原文链接: https://Xiezhenyu98.github.io/2019/10/17/MyBatis的输入和输出映射/
版权声明: 转载请注明出处(必须保留作者署名及链接)