Mybatis的XML映射文件
前面我们是将SQL语句绑定在USerDao类中,下面我们使用的是更为灵活的方法,将SQL语句写到xml映射文件中。
使用xml映射的优点:
使用多条件映射的SQL语句时,例如: SELECT * FROM t_user where birthday >= (#{date1}) and birthday <= (#{date2}) 这条SQL语句中使用了有两个条件。 如果使用的是UserDao绑定的方法,这条SQL语句就得是固定不变的。当我们要只需要其中的一个查询条件,又不想传1=1给SQL。 XML映射就可以解决这种方法。
我们的XML映射和UserDao绑定的方法是可以混合使用的,但是注意的是,我们不可以在同一个方法中同时使用XML映射和UserDao绑定。使用方法在 Mybatis解决连续条件使用中参考使用。
使用XML映射的几个条件:
-
使用的XML映射文件需要放在与UserDao类同一个包下 -
使用的xml文件中的namespace和需要绑定的Dao接口全限定名一致 -
使用的XMl文件的ID需要和UserDao类的方法名一致 -
使用的返回类型需要和UserDao类的返回类型一致
类型别名typeAliases
- 上面我们使用的XML文件中返回的类别名书写太长,比较麻烦。
使用类型别名typeAliases可以简化返回别名的书写。
# 注:该类型别名加入到src/main/resources下的application.properties
# 简化xml的开发
# mybatis类型别名
mybatis.type-aliases-package=com.test.bean
加入类别名之后我们只需要在返回别名中写User皆可。
-
每一个在包 com.iflytek.bean中的 Java Bean,默认会使用 Bean 的首字母小写的非限定类名来作为它的别名 -
如果需要修改默认的别名,可以使用@Alias注解,如
- 这里我插播一条能,调整dao类的日志输出等级,使其在控制台打印执行的SQL语句的application.properties配置
#调整dao类的日志输出等级,使其在控制台打印执行的SQL语句
logging.level.com.iflytek.dao=debug
输出效果如下
结果映射ResultMap
-
在数据库名与javaBean类属性名相同的情况下,MyBatis会自动匹配SQL与JavaBean中相同字段的参数作为返回。 -
在数据库名与javaBean类属性名不相同的情况下,就需要映射ResultMap来解决返回的问题。
<resultMap id="userResultMap" type="user">
<id column="id" property="id"></id> <!-- 主键的列用的id -->
<!-- 普通的列用的result, column表示数据库列名,property代表java类中的属性 -->
<result column="password" property="mypassword"></result>
</resultMap>
注意, 节点中resultMap和resultType只能二选一
Mybatis解决连续条件使用
这里说明标签==<where></where>,<set></set>。这两个标签通常包含<if></if>标签使用。
1. where会判定第一个使用到的if标签并消除if标签中的前面的and连接词,
如果一个条件都没有使用到那么就默认为无条件SQL操作。
2. set会判定第一个使用到的if标签并消除if标签中的后面的 , 符号。
where代码段:
<select id='getDate' resultType='user'>
SELECT * FROM t_user
<where>
<if test="date1 !=null">
and birthday >= (#{date1})
</if>
<if test="date2 !=null">
and birthday <= (#{date2})
</if>
</where>
</select>
set代码段:
<update id='updateUser'>
update t_user
<set>
<if test="realName != null ">
real_name=#{realName},
</if>
<if test="phone != null">
phone=#{phone},
</if>
<if test="email !=null">
email=#{email}
</if>
</set>
where id=#{id}
</update>
代码展示部分
XML部分
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.dao.UserDao">
<resultMap id="userResultMap" type="user">
<id column="id" property="id"></id> <!-- 主键的列用的id -->
<!-- 普通的列用的result, column表示数据库列名,property代表java类中的属性 -->
<result column="password" property="mypassword"></result>
</resultMap>
<select id='getUserById' resultType='user'>
select * from t_user where id=#{id};
</select>
<select id='wordUser' resultType='user'>
select * from t_user where real_name like concat('%',#{realname},'%');
</select>
<select id='getDate' resultType='user'>
SELECT * FROM t_user
<where>
<if test="date1 !=null">
and birthday >= (#{date1})
</if>
<if test="date2 !=null">
and birthday <= (#{date2})
</if>
</where>
</select>
<insert id='insertUser'>
insert into t_user( real_name, phone, email)
"
+ "values( #{realName}, #{phone}, #{email});
</insert>
<update id='updateUser'>
update t_user
<set>
<if test="realName != null ">
real_name=#{realName},
</if>
<if test="phone != null">
phone=#{phone},
</if>
<if test="email !=null">
email=#{email}
</if>
</set>
where id=#{id}
</update>
<delete id='deleteUser'>
delete from t_user where id=#{id};
</delete>
</mapper>
UserDao部分
package com.test.dao;
import java.util.List;
import com.test.bean.User;
public interface UserDao {
public User getUserById(Integer id);
public List<User> getUserByWord(String word);
public List<User> getAllUsers();
public List<User> getDate(String date1,String date2);
public void insertUser(User user);
public void updateUser(User user);
public void deleteUserById(Integer id);
}
|