MyBatis初级入门

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

目录:

环境说明:

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 项目。

step 1:导入 Maven 依赖

在项目的根目录下的“pom.xml”配置文件中加入以下环境依赖项:

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

step 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>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;setUnicode=true&amp;characterEncoding=utf8"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>
  <!--    每一个mapper.xml配置文件都需要在mybaits核心文件中注册-->
  <mappers>
    <!--    使用文件路径的方式配置-->
    <mapper resource="com/langp/dao/UserMapper.xml"></mapper>
  </mappers>
</configuration>

在这个过程中配置数据库信息,或者可以在同一目录下再新建一个数据库配置文件jdbc.properties,里面写入数据库信息:

# 与JDBC中的配置十分类似
driver:com.mysql.jdbc.Driver
url:jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;setUnicode=true&amp;characterEncoding=utf8
username:root
password:root

step 3:编写工具类

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

public class Utils {
    private static SqlSessionFactory sqlSessionFactory;
    static{
        try {
            String resource = "mybatis-config.xml";
            // 使用mybatis
            // 1.获取SqlSessionFactory对象
            InputStream is = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取SqlSession的实例
     * SqlSession完全包含了面向数据库执行SQL命令所需的所有方法
     * @return sqlSessinFactory
     */
    public static SqlSession getSession() {
        if (sqlSessionFactory != null) {
            return sqlSessionFactory.openSession();
        }
        return null;
    }
}

为了更节省内存空间,提高运行效率,使用单例模式来定义工具类会更好:

public class Util {
    // 懒汉式单例
    private static Util util;
    static SqlSessionFactory sqlSessionFactory;


    private Util() {
        String resource = "mybatis-config.xml";
        InputStream is = null;
        try {
            is = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 单例模式下获取Util实例
    public static Util getInstance(){
        if (util == null) {
            util = new Util();
        }
        return util;
    }

    // 获取Session实例
    // Session中包含了执行SQL语句的所有方法
    public static SqlSession getSession() {
        if (sqlSessionFactory != null) {
            return sqlSessionFactory.openSession();
        }
        return null;
    }
}

step 4:编写代码

  • 实体类

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

    public class User {
        private int id;
        private String name;
        private Date updateTime;
    
        public User() {
        }
    
        public User(int id, String name,  Date updateTime) {
            this.id = id;
            this.name = name;
            this.pwd = pwd;
            this.updateTime = updateTime;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPwd() {
            return pwd;
        }
    
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
    
        public Date getUpdateTime() {
            return updateTime;
        }
    
        public void setUpdateTime(Date updateTime) {
            this.updateTime = updateTime;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", pwd='" + pwd + '\'' +
                    ", updateTime=" + updateTime +
                    '}';
        }
    }
  • Dao 接口

    public interface UserMapper {
        List<User> getUserList();
    }
  • 接口实现

    原来的 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.langp.dao.UserMapper">
    <!--    查询语句-->
    <!--    注意其中的id,和resultType返回类型的名称-->
        <select id="getUserList" resultType="com.langp.pojo.User">
            SELECT * FROM mybatis.user;
        </select>
    </mapper>

step 5:测试

创建测试类,单元测试方法没有返回值,没有参数

class UserMapperTest {
    @org.junit.jupiter.api.Test
    void getUserList() {
        // 获取sqlSession对象
        SqlSession sqlSession = MybatisUtils.getSession();
        // 执行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"/>

参考:解决WARN Establishing SSL connection without servers identity verification is not recommended问题_一一哥Sun的博客-CSDN博客

0

评论 (0)

取消