开发第一个mybatis以及mybatis里面的套路解析

159 阅读6分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

下载mybatis

链接:blog.MyBatis.org 下载省略,可以百度看看其他文章

开发mybatuis文件的模板

1.创建maven项目,包括如下

image.png

2.pom.xml

百度:mvnrepository.com 然后在里面找,MyBatis,mysql-connect-java依赖类,并且在pom里面加入build属性

3.打开数据库,添加我们想要的数据和表

参考 mysql数据库习题2 - 掘金 (juejin.cn)

4.在实体类包下根据数据库字段创建实体类,包括setget方法,tostring方法(数据库字段==类属性)

5.在mapper的xxxMapper.xml里面添加sql映射文件

SQL 映射文件(XxxMapper.xml)的基础模板如下(以 select 查询操作为例),代码详见如下程序清单:

<?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="{namespace}">
    <select id="{id}" parameterType="{ptype}" resultType="{rtype}">
        SQL语句,如select * from student where stuNo=#{stuNo}
    </select>
</mapper>
映射文件中主要的元素及属性含义如下:

1.命名空间

<mapper namespace="{namespace}">
用 namespace 属性给此映射文件设置一个命名空间,通常使用 xxx.xxx.xxx 的形式,而且就是映射文件的路径名转换而来。例如,映射文件的路径是 org/lanqiao/mapper/StudentMapper.xml,那么 namespace 的值就是org.lanqiao.mapper.StudentMapper2.查询标签

<select id="{id}" parameterType="{ptype}" resultType="{rtype}">
    SQL语句,如select * from student where stuNo=#{stuNo}
</select>
id:唯一标识符。程序可以通过 “命名空间+唯一的标识符”(namespace+id)来定位此 select 标签中的 SQL 语句。

parameterType:传入 SQL 语句中的参数类型。例如,SQL 语句中的 stuNo=#{stuNo} 需要传入一个 int 型的 stuNo 时,就可以通过 parameterType="int" 将输入参数的类型设置为 int。

resultType:SQL 语句查询的返回类型。例如,select * from student … 返回的是一个学生的全部信息,可以用学生对象集合来保存,因此返回类型应该是 List<Student> 类型。但在 MyBatis 中,无论返回值是一个对象还是一个集合,resultType 都只能设置为对象或集合元素的类型,而不能是集合类型

除了查询标签 <select> 以外,还有增加 <insert>、修改 <update>、删除 <delete> 等标签。

6.配置文件 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="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml" />
    </mappers>
</configuration>
其中主要的元素及属性含义如下:

多环境配置
<environments default="development">
default:指定一个环境 id,与子元素 <environment> 的 id 属性值对应。

environments:可以为同一个 MyBatis 项目配置多种不同的数据库环境,如开发环境、测试环境、工作环境等。因此在 MyBatis 中,
可以使用相同的 SQL 映射来操作不同环境的数据库。但要注意,虽然允许配置多种不同的环境,但在使用时,environments 只能选择唯一的一个环境
,即通过 environments 元素的 default 属性来指定默认使用的 environment 的 id 值。
这样可以方便开发者快速地在不同数据库环境之间切换。此外,每个数据库环境(environment 元素)在程序中对应着一个 SqlSessionFactory 对象。

前述在测试类 TestMyBatis.java 中,通过配置文件 mybatis-config.xml 
创建的 SqlSessionFactory 对象,就是根据数据库环境 environment 元素的内容产生的,如下:

String resource = "mybatis-config.xml";
//加载MyBatis的配置文件
Reader reader = Resources.getResourceAsReader(resource);
//创建SqlSession 的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
以上,是根据 environments 元素中 default 属性指定的数据库环境而产生的
SqlSessionFactory 对象。除此以外,还可以在 Java 代码中显式指定数据库环境 id,如下:

SqlSessionFactory sessionFactory
= new SqlSessionFactoryBuilder().build(reader,"development");
即通过 build() 方法的第二个参数,将数据库的环境id 指定为 development 所代表的 environment。

具体环境配置
<environment> 是 <environments> 的子元素,表示具体的数据库环境,
它又有 <transactionManager> 和 <dataSource> 两个子元素,用于配置该数据库环境的事务管理和数据源参数。

事务管理器,语法如下:

<transactionManager type="JDBC" />
type:指定事务管理器类型。在 MyBatis 中有两种事务管理器类型:

JDBC:使用 JDBC 的提交和回滚来管理事务,即利用 java.sql.Connection 
对象完成对事务的提交 commit()、回滚 rollback()、关闭 close() 等

MANAGEDMyBatis 自身不会去管理事务,而是把事务托管给容器
(比如 SpringJBOSSWeblogic 容器)。默认情况会关闭连接,若不想关闭则需要如下配置:
<transactionManager type="MANAGED">
    <property name="closeConnection"  value="false"/>
</transactionManager>
数据源,语法如下:

<dataSource type="POOLED">
type:指定数据源类型。MyBatis 中有三种数据源类型:

UNPOOLED:每次被请求时简单打开和关闭连接,需要配置属性如下表所示:

属 性 名	简 介
driver	JDBC 驱动的 Java 全类名
url	数据库的 JDBC URL 地址
username	登录数据库的用户名
password	登录数据库的密码
defaultTransactionIsolationLevel	默认事务隔离级别
POOLED:数据库连接池类型,它使得数据库连接可被复用,不必在每次请求时都去创建一个新的连接。

JNDI:从 tomcat 等容器中获取数据源。

映射文件

<mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml" />
</mappers>
mappers:用于罗列 SQL 映射文件
mapper 的 resource 属性:SQL 映射文件(XxxMapper.java)的相对路径

7.编写test


@Test public void testStudent() throws IOException { 
String resource = "mybatis-config.xml"; 
//加载 MyBatis 的配置文件 
Reader reader = Resources.getResourceAsReader(resource);
//创建 SqlSession 的工厂 
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建能够执行 SQL 映射文件中 SQL 语句的 SqlSession 对象
SqlSession session = sessionFactory.openSession();
//指定 SQL 语句对应的标识字符串:namespace+id 
String statement = "mapper.XXXMapper.里面mapper的id"; 
//执行查询
实体类 名字 = session.selectOne(参数);
session.close(); } }

实例:开发第一个基于 MyBatis 的程序

首先我们在终端输入以下命令,新建一个 Maven 项目,groupId 为:xxx; artifactId 为: MyBatisDemo01

mvn archetype:generate -DgroupId=xxx -DartifactId=MyBatisDemo01 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -Dversion=0.0.1-SNAPSHOT

创建文件 Student.javaStudentMapper.xmlmybatis-config.xmlTestMyBatis.java

pom文件

项目框架搭建完成,我们需要配置 pom.xml 文件。在 pom.xml 文件中配置 mybatis 和 mysql-connector-java 依赖,如下代码所示:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>

      <groupId>org.lanqiao</groupId>
      <artifactId>MyBatisDemo01</artifactId>
      <version>1.0-SNAPSHOT</version>

      <name>MyBatisDemo01</name>
      <!-- FIXME change it to the project's website -->
      <url>http://www.example.com</url>

      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
      </properties>

      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.5.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.23</version>
        </dependency>
        <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.17</version>
        </dependency>
      </dependencies>

      <build>
        <resources>
          <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
          </resource>
          <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
          </resource>
        </resources>
      </build>
</project>

创建数据

CREATE DATABASE IF NOT EXISTS `MyBatisDemo`;
USE `MyBatisDemo`;
DROP TABLE IF EXISTS `student`; 
CREATE TABLE `student` (
`stuNo` int(10) NOT NULL, 
`stuName` varchar(50) NOT NULL,
`stuAge` tinyint,
`graName` varchar(50) NOT NULL, 
PRIMARY KEY (`stuNo`) ) 
ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `student` values (31, '张三', 23, '1班'); 
insert into `student values (32, '李四', 24, '2班'); 
insert into `student` values (34, '王五', 25, '3班'); 
insert into `student` values (36, '赵六', 26, '4班'); 
insert into `student` values (37, '孙琪', 27, '五班');

编写student类

public class Student{
//学号 
private int stuNo; 
//姓名 
private String stuName;
//年龄
private int stuAge;
//年级
private String graName; 
public Student(){ } 
public Student(int stuNo, String stuName, int stuAge, String graName) {
this.stuNo = stuNo;
this.stuName = stuName; 
this.stuAge = stuAge;
this.graName = graName; 
}
public int getStuNo() { 
return stuNo; 
} 
public void setStuNo(int stuNo)
{ 
this.stuNo = stuNo; 
} 
public String getStuName() { 
return stuName; 
} 
public void setStuName(String stuName) 
{ this.stuName = stuName; }
public int getStuAge() { 
return stuAge;
}
public void setStuAge(int stuAge) { 
this.stuAge = stuAge;
} 
public String getGraName() {
return graName; 
} public void setGraName(String graName) {
this.graName = graName;
} 
//为了方便地输出对象中的内容,重写toString()方法 
@Override
public String toString() { 
return "学号:"+this.stuNo+"\t姓名:"+this.stuName +"\t年龄:"+this.stuAge+"\t年级:"+this.graName;
} 
}

sql映射

<?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.StudentMapper">
    <select id="queryStudentByNo" parameterType="int"
            resultType="xxx.entity.Student">
        select * from student where stuNo=#{stuNo}
    </select>
</mapper>

说明:在 SQL 映射文件中,SQL 语句(如 select * from …)的最后一般不加分号 “;”。 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.cj.jdbc.Driver" />
                <property name="url"
                    value="jdbc:mysql://localhost:3306/MyBatisDemo?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="" />
            </dataSource>
        </environment>
    </environments>
    <!-- 在配置文件(mybatis-config.xml)中注册SQL映射文件(StudentMapper.xml)-->
    <mappers>
        <mapper resource="mapper/StudentMapper.xml" />
    </mappers>
</configuration>

TestMyBatis.java 代码如下。

import ...
public class TestMyBatis {
    @Test
    public void testStudent() throws IOException {
        String resource = "mybatis-config.xml";
        //加载 MyBatis 的配置文件
        Reader reader = Resources.getResourceAsReader(resource);
        //创建 SqlSession 的工厂
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //创建能够执行 SQL 映射文件中 SQL 语句的 SqlSession 对象
        SqlSession session = sessionFactory.openSession();
        //指定 SQL 语句对应的标识字符串:namespace+id
        String statement = "mapper.StudentMapper.queryStudentByNo";
        //执行查询,返回一个学号为 32 的 Student 对象
        Student student = session.selectOne(statement, 32);
        System.out.println(student);
        session.close();
    }
}