Mybatis-映射文件(二)

Mybatis的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器XML文件就显得相对简单。如果拿他跟具有相同功能的JDBC代码进行对比,你会立即发现省掉了将近95%的代码。Mybatis就是针对SQL构建的,并且比普通方法做的更好。

一. 传入参数:

1.#和$

由于Mybatis底层还是jdbc,而jdbc在操作数据库传递参数是,有两种方式,一种是使用Statement,还有一种是使用PreparedStatement。 使用statement时,存在SQL注入问题,PreparedStatement则通过预编译解决了SQL注入的问题。
在Mybatis中,引入参数有两种方式,一种是使用#,还有一种是使用KaTeX parse error: Expected 'EOF', got '#' at position 7: ,其中,使用#̲对应了jdbc中的Prepar…则对应了jdbc中的Statement,因此在Mybatis中,推荐使用#。

#的使用:

mybatis javaType BigDecimal 做映射_User

$的使用:

mybatis javaType BigDecimal 做映射_User_02


mybatis javaType BigDecimal 做映射_主键_03


可以使用KaTeX parse error: Expected 'EOF', got '#' at position 3: 替换#̲,注意,如果使用,需要在Mapper中指定参数的名称。

接口中的类型如果没有指定@Param注解就会报错

#可以直接使用,$还有在接口中使用@Param

2.多个参数

如果Mapper接口中有多个参数,无论参数名是什么,在Mapper.xml文件中,参数都是arg0、arg1…或者是param1、param2…
如果非要使用自己的参数名,可以通过@param注解自定义。

mybatis javaType BigDecimal 做映射_映射文件_04

3.包装对象:

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>

测试:

mybatis javaType BigDecimal 做映射_映射文件_05


mybatis javaType BigDecimal 做映射_User_06

4.Map

也可以收HashMap做参数,使用Map做参数,非常灵活,但是不推荐。

三、返回数据

1.ResultType

对于简单数据类型,例如查询总记录数、查询某一个用户名这一类返回值是一个基本数据类型的,直接写Java中的基本类型即可。
如果返回的是一个对象或者集合,并且对象中的属性和查询的字段名是一一对应的,那么resultType也可以直接写一个对象。

2.ResultMap

resultMap只要用来解决属性名和字段名不一致以及一对多、一对一查询等问题,字段名不一致时,首先可以通过别名解决。
Demo:
User对象:

private int id;

// 该类型和数据库字段不一致
private String username;

private int age;

映射文件:

mybatis javaType BigDecimal 做映射_bc_07


结果:

mybatis javaType BigDecimal 做映射_User_08

解决这种问题的办法有两种:
1.在SQL语句中用别名:

mybatis javaType BigDecimal 做映射_User_09


这种方式,可以解决问题,但是有缺陷,最大缺陷是不能复用(可以sql片段解决,但是不完美)

2.使用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>
3.主键回写

一般情况下,主键与两种生成方式:
1.主键自增长
2.自定义主键

如果是第二种,主键一般是在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>

mybatis javaType BigDecimal 做映射_User_10

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 javaType BigDecimal 做映射_映射文件_11