MyBatis 框架配置详解

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"></transactionManager>

使用 <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", 3);         
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(3);
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(0).getUserRoleName();  // 得到用户的角色名称信息

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

就像上面的例子,其实可以在 <resultMap> 标签中只写 userRoleName 属性的对应,其它都可以省略。因为这个标签既没有 <collection> 标签,也没有 <association> 标签。

如果想要强制匹配,可以在 mybatis-config.xml 文件下设置 <setting> 标签的 name 属性设置为 autoMappingBehaviorvalue 属性设置为 FULL 表示强制全部匹配。

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

Guess you like

Origin blog.csdn.net/cuipp0509/article/details/79850720