Skip to content

XML配置Mybatis

1. 配置mybatis

MyBatis的配置文件的顶层结构如下:

  • properties(属性)
  • settings(设置)
  • typeAliases(类型别名)
  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
  • environments(环境配置)
    • environment(环境变量)
    • transactionManager(事务管理器)
    • dataSource(数据源)
  • databaseIdProvider(数据库厂商标识)
  • mappers(映射器)

创建mybatis-config.xml文件,内容如下:

xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <typeAliases>
        <typeAlias alias="User" type="com.rocket.demo.entity.User"/>
    </typeAliases>
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.101.102:3306/sql_exercise"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="dbMapper/UserMapper.xml"/>
    </mappers>
</configuration>

mapUnderscoreToCamelCase配置的是是否开启驼峰命名自动映射,即从经典数据库列名A_COLUMN映射到经典Java属性名aColumn, 默认是false。
typeAlias: 给全限定类名取一个简短的名字。它仅用于XML配置。
environments: MyBatis可以配置成适应多种环境,比如开发、测试和生产环境需要有不同的配置。
transactionManager: 在MyBatis中有两种类型的事务管理器: JDBC(事务基于JDBC实现), MANAGED(通过整合Spring,交由Spring管理)。
dataSource: 数据源类型有三种:UNPOOLED(每次请求时打开和关闭连接)|POOLED(使用数据连接池)|JNDI(常见于应用服务器这类容器中使用)。
mappers: 定义SQL映射语句位置,它支持4种方式:

xml
<mappers>
    <!-- 使用相对于类路径的资源引用 -->
    <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
    <!-- 使用完全限定资源定位符(URL) -->
    <mapper url="file:///var/mappers/AuthorMapper.xml"/>
    <!-- 使用映射器接口实现类的完全限定类名, SQL写在接口类上面 -->
    <mapper class="org.mybatis.builder.AuthorMapper"/>
    <!-- 将包内的映射器接口全部注册为映射器, SQL写在接口类上面 -->
    <package name="org.mybatis.builder"/>
</mappers>

2. 创建Maven工程

添加pom依赖:

xml
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.19</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

3. 创建Mapper和实体类

java
package com.rocket.demo.dao;

import com.rocket.demo.entity.User;
import java.util.List;

public interface UserMapper {
    List<User> selectUser();
}
java
package com.rocket.demo.entity;

import java.util.Date;

public class User {
    private int id;

    private String userName;

    private int age;

    private int sex;

    private Date createTime;

    ......get/set/toString方法
}

4. 创建Mapper映射文件

MyBatis的强大之处在于它的语句映射,和传统JDBC相比,让用户能更专注于SQL代码,SQL映射文件结构如下:

  • cache:该命名空间的缓存配置。
  • cache-ref:引用其它命名空间的缓存配置。
  • resultMap:描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
  • sql:可被其它语句引用的可重用语句块。
  • insert:映射插入语句。
  • update:映射更新语句。
  • delete:映射删除语句。
  • select:映射查询语句。

创建UserMapper.xml文件如下:

xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.rocket.demo.dao.UserMapper">
    <select id="selectUser" resultType="User">
        select * from t_user
    </select>
</mapper>

select: 用于配置查询语句,id表示UserMapper接口的方法名,resultType表示返回结果类型,如需参数使用#{参数名}表示。

5. 构建SqlSessionFactory

SqlSessionFactoryBuilder从XML配置文件构建SqlSessionFactory实例。SqlSessionFactory

java
public static void main(String[] args) throws IOException {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    try (SqlSession session = sqlSessionFactory.openSession()) {
        UserMapper mapper = session.getMapper(UserMapper.class);
        List<User> users = mapper.selectUser();
        System.out.println(users);
    }
}

运行结果:
Alt text