mybatis教程3(映射文件)
MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。
log4j
在程序的运行的过程中为了便于查询sql的输出,需要引入log4j
添加依赖
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
添加log4j.properties文件
log4j.rootCategory=DEBUG, stdout , R log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n log4j.appender.R=org.apache.log4j.DailyRollingFileAppender log4j.appender.R.File=C:\\tools\\logs\\dpb.log log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
效果
#和$
由于MyBatis底层还是Jdbc,而Jdbc在操作数据库传递参数时,有两种方式,一种是使用Statement,还有一种是使用PreparedStatement:
使用statement时,存在SQL注入问题,PreparedStatement则通过预编译解决了SQL注入问题。
在MyBatis种,引入参数有两种方式,一种是使用#,还有一种是使用$,其中,使用#对应了Jdbc种的PreparedStatement,而使用$则对应了Jdbc种的Statement,因此在MyBatis种,推荐使用#。
## #的使用
## $的使用
加入可以使用$替换#,注意,如果使用$,需要在Mapper种指定参数名字
接口中的类型如果没有指定@Param注解就会报错
给接口的参数前加注解描述
推荐使用#方式
多个参数
如果Mapper接口中有多个参数,无论参数名是什么,在Mapper.xml文件中,参数都是arg0、arg1....或者param1、param2....
如果非要使用自己的参数名,可以通过@Param注解自定义
<!--arg0 arg1 --> <insert id="addUser1" > insert into t_user(name,favorites)values(#{arg0},#{arg1}) </insert> <!-- param1 param2 --> <insert id="addUser2" parameterType="map"> insert into t_user(name,age)values(#{param1},#{param2}) </insert>
/** * 参数类型一致 * @param name * @param favorites * @return */ public int addUser1(String name,String favorites); /** * 参数类型不一致 * @param name * @param age * @return */ public int addUser2(String name,int age); /** * 参数类型不一致 * @param name * @param age * @return */ public int addUser3(@Param("name")String name,@Param("age")int age);
==数据添加成功==
包装对象
javaBean
public class UserWrapper { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
映射文件
<!-- 从包装对象中获取信息 包装对象的别名. 取信息 --> <insert id="addUser4" parameterType="UserWrapper"> insert into t_user(name,age,favorites)values(#{user.name},#{user.age} ,#{user.favorites}) </insert>
测试
Map
也可以使用HashMap做参数,使用Map做参数,非常灵活,但是==不推荐==。
ResultType
对于简单数据类型,例如查询总记录数、查询某一个用户名这一类返回值是一个基本数据类型的,直接写Java中的基本数据类型即可。
如果返回的是一个对象或者集合,并且对象中的属性和查询的字段名是一一对应的,那么resultType也可以直接写一个对象。
ResultMap
resultMap主要用来解决属性名和字段名不一致以及一对多、一对一查询等问题 字段名不一致时,首先可以通过取别名解决,例如Bean的定义如下:
User对象
private int id; // 该类型和字段不一致 private String username; private int age;
映射文件
测试结果
解决方式一
查询时,可以给查询结果取别名
这种方式,可以解决问题,但是有缺陷,最大缺陷是不能复用(可以sql片段解决,但是不完美)。
解决方式二
最佳解决方案就是使用resultMap,用法如下:
<resultMap type="com.sxt.bean.User" id="baseMap"> <id column="id" property="id"/> <result property="username" column="name"/> <result property="age" column="age"/> </resultMap> <select id="getUserById" resultMap="baseMap" resultType="com.sxt.bean.User"> select id ,name ,age from t_user where id=${id} </select>
使用
主键回写
一般情况下,主键有两种生成方式:
1.主键自增长
2.自定义主键(一般可以使用UUID)
如果是第二种,主键一般是在Java代码中生成,然后传入数据库执行,如果是第一个主键自增长,此时,Java可能需要知道数据添加成功后的主键。
在MyBatis中,可以通过主键回填来解决这个问题(推荐)。
主键回填
<!-- useGeneratedKeys:使用生成的主键 keyProperty="id":将生成的主键的值保存到对象的id属性中 --> <insert id="addEmp" parameterType="emp" useGeneratedKeys="true" keyProperty="id"> insert into t_emp(name,age)values(#{name},#{age}) </insert>
测试:
selectKey
另外,可以利用MySQL自带的==last_insert_id()==函数查询刚刚插入的id
<insert id="addEmp" parameterType="emp" > <selectKey keyProperty="id" resultType="int"> select LAST_INSERT_ID() </selectKey> insert into t_emp(name,age)values(#{name},#{age}) </insert>
- MyBatis官方教程及源码解析——mapper映射文件
- MyBatis官方教程及源码解析——mapper映射文件
- MyBatis官方教程及源代码解析——mapper映射文件
- Mybatis系列(四)映射文件
- mybatis系列-XML 映射配置文件(二)
- mybatis的sql映射文件—增删改查
- mybatis映射文件_select_resultMap
- mybatis --XML 映射配置文件
- IDEA maven项目下测试mybatis例子,使用mappper class或package引入mapper映射文件,总是报错Invalid bound statement(所有配置完全正确)
- 简单三步快速学会使用Mybatis-Generator自动生成entity实体、dao接口以及mapper映射文件(postgre使用实例)
- Mybatis 映射文件标签详解
- MyBatis中的映射文件标签属性 parameterType
- Mybatis XML 映射配置文件
- Java的MyBatis框架中XML映射缓存的使用教程
- 三、一起学MyBatis之XML映射配置文件
- MyBatis的xml映射配置文件详解
- mybatis之入门到开发(二)之核心配置文件+Mapper映射文件详解
- 【Mybatis】映射文件
- MyBatis学习 之 二、SQL语句映射文件(1)resultMap
- mybatis之映射文件(4)