Maven项目中的MyBatis配置

知识分子没文化
2021-05-31 / 0 评论 / 1,083 阅读 / 2,981 字数 / 正在检测是否收录...

目录:

环境说明:

IDE:IDEA 2020.03

Java:jdk 1.8

MyBatis版本:3.5.3

mysql:5.5

mysql-connector-java:5.1.47

Junit:5.7.0

01

官方文档: mybatis – MyBatis 3 | 简介

Github 地址: GitHub - mybatis/mybatis-3: MyBatis SQL mapper framework for Java

Maven 仓库地址: Maven Repository: org.mybatis » mybatis (mvnrepository.com)

一、简介

  • MyBatis 是一款优秀的持久层框架
  • 支持自定义 SQL、存储过程以及高级映射。
  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
  • MyBatis 本是 apache 的一个开源项目 iBatis,2010 年这个项目由 apache 迁移到了 google code,并且改名为 MyBatis。
  • 2013 年 11 月迁移到 Github。

二、创建项目

准备数据库,设置字符集与排序规则为 utf-8,否则无法正常插入中文字符。

02

然后执行以下 SQL 语句:

-- 创建表
CREATE TABLE user(id INT NOT NULL AUTO_INCREMENT primary key,name char(20),updateTime datetime);

-- 插入两条数据
INSERT INTO user(name,updateTime) value("张三",sysdate());
INSERT INTO user(name,updateTime) value("李四",sysdate());

并且在 idea 中建好一个 Maven 项目。

2.1、导入 Maven 依赖

项目根目录下的 pom.xml 文件配置 Maven 依赖,在这个配置文件中加入以下依赖的坐标:

<dependencies>
    <!--Mybatis-->
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.3</version>
    </dependency>

    <!--mysql驱动-->
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>

    <!--Junit-->
    <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.7.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

2.2、创建 mybatis 核心配置文件

文件名:mybatis-config / mybatis-cfg,或其他

文件模板及说明:mybatis – MyBatis 3 | 入门

<?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>
    <settings>
        <!-- 打印sql日志 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- MySQL8.0以下的驱动名叫com.mysql.jdbc.Driver  MySQL8.0以上的驱动名是com.mysql.cj.jdbc.Driver -->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 每一个mapper.xml配置文件都需要在mybaits核心文件中注册 -->
    <mappers>
        <!-- 使用文件路径的方式配置 -->
        <!-- <mapper resource="com/wlplove/dao/AtlasMapper.xml"/> -->

        <!-- 也可以使用类的方式进行配置 -->
        <mapper class="com.wlplove.dao.AtlasMapper"/>
    </mappers>

</configuration>

其中,在这个配置文件的 <dataSource> 标签中定义了数据库连接信息,这里将信息写成了固定的死值。还有一种更灵活的方式就是从配置文件中读取信息,在 resources 目录下再新建一个数据库配置文件 jdbc.properties,里面写入数据库信息:

# MySQL8.0以下的驱动名叫com.mysql.jdbc.Driver  MySQL8.0以上的驱动名是com.mysql.cj.jdbc.Driver
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/pic?useSSL=false&useUnicode=true&characterEncoding=UTF-8
username=root
password=root

# 或者也可以配置成以下形式:
#driver:com.mysql.jdbc.Driver
#url:jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;setUnicode=true&characterEncoding=utf8
#username:root
#password:root

修改配置文件中的数据库信息部分为引用外部配置:

<!-- 配置文件的路径 -->
<properties resource="jdbc-config.properties"/>

<dataSource type="POOLED">
    <!-- MySQL8.0以下的驱动名叫com.mysql.jdbc.Driver  MySQL8.0以上的驱动名是com.mysql.cj.jdbc.Driver -->
    <property name="driver" value="${driver}"/>
    <!-- 使用属性占位符 ${} 读取 property 文件中的属性 -->
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
</dataSource>

3.3、编写工具类

将加载 SqlSession 的过程写成一个工具类,方便调用:

public class MyBatisUtil {

    /**
     * 根据 XML 配置文件初始化出 SqlSessionFactory,并获取到 SqlSession 对象
     * @return sqlSession
     */
    public static SqlSession getSqlSession() {
        SqlSession sqlSession = null;
        try {
            String xmlFileResource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(xmlFileResource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            sqlSession = sqlSessionFactory.openSession();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sqlSession;
    }

}

3.4、编写代码

实体类

即业务中涉及到的类,并且包括构造方法、getter 方法、setter 方法以及 toString() 方法

public class User {

    private int id;

    private String name;

    private Date updateTime;

    // 构造方法、set方法、get方法、toString方法略....
}
Dao 接口 UserMapper
public interface UserMapper {
    List<User> getUserList();
}
接口实现 UserMapper.xml

原来的 UserDaoImpl 转换为一个接口的 Mapper 映射文件:

<?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">

<!-- namespace绑定一个Dao/mapper接口 -->
<mapper namespace="com.wlplove.dao.UserMapper">
    <!-- 查询语句 -->
    <!-- 注意其中的id,和resultType返回类型的名称 -->
    <select id="getUserList" resultType="com.wlplove.pojo.User">
        SELECT * FROM mybatis.user;
    </select>
</mapper>

定义好 Mybatis 的这个 Mapper 映射文件之后,需要在 Mybatis 的配置文件中注册一下才能正常调用:

<!-- 每一个mapper.xml配置文件都需要在Mybaits核心文件中注册,有这么两种方式注册: -->
<mappers>
    <!-- 使用文件路径的方式 -->
    <!-- <mapper resource="com/wlplove/dao/AtlasMapper.xml"/> -->

    <!-- 也可以使用类的方式 -->
    <mapper class="com.wlplove.dao.AtlasMapper"/>
</mappers>

3.5、测试

只要在前面导入了 Junit 的依赖之后,就可以写一个单元测试方法调用写好的接口,单元测试方法没有返回值,没有参数,可以像 main 方法一样直接执行。

class UserMapperTest {

    // 每一个单元测试方法前面加入 @Test 注解
    @Test
    void getUserList() {
        // 获取sqlSession对象
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        // 执行sql
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }
        // 关闭sqlSession
        sqlSession.close();
    }
}

三、问题

1、找不到 mapper.xml 文件

报错信息:Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/wlplove/dao/UserMapper.xml

原因是 Maven 在打包的时候,默认打包 src/main/java 下的 class 文件与 src/main/resources 下的配置文件,没有将该路径下的 mapper 配置文件打包进来,导致运行时候找不到 mapper 文件而报错。

解决方法:手动指定资源文件的位置,参考:mybatis:Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource_在路上s的博客-CSDN博客

修改 pom.xml 文件,在里面加入以下内容,然后更新 Maven 配置即可:

<build>
    <!-- **.xml写在src找不到问题解决方案 -->
    <resources>
        <resource>
            <!-- directory:指定资源文件的位置 -->
            <directory>src/main/java</directory>
            <includes>
                <!-- “**” 表示任意级目录    “*”表示任意任意文件 -->
                <!-- mvn resources:resources :对资源做出处理,先于compile阶段  -->
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <!--  filtering:开启过滤,用指定的参数替换directory下的文件中的参数(eg. ${name}) -->
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
</build>

2、SSL 连接问题

报错信息:

WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

翻译过来就是:
警告:不建议在没有服务器身份验证的情况下建立SSL连接。根据MySQL 5.5.45+、5.6.26+和5.7.6+的要求,如果没有设置显式选项,则默认情况下必须建立SSL连接。为了符合不使用SSL的现有应用程序,verifyServerCertificate属性设置为“false”。您需要通过设置useSSL=false来显式禁用SSL,或者设置useSSL=true并为服务器证书验证提供信任存储。

在数据库的连接参数中添加不使用 SSL 连接的参数 useSSL=false 即可解决:

<property name="url" value="jdbc:mysql://localhost:3306/practice?setUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false"/>

参考:

史上最详细mybatis与spring整合教程-腾讯云开发者社区-腾讯云 (tencent.com)

0

评论 (0)

取消