天天看点

MyBatis 框架配置详解

    • mybatis-configxml 的配置详解
      • 配置 environments 标签
        • 配置 dataSource 标签
        • 配置dataSource 标签内的 property 标签
        • 配置事务
      • 配置 mappers 标签
    • XXXMapperxml 文件配置详解
      • 多参数接口
      • resultMap 标签的配置

mybatis-config.xml 的配置详解

配置文件的头部

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 在此处进行配置 -->
</configuration>
           

配置

<environments>

标签

首先要配置的是

<configuration>

下的环境标签

<environments>

,这个是所有的环境,此标签下可以配置多个

<environment>

标签,使用

id

属性区别不同的环境。这说明 MyBatis 可以配置多个环境,但是一次只能使用一个环境,指定目前使用的环境,只需要在

<environments>

标签下使用

default

属性来指定使用哪个环境即可。

<environments default="development">
        <environment id="development">
            <!--配置事务管理,采用JDBC的事务管理  -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- POOLED:mybatis自带的数据源,JNDI:基于tomcat的数据源 -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
           

配置

<dataSource>

标签

现在,就可以在

<environment>

标签中配置其它属性了。第一,我们一定要配置一个

dataSource

标签,就是数据源,通过

type

属性来指定数据源的类型,可选的值有

POOLED

JNDI

UNPOOLED

三个值可以选择。// TODO 三种值的区别

配置

<dataSource>

标签内的

<property>

标签

配置了类型之后,下一步就得让数据源连上数据库,所以我们需要在标签内配置几个属性标签。使用

<property>

配置属性,通过 name 属性指定要配置的属性名,通过 value 属性指定属性的值。在这里我们配置了四个属性分别是

driver

配置了数据库驱动,

url

配置了数据库路径,

username

配置了数据库用户名,

password

配置了数据库用户密码。这样一来,理论上,我们就可以连接上数据库了。

配置事务

使用

<transactionManager>

标签管理事务。使用

type

属性指定使用事务的类型,值有

JDBC

使用JDBC来管理事务。TODO 还有其它值吗?

配置

<mappers>

标签

配置完

<environments>

标签,环境就已经配置好了,接下来要配置的是映射文件(包括了对实体类的操作),使用

<mappers>

标签配置所有的映射文件,注意:

XXXMapper.xml 文件配置详解

首先定义

<mapper>

根标签,其它只有一个

namespace

属性需要定义,表示映射的接口类。之后Mybatis会根据配置文件中的操作实现接口类。

<?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.mybatis.dao.UserDao">
    <!-- 数据库操作 -->
</mapper>
           

查询使用

<select>

标签,插入使用

<insert>

标签,更新使用

<update>

标签,删除使用

<delete>

标签,它们都必须设置id属性,表示是实现了接口中的哪个方法,所以id的值必须与接口中的方法名相同。

如果查询结果与实现类是一一对应的,可以设置属性

resultType

来设置返回实体类型,Mybatis会自动将结果包装成一个或多个实体类型的实例(多个包装为

List

),

如果查询结果是一个值,就将

resultType

设置成值的类型即可得到。

// UserDao.java 接口类
public interface UserDao {
    int selectCount();
    List<User> selectAll();
    List<User> selectLikeName(String name);
}
           
<!-- Mapper.xml -->
<select id="selectCount" resultType="int">
    select count(1) from smbms_user
</select>

<select id="selectAll" resultType="com.mybatis.pojo.User">
    select * from smbms_user
</select>

<!-- 一个参数 -->
<select id="selectLikeName" resultType="com.mybatis.pojo.User" parameterType="String">
    select * from smbms_user where userName like CONCAT('%', #{ name },'%')
</select>
           

多参数接口

如果接口方法只有一个参数,可以直接在查询标签中使用

#{}

,中间写参数名(因为只有一个参数,参数名与接口方法中的形参名是否相同,无关紧要)即可。

但是如果有一个接口方法有两个或多个参数,应该怎么办?有两种方法:

1、使用Map类型的参数,所有的参数都放入一个Map中,Map的Key为参数名,Value为参数值。现在查询标签中使用的参数名就必须与Map中的Key一致。

// UserDao文件
public interface UserDao {
    List<User> selectByNameRole(Map<String, Object> map);
}
           
<!-- UserMapper.xml 文件 -->
<!-- 多个参数 -->
<select id="selectByNameRole" parameterType="Map" resultType="com.mybatis.pojo.User">
    select * from smbms_user where userName like CONCAT('%', #{ userName },'%') and userRole = #{ userRole }
</select>
           
// Test.java 测试文件
Map<String, Object> map = new HashMap<>();
map.put("userName", "张");
map.put("userRole", );         
List<User> list = userDao.selectByNameRole(map);
           

2、使用实体,将参数封装到一个实体类中,将实体类为参数,此时,实体中的属性名为在查询标签中的参数名。比如,保存用户时的代码。

// User.java 实体类文件
public User {
    private String userCode;     //用户编码
    private String userName;     //用户名称
    private String userPassword; //用户密码
    private Integer userRole;    //用户角色
    // setter与getter省略
}
// UserDao 接口文件
public interface UserDao {
    int addUser(User user);
}
           
<!-- UserMapper.xml 配置文件 -->
<insert id="addUser" parameterType="com.mybatis.pojo.User">
    insert into smbms_user(userCode, userName, userPassword, userRole) values(#{ userCode }, #{ userName }, #{ userPassword }, #{ userRole })
</insert>
           
// Test.java 测试类文件
User user = new User();
user.setUserCode("zhangwei");
user.setUserName("张伟");
user.setUserPassword("123456");
user.setUserRole();
int number = userDao.addUser(user);
           

<resultMap>

标签的配置

前面我们说的都是查询结果与实体类一一对应的情况,但是,当进行联表查询时,又应该怎么办呢?就应该使用

<resultMap>

标签了,这个标签主要是对查询的结果进行映射,插入到对应的实体中。

<resultMap>

标签可以使用的属性有

id

设置映射的ID,在查询标签中使用;属性

Type

设置要映射到的类的路径。

<resultMap>

标签中可以使用的标签有

<id>

指定表中主键与类中的属性进行对应,

<result>

指定表中的列名与类中的属性进行对应,

<collection>

标签指定表中属性与类中集合进行对应(一对多),

<association>

标签指定表中属性与类中子对象进行对应(一对一)。

假设,我们想在查询用户信息时,除了得到用户的信息外,还想知道用户的角色名称(UserRoleName)。就需要事先在用户类中多设置一个表示用户角色名称属性,该属性在上面的例子中均为空。只有使用

<resultMap>

标签进行手动对应时,才能将值放入该属性中。

// User.java 实体类文件
public User {
    private Long id;
    // 省略其它属性
    private String userRoleName;  // 角色名称(存放用户角色名称的属性)
    // 省略Setter和Getter
}
           
// UserDao.java 接口文件
public UserDao {
    // 得到用户信息和角色名称信息
    List<User> selectUserRole();
}
           
<!-- UserMapper.xml 配置文件 -->
<resultMap id="RoleUser" type="com.mybatis.pojo.User" >
    <id property="id" column="id" />
    <!-- 省略其它属性的对应 -->
    <!-- 多增加的一列进行手动对应 -->
    <result property="userRoleName" column="userRoleName" />
</resultMap>
<!-- 查询所有用户的信息和角色名称信息 -->
<select id="selectRoleName" resultMap="RoleUser" >
    select u.*, r.roleName as userRoleName from smbms_user u, smbms_role r where u.userRole = r.id
</select>
           
// Test.java 测试文件
List<User> list = userDao.selectUserRole();
list.get().getUserRoleName();  // 得到用户的角色名称信息
           

注意:在

<resultMap>

标签中没有

<collection>

标签或者

<association>

标签的情况下,可以默认自动匹配类中的属性名与表中的列名。一旦出现这两个标签其中任何一个,那默认将不再进行匹配,必须手动对应或在配置文件中强制匹配。

就像上面的例子,其实可以在

<resultMap>

标签中只写

userRoleName

属性的对应,其它都可以省略。因为这个标签既没有

<collection>

标签,也没有

<association>

标签。

如果想要强制匹配,可以在 mybatis-config.xml 文件下设置

<setting>

标签的

name

属性设置为

autoMappingBehavior

value

属性设置为

FULL

表示强制全部匹配。

<!-- mybatis-config.xml 下的<configuration>标签进行配置 --> 
<setting name="autoMappingBehavior" value="FULL">
           

继续阅读