mybatis-4-Mapper映射文件
Mapper映射文件
映射文件的Mapper标签包含标签
1、CDUS增删改查
2、参数处理
(1)直接传入参数
- 单个参数
//传入当个参数
public Employee getEmployeeById(int id);
- 多个参数
多个参数会被封装成一个Map对象,但是:map里的键是param1和param2...而不是id和lastName等等
//传入多个参数
//太过麻烦一般不用,用命名参数取代
public Employee getEmployeeByNameId(int id,String lastName);
- 命名参数(@Param注解)
常用
//命名参数
//明确指出哪些参数的键名是什么
public Employee getEmployeeByNameById(@Param("id")int id,@Param("lastName")String lastName);
(2)传入POJO和Map
POJO概念:我们总结一下给一个定义把,POJO是一个简单的、正规Java对象,它包含业务逻辑处理或持久化逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊角色和不继承或不实现任何其它Java框架的类或接口。
如果多个参数正好是我们业务逻辑的数据逻辑,我们可以直接传入POJO
#{属性名}:取出传入的pojo的属性值
但如果多个参数不是我们业务逻辑的数据逻辑,我们可以直接传入一个HashMap<String,Object>
注意点:键一定是String
如果传入多个参数,且经常需要使用,推荐编写一个TO(Tranfer Object)来达到目的
比如:Page
特殊思考
源码分析
(3)${}取值和#{}取值的区别
-
${}:直接在sql语句中注入内容,有一定安全问题
-
{}:类似于JDBC的?占位符,
-
虽然${}有安全问题,但是有一些地方JDBC是不能使用占位符的,这个时候就需要我们用到${}
比如:我们有很多薪水表,每个都以年份为标注,这个时候我们的#{}就起不了作用了,就需要用${}
insert into ${year}_salary (last_name,gender,email) values (#{lastName},#{gender},#{email});
(4)#{}规定参数规则
-
javaType、jdbcType、mode、numericScale、 resultMap、typeHandler、jdbcTypeName、expression
-
一般使用 jdbcType,
如:当接入数据库为Oracle时,我们传入的数据时null时,JDBC会转成OTHER,但Oracle是不能识别OTHER的,所以我们需要对传入的数据进行处理,#{email,jdbcType=NULL};强调当传入的参数为null时,JDBC传出的参数类型也为nul
-
在全局配置的setting中也可以配置,
<settings> <setting name="jdbcTypeForNull" value="NULL"/> </settings>
3、select元素
Select元素来定义查询操作。
- Id:唯一标识符。用来引用这条语句,需要和接口的方法名一致
- parameterType:参数类型。可以不传,MyBatis会根据TypeHandler自动推断,复杂的数据类型还是需要传入
- resultType:返回值类型。别名或者全类名,如果返回的是集合,定义集合中元素的类型。不能和resultMap同时使用
4、resultMap
数据库中的字段和bean类中的属性不一致解决方法?
1、给字段起别名
2、在全局配置文件中的setting板块开启自动驼峰命名法
3、就是使用resultMap
解决字段和属性不一致问题
sql影射文件
<resultMap id="EmployeeMap" type="Employee">
<!--id为主键:定义id为主键在后台会有优化-->
<id column="id" property="id"/>
<!--result定义普通封装-->
<result column="last_name" property="lastName"/>
<!--下面这些其实可以不写,但一般我们需要把全部都写下来-->
<result column="gender" property="gender"/>
<result column="email" property="email"/>
</resultMap>