本文主要实现《Java EE企业级应用开发教程(Spring+SpringMVC+Mybatis)》第2版中第4章中的MyBatis一对一查询。

本文使用工具:IDEA2024、jdk1.8、maven3.6.3

jdk1.8下载地址:

jdk1.8.0_131.zip(访问密码: 8855): https://url47.ctfile.com/f/64055047-1502030626-bfbf38?p=8855 

Maven3.6.3下载地址:

apache-maven-3.6.3.zip (访问密码: 8855): https://url47.ctfile.com/f/64055047-1502030329-d91abe?p=8855

Win10如何配置Java JDK环境,请点击这里。

Win10如何配置Maven环境,请点击这里。

IDEA如何配置JDK,请点击这里。

IDEA如何配置Maven,请点击这里。

可能遇到的报错:

java.io.IOException: Could not find resource mybatis-config.xml

IDEA 连接数据库报错Public Key Retrieval is not allowed

本文下载源代码在文章末尾。

0.数据库创建

我们按照下面的方式创建数据库和数据表

-- 创建数据库
CREATE DATABASE IF NOT EXISTS mybatis;
-- 使用数据库
USE mybatis;
-- 创建tb_idcard表
CREATE TABLE IF NOT EXISTS tb_idcard (
    id INT PRIMARY KEY AUTO_INCREMENT,
    code VARCHAR(20) NOT NULL
);
-- 插入数据
INSERT INTO tb_idcard(code) VALUES ('11111111');
INSERT INTO tb_idcard(code) VALUES ('22222222');
-- 创建tb_person
CREATE TABLE IF NOT EXISTS tb_person (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(32),
    age INT,
    sex CHAR(8),
    card_id INT UNIQUE,
		FOREIGN KEY(card_id) REFERENCES tb_idcard(id)
);
-- 插入两条数据
INSERT INTO tb_person(name,age,sex,card_id) VALUES ('Rose',22,'女',1);
INSERT INTO tb_person(name,age,sex,card_id) VALUES ('jack',23,'男',2);
1.项目创建

项目创建过程可以参考这篇文章:IDEA 2024版本创建maven项目的方式有哪些 – 每天进步一点点

这里选择使用maven的方式创建

打开IDEA,点击“文件—>新建—>项目”

这里使用生成器生成maven项目(maven配置正确才能正常构建)

jdk版本选的1.8

Archtype选择的是webapp,点击“创建”,等待一段时间后,项目构建完毕。

maven构建完项目后如下

出现上面的SUCCESS,空白的maven项目就创建完毕了。

下面开始引入依赖文件。

我们打开项目的pom.xml

参考下面的代码引入mybatis和mysql等依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.guo</groupId>
  <artifactId>ch04</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>ch04 Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <dependencies>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.2</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.11</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>ch04</finalName>
  </build>
</project>
2.创建实体类

先要创建相关的文件夹

这里创建java文件夹,也就是Maven源目录。这个文件夹创建后是蓝色的。

java这个文件夹如果不是蓝色的,可以右击这个文件夹,选择“将目录标记为”—>”源代码目录”

然后创建实体类的文件夹,com.itheima.pojo

右击java,选择“新建”,然后点击“软件包”

软件包的名字是 com.itheima.pojo,然后回车创建

然后创建实体类,右击pojo文件夹,选择“新建”—>”Java类”

类名是 IdCard,选择是“类”

代码参考下面:

package com.itheima.pojo;

public class IdCard {
    private Integer id; //身份证id
    private String code; //身份证号码
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    @Override
    public String toString() {
        return "IdCard{" +
                "id=" + id +
                ", code='" + code + '\'' +
                '}';
    }
}

生成后整个项目如下:

再按照同样方式生成一个类,类名是Person

类名是Person

参考代码如下:

package com.itheima.pojo;

public class Person {
    private Integer id;     //人员id
    private String name;    //人员姓名
    private Integer age;    //人员年龄
    private String sex;     //人员性别
    private IdCard card;    //人员关联的证件
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public IdCard getCard() {
        return card;
    }

    public void setCard(IdCard card) {
        this.card = card;
    }
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", card=" + card +
                '}';
    }
}

创建完后,项目如下所示

3.创建映射文件

选择“resources”文件夹,右击,选择“新建”—>”目录”

创建com.itheima.mapper文件夹

如果出现上面的提示,可以把文件的名字改为com/itheima/mapper

按回车后生成相关文件夹

然后,右击mapper文件夹,选择“新建”—>”文件”

文件名称为 “IdCardMapper.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="com.itheima.mapper.IdCardMapper">
    <!-- 根据id查询证件信息 -->
    <select id="findCodeByIdCard" parameterType="Integer" resultType="com.itheima.pojo.IdCard">
        select * from tb_idcard where id = #{id}
    </select>
</mapper>


创建后项目如下。

注意,此处id=findcodeByIdCard爆红是对的,因为还没有做关联。

然后创建第二个文件(PersonMapper.xml)

文件名称是PersonMapper.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="com.itheima.mapper.PersonMapper">
        <!-- 嵌套查询:通过执行另外一条SQL映射语句来返回预期的特殊类型 -->
        <select id="findPersonById" parameterType="Integer" resultMap="IdCardWithPersonResult">
            select * from tb_person where id = #{id}
        </select>

        <resultMap type="com.itheima.pojo.Person" id="IdCardWithPersonResult">
            <id property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="age" column="age"/>
            <result property="sex" column="sex"/>
            <!--一对一 association使用select属性引入另一条SQL语句 -->
            <association property="card" column="card_id" javaType="com.itheima.pojo.IdCard"
                         select="com.itheima.mapper.IdCardMapper.findCodeByIdCard" />
        </resultMap>
</mapper>

创建完后,项目如下所示:

4.创建数据库配置文件db.properties

右击“resources”文件夹,选择“新建”——>”文件”

文件名称为db.properties

参考代码如下:

mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
mysql.username=root
mysql.password=123456

注意,此处要修改为你自己的数据库的用户名和密码。

5.创建mybatis配置文件mybatis-config.xml

右击“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>
    <!-- 环境配置 -->
    <!-- 加载类路径下的属性文件 -->
    <properties resource="db.properties"/>

    <typeAliases>
        <package name="com.itheima.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!-- 数据库连接相关配置 ,db.properties文件中的内容-->
            <dataSource type="POOLED">
                <property name="driver" value="${mysql.driver}"/>
                <property name="url" value="${mysql.url}"/>
                <property name="username" value="${mysql.username}"/>
                <property name="password" value="${mysql.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 配置Mapper文件 -->
    <mappers>
        <mapper resource="com/itheima/mapper/PersonMapper.xml"/>
        <mapper resource="com/itheima/mapper/IdCardMapper.xml"/>
    </mappers>
</configuration>

创建完后,项目结构如下

6.创建测试类

右击src文件夹,选择“新建”—>”目录”

这里文件夹是 test/java

注意颜色,测试文件夹是绿色,如果不是绿色需要手动标记成测试源。

右击绿色的java文件夹,选择“新建”—>”Java类”

类名为 MyBatisTest

参考代码如下:

import com.itheima.pojo.Person;
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.Reader;

public class MyBatisTest {


    @Test
    public void findPersonByIdTest() {
        //读取文件名
        String resources = "mybatis-config.xml";
        //创建流
        Reader reader = null;
        try {
            //读取mybatis-config.xml文件内容到reader对象中
            reader = Resources.getResourceAsReader(resources);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //初始化mybatis数据库,创建SqlSessionFactory类的实例
        SqlSessionFactory sqlMapper = new
                SqlSessionFactoryBuilder().build(reader);
        //创建SqlSession实例
        SqlSession session = sqlMapper.openSession();
        //传入参数查询,返回结果
        Person person = session.selectOne("com.itheima.mapper.PersonMapper.findPersonById", 1);
        System.out.println(person);


        //关闭session
        session.close();
    }
}

添加完后项目结构如下:

测试效果如下:

本文源代码下载:

ch04.zip: (访问密码: 7381)

https://url47.ctfile.com/f/64055047-8529740723-c19c83?p=7381