MyBatis 教程

文章列表
简介 准备工作 回顾 JDBC 数据准备 查找id为1的用户信息 自定义连接池 不用MyBatis配置文件 查询密码为123的所有用户 如果Bean中成员变量和表中字段命名不一致 更多查询用户的方式 对查询结果排序 日志 添加、删除、修改数据 事务 动态SQL 一对一和一对多的实现 一对一和一对多的延迟加载 多对多的实现 分页查询 把SQL写在注解中 自动生成Mapper代码和映射XML mybatis generator 生成 select for update mybatis generator 支持数据版本号

MyBatis: 查找id为1的用户信息


本示例代码在 mybatis-demo-001

数据准备

数据准备

项目结构

使用 IDEA 创建 gradle 项目,最终结构如下:

添加依赖

在 build.gradle 中添加以下依赖:

compile group: 'org.mybatis', name: 'mybatis', version: '3.4.6'
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.47'

compile group: 'org.projectlombok', name: 'lombok', version: '1.18.0'

compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.25'
compile group: 'log4j', name: 'log4j', version: '1.2.17'

compile group: 'junit', name: 'junit', version: '4.12'

配置log4j

在 resources 目录下增加文件 log4j.properties,内容如下:

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

增加 user 表对应的类 User

在 java 目录下创建bean包,然后添加 User 类,内容如下:

package bean;

import lombok.Data;

@Data
public class User {

    private Long id;
    private String name;
    private String email;
    private String password;

}

这个类中的字段和 user 表中的列是一一对应的。

mybatis 配置

resources目录下增加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>
    <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://127.0.0.1:3306/blog_db?useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

environments下可以配置多个environment(即环境,如开发环境、生产环境等),environmentsdefault属性指定默认用哪个环境。

environment中可以配置事务管理器、数据库地址、用户、密码等。

mappersenvironments平级,指定 XML 映射文件的位置。

mapper/UserMapper.xml在哪里呢?在resources目录下,下面会讲到。

定义映射接口

java/mapper下创建 UserMapper 接口,代码如下:

package mapper;

import bean.User;

public interface UserMapper {

    /**
     * 根据id获取用户信息
     * @param id
     * @return
     */
    User findById(Long id);

}

UserMapper 接口中的方法findById能下面的 XML 映射文件中的内容与resource/mapper/UserMapper.xml中的配置对应起来的。

编写 XML 映射文件

resource/mapper下创建 UserMapper.xml,内容如下:

<?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="mapper.UserMapper">
    <!-- findById必须和接口中的方法名一样 -->
    <select id="findById" parameterType="java.lang.Long" resultType="bean.User">
        select * from blog_db.user where id=#{id}
    </select>
</mapper>

<mapper>标签的namesapce指定了对应的类,也就是2.5中定义的 UserMapper 接口。

<select>的id是findById,对应UserMapper接口的findById方法。parameterType指明了findById的参数类型,不过这个属性是可以省略的。<select>中是一个select语句,其中#{id}对应方法findById的参数Long id,执行select查询后,返回的类型是bean.User

注意,如果把UserMapper.xml文件放到resource/dao目录下,然后将mybatis-config.xml<mapper resource="mapper/UserMapper.xml"/>改成<mapper resource="dao/UserMapper.xml"/>也是可以的。但是建议放在和 UserMapper 接口所在package同名的resource目录下,即resources/mapper下。<mapper resource="mapper/UserMapper.xml"/> 也可以改成 <mapper class"mapper.UserMapper"/>

在这里留几个问题:

  1. 如果函数有多个参数,parameterType 该怎么写?
  2. #{id}如果换成#{hello}是否有效?

最后一步

以上,我们把该准备的都做好了,现在开始写「业务逻辑」。创建 Main 类,内容如下:

import java.io.IOException;

import lombok.extern.slf4j.Slf4j;
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 bean.User;
import mapper.UserMapper;
import org.junit.Test;


@Slf4j
public class Main {

    @Test
    public void test_01() throws IOException {
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sessionFactory;

        sessionFactory = sqlSessionFactoryBuilder.build(
                Resources.getResourceAsReader("mybatis-config.xml"),
                "development"  // 这个参数可以省略,因为 mybatis-config.xml 的<environments>标签指定了默认环境为development
        );

        SqlSession sqlSession = sessionFactory.openSession();

        // 以上是样板代码
        // 以下是「业务逻辑」

        try {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User user = userMapper.findById(1L);
            log.info("{}", user);
        } finally {
            sqlSession.close();
        }
    }

}

执行结果如下:

 INFO [main] - User(id=1, name=letian, email=letian@111.com, password=123)

和预期一样!😆

如果 User 类中的定义没有 password 字段,那么执行结果将是:

 INFO [main] - User(id=1, name=letian, email=letian@111.com)

再留一个问题: 我们只定义了 UserMapper 接口,为什么下面的代码中我们得到了一个 UserMapper 对象?

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

( 本文完 )

文章目录