2. MyBatis入门案例

环境搭建

需求


利用Mybatis框架,从MySQL中查询所有的用户

准备数据


create table user (
id int primary key auto_increment,
username varchar(20) not null,
birthday date,
sex char(1) default '男',
address varchar(50)
);

insert into user values (null, '孙悟空','1980-10-24','男','花果山水帘洞');
insert into user values (null, '白骨精','1992-11-12','女','白虎岭白骨洞');
insert into user values (null, '猪八戒','1983-05-20','男','福临山云栈洞');
insert into user values (null, '玉面狐','1995-03-22','女','积雷山摩云洞');
insert into user values (null, '玉兔精','2010-02-12','女','天竺国皇宫');
insert into user values (null, '豹子精','2008-05-03','男','隐雾山折岳洞');

select * from user;

准备步骤


1. 创建Maven项目

2. MyBatis入门案例_经验分享image-20210309000024338

2.设置 Maven 的相关依赖

        <!-- log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!--  mybatis      -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.0</version>
        </dependency>
        <!--  mysql-connector-java     -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>

3. 创建核心配置文件 sqlMapConfig.xml

2. MyBatis入门案例_经验分享_02image-20210309000641653

4.创建日志记录的配置文件 log4j.properties

2. MyBatis入门案例_经验分享_03image-20210309000751197

用来设置日志记录的格式,因为Mybaits需要使用到log4j来记录它的日志

日志文件用来记录程序运行过程中的各种事件

5.编写用户dao接口和dao映射文件 (记得分包)

2. MyBatis入门案例_经验分享_04image-20210309003524947

6.编写用户的实体类文件

2. MyBatis入门案例_经验分享_05image-20210309003558279

7.编写测试代码

2. MyBatis入门案例_经验分享_06image-20210309001256332

项目整体结构

2. MyBatis入门案例_经验分享_07image-20210309003626903

3.2 配置文件和接口

3.2.1 日志文件

#1. 在resources下创建一个名为log4j.properties
#2. 作用: 记录MyBatis运行过程中的各种事件

代码

2. MyBatis入门案例_经验分享_08image-20210309003704285
### 设置Logger输出级别和输出目的地 ###
log4j.rootLogger=debug, stdout

### 把日志信息输出到控制台 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout

3.2.2 核心配置文件sqlMapConfig.xml


# 1. 可以在Mybatis官网入门中找到配置模板
 http://www.mybatis.org/mybatis-3/zh/getting-started.html
# 2. 在工程中的resources目录下创建一个名为sqlMapConfig.xml
# 3. 记得修改第15行的数据库名

代码


2. MyBatis入门案例_经验分享_09image-20210309003733033
<?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="default">
        <!--环境变量-->
        <environment id="default">
            <!--事务管理器:由JDBC管理事务 -->
            <transactionManager type="JDBC"/>
            <!--数据源配置信息:POOLED 使用连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/db3"/>
                <property name="username" value="root"/>
                <property name="password" value="******密码*****"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加载其他的映射文件 -->
    <mappers>
        <mapper resource="com/lijw/dao/UserMapper.xml"/>
    </mappers>
</configuration>

3.2.3 UserMapper接口

# 1. 在com.lijw.dao包下创建一个接口,名为UserMapper
# 2. 在接口中定义一个查询所有用户的方法

代码


2. MyBatis入门案例_经验分享_10image-20210309003821396
package com.lijw.dao;

import com.lijw.entity.User;
import java.util.List;

/**
 *  数据访问层方法
 *
 * @author Aron.li
 * @date 2021/3/9 0:09
 */

public interface UserMapper {

    /**
     查询所有的用户
     */

    List<User> findAllUsers();

}

3.2.4 用户映射文件 UserMapper.xml

# 1. 在 resources 目录下创建一个xml文件,名为UserMapper.xml
# 2. 映射文件的模板地址
 http://www.mybatis.org/mybatis-3/zh/getting-started.html

代码


2. MyBatis入门案例_经验分享_11image-20210309003926942
<?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 指定接口的类全名
-->

<mapper namespace="com.lijw.dao.UserMapper">
    <!--
    查询语句
    id: 接口中方法的名字
    resultType:返回的实体类的类型,类全名
    -->

    <select id="findAllUsers" resultType="com.lijw.entity.User">
        select * from user
    </select>
</mapper>

3.2.5 实体类

# 1. 数据库表对应实体
 a. 属性名和user表中字段名一致

# 2. 基本类型使用包装类
    b. 实体类中基本数据类型,都使用它的包装类。这样与表中的数据更加匹配
    c. 因为如果从数据库中读取不到对应的数据,应该是null比较合适
        int id;  //默认的值是0 
        Integer id; //默认是null

User类代码


2. MyBatis入门案例_经验分享_12image-20210309004004753
package com.lijw.entity;

import java.io.Serializable;
import java.sql.Date;

/**
 *
 *  用户实体类对象
 *
 * @author Aron.li
 * @date 2021/3/9 0:10
 */

public class User  implements Serializable {

    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public User() {
    }

    public User(Integer id, String username, Date birthday, String sex, String address) {
        this.id = id;
        this.username = username;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }

    ....
}

3.3 测试类

# 1. 在com.lijw.dao下编写一个测试类: TestUserMapper
# 2. 然后运行: 查询到user表中所有数据

代码


2. MyBatis入门案例_经验分享_13image-20210309004114847
package com.lijw.dao;

import com.lijw.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * 使用mybatis访问数据库
 *
 * @author Aron.li
 * @date 2021/3/9 0:12
 */

public class UserMapperTest {

    @Test
    public void test01() throws IOException {
        //1. 得到输入流对象
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //2. 创建会话工厂建造类
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3. 通过建造类得到会话工厂类
        SqlSessionFactory factory = builder.build(inputStream);
        //4. 通过会话工厂得到会话对象
        SqlSession session = factory.openSession();
        //5. 会话对象得到UserMapper接口的代理对象
        UserMapper userMapper = session.getMapper(UserMapper.class);
        // 生成了代理对象:org.apache.ibatis.binding.MapperProxy@198b6731
        System.out.println(userMapper);
        //6. 执行查询操作
        List<User> users = userMapper.findAllUsers();
        for (User user : users) {
            System.out.println(user);
        }
        //7. 关闭会话
        session.close();
    }

}

测试执行如下:

2. MyBatis入门案例_经验分享_14image-20210309004211103

3.4 入门案例解释

三大对象的声明周期


在Mybatis中一个会话相当于一次访问数据库的过程,一个会话对象类似于一个Connection连接对象。

  1. SqlSessionFactoryBuilder:这是一个临时对象,用完就不需要了。通过这个工厂建造类来创建一个会话工厂。
  2. SqlSessionFactory:从一个工厂类中得到一个会话对象,一个项目中只需要创建一个会话工厂对象即可。通过会话工厂对象来创建会话对象。
  3. SqlSession:每次访问数据库都需要创建一个会话对象,这个会话对象不能共享。访问完成以后会话需要关闭。

MyBatis工作流程


CRUD:增删改查的操作(Create、Retrieve、Update、Delete)

Resources工具类直接可以读取 resources 目录下配置文件,转成输入流

2. MyBatis入门案例_经验分享_151575558785104

步骤


  1. 通过框架提供的Resources类,加载sqlMapConfig.xml,得到文件输入流InputStream对象
  2. 实例化会话工厂创建类SqlSessionFactoryBuilder
  3. 通过上面的SqlSessionFactoryBuilder对象,读取核心配置文件的输入流,得到会话工厂SqlSessionFactory类
  4. 使用SqlSessionFactory对象,创建SqlSession对象
    1. 它相当于JDBC中的Connection对象,提供了操作数据库的CRUD方法
    2. 它提供了一个getMapper()方法,获取接口的实现对象。
  5. 获取接口的对象UserMapper,得到接口的代理对象
  6. 执行数据库的查询操作,输出用户信息
  7. 关闭会话,释放资源