Mybatis简介

Mybatis,Apache公司的一个开源项目ibatis,2010年项目迁到Google code改名mybatis,2013年迁到github。

Mybatis是一个优秀的持久层框架,它可以在实体类和sql语句间建立映射,是一种半自动化的ORM(Object Relational Mapping,对象关系映射)

Mybatis与JDBC

平时用JDBC访问数据库,除了写sql语句外,还必须操作Connection、Statement、ResultSet等辅助类,在访问不同的表时还需写许多雷同的代码,步骤繁琐且枯燥;

在大型企业项目中,程序和数据库交互次数多、数据读写量大,用传统的jdbc操作数据库无法满足性能需求,同时,jdbc的使用也会带来代码冗余、复用性低等问题;

jdbc劣势:

1.频繁的创建、释放数据库连接造成系统资源浪费,从而影响系统性能。

2.slq语句硬编码、PreparedStatement向占位符传参硬编码、ResultSet解析硬编码;

而在实际开发中,sql语句变动可能性大,用jdbc操作数据库的话,当sql变动要改变java代码,查询条件where改变需要改动PreparedStatement,结果集改变则需要改动ResultSet。sql的变动需要修改大量的java代码,这样一来,不仅违反了开闭原则,而且代码会非常难以维护。

Mybatis优势

mybatis对jdbc操作数据库的过程做了一定程度的封装,用了batis之后,我们只需提供sql语句,而不需要花费大量精力去处理注册驱动Driver、创建Connection对象、创建Statemen/PreparedStatement对象、手动设置参数、结果集检索、异常处理等JDBC繁杂的过程代码。

Mybatis的环境搭建

DB环境: mysql 8.0.27 Community Server

工具: maven

IDE: idea 2021.2.3

辅助网址:maven中央仓库:https://mvnrepository.com/

Mybatis入门程序

运行结果:

用mybatis框架访问数据库,打印sql语句执行返回的结果

mybatis 使用java function java的mybatis_xml

 项目目录:

mybatis 使用java function java的mybatis_intellij-idea_02

 

 

说明:

基于框架运行的程序,对于jar版本、配置文件的正确性要求非常严苛,任何地方出错都会导致编译错误,但完成配置后的框架,能极大地提高开发速度

1.创建数据库和数据准备

1.win+r—输入"cmd"回车—输入"mysql -uroot -p"回车—输入密码—出现版本信息(若无版本信息则先安装配置mysql环境)

2.create datebase firstbatis;回车

mysql> create database firstmybatis;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| firstmybatis       |        |
+--------------------+
10 rows in set (0.00 sec)

 数据准备(idea中集成了mysql的图形控制,可随后在idea中完成这一步)

mysql> use firstmybatis
Database changed
mysql> create table user(
    -> id int primary key auto_increment,
    -> name varchar(16),
    -> age int
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql>  insert into user(id,name,age) values(null,'Cozar',22),(null,'Celine',20);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

 2.创建工程

打开idea,file-new-project/Maven,输入

name,点击下拉按钮Artifact Coordinates,输入GroupId(通常为公司或个人倒置的网络域名,如com.Apache或person.cozar,创建完成后groupID信息也可在pom.xml中修改),ArtifactId与项目同名,Version默认即可

mybatis 使用java function java的mybatis_intellij-idea_03

3.引入相关依赖

pom.xml文件中引入依赖,联网状态下,maven会根据依赖自动导入jar包

使用maven首先你大概要知道在项目中需要用到哪些jar包,然后访问maven中央仓库官网 :https://mvnrepository.com/,直接搜索寻找相应jar包的依赖,将需要的jar版本依赖信息复制到pom.xml即可。

mybatis 使用java function java的mybatis_mysql_04

前面说过框架对jar版本和配置文件的正确性敏感,所以要注意某些jar的版本跟程序环境是否匹配,比如mysql和mysql-connector-java.jar版本是否匹配。这里我们导入了mybatis、mysql-connector-java 以及测试用的junit。

<?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>person.cozar</groupId>
    <artifactId>firstMybatis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>



    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

</project>

4.创建数据库连接信息文件(db.properties) 

在src/main/resource目录下创建db.properties文件

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

5.创建mybatis的核心配置文件(mybatis-config.xml)

在src/main/resource目录下创建mybatis-config.xml文件(核心配置文件可随意命名,但不建议)

核心配置文件主要完成两大块内容:数据库连接环境的配置和映射文件的加载

<?xml version="1.0" encoding="UTF-8" ?><!--xml文件声明-->
<!--核心配置文件mybatis-config.xml的约束条件,格式固定-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

<!--    加载数据库连接信息配置文件-->
    <properties resource="db.properties" />
    <!--    环境搭建-->
    <environments default="development">
        <environment id="development">
<!--            transactionManager(事务管理器),类型JDBC-->
            <transactionManager type="JDBC" />
<!--            数据源,类型连接池-->
            <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>
<!--    加载映射文件,每个映射文件对应一个POJO实体类和一张表-->
    <mappers>
       
    </mappers>
</configuration>

6.创建POJO实体

在src/main/java中创建person.cozar.pojo(你的groupId.pojo,groupId)包,在pojo包中创建对应数据库中表的实体类

package person.cozar.pojo;

public class User {
    private int id;
    private String name;
    private int age;

    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 int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

7.创建mapper文件

在src/main/resources目录下创建mapper包,在mapper包中创建实体类映射文件UserMapper.xml

mapper文件完成了sql方法的封装(定义了方法名,参数类型,返回类型;sql语句),mybatis会根据mapper文件中定义的方法操作数据库,并自动完成java和数据库中数据类型的同步映射,而无需像使用jdbc那样,用大量的代码来进行java和数据库之间的参数匹配。这样一来,mybatis不但简化了jdbc的使用,也使得sql语句和java代码分离,当sql语句变动时我们仅需在mapper文件中对sql语句做简单维护即可,而不需要改动大量的java代码

(mapper文件和pojo类可以有多个:数据库中每个表都可以有对应的pojo类和mapper文件)

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--mapper为映射的根节点,namespace指定Dao接口的完整类名,mybatis会依据这个接口动态创建一个实现类去实现这个接口,而这个实现类是一个Mapper对象-->
<mapper namespace="person.cozar.pojo.User">
<!--    id:接口中的方法名(在多个select中区分方法,java代码通过id属性值找到对应的sql语句块),parameterType:传入的参数类型,resultType:返回实体类对象,使用包的全限定类名-->
    <select id="findById" parameterType="int" resultType="person.cozar.pojo.User">
        select * from firstmybatis.user where id = #{id}
    </select>
    <select id="findByName" parameterType="String" resultType="person.cozar.pojo.User">
        select * from firstmybatis.user where name =#{name}
    </select>
<!--    mapper标签中可包含用于CURD的insert、delete、update和select标签-->
</mapper>

8.将mapper加载到mybatis核心配置文件


将代码<mapper resource="mapper/UserMapper.xml"/>加入到核心配置文件mybatis-config.xml的mappers标签中


<?xml version="1.0" encoding="UTF-8" ?><!--xml文件声明-->
<!--核心配置文件mybatis-config.xml的约束条件,格式固定-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

<!--    加载数据库连接信息配置文件-->
    <properties resource="db.properties" />
    <!--    环境搭建-->
    <environments default="development">
        <environment id="development">
<!--            transactionManager(事务管理器),类型JDBC-->
            <transactionManager type="JDBC" />
<!--            数据源,类型连接池-->
            <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>
<!--    加载映射文件,每个映射文件对应一个POJO实体类和一张表-->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

9.编写junit测试类

在src/test/java目录下创建类UserTest

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 person.cozar.pojo.User;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;

public class UserTest {
    @Test
    public void userFindById() throws IOException {
        String resource = "mybatis-config.xml";
        //创建流
        Reader reader = null;
        reader = Resources.getResourceAsReader("mybatis-config.xml");//将mybatis-config。xml读取到reader对象中

        SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);//由SqlSession工厂构造器创建SqlSession工厂

        SqlSession session = sqlMapper.openSession();//由SqlSession工厂对象创建SqlSession会话对象,该对象中包含所有mapper中封装的执行sql语句的所有方法
        //由session对象中封装的方法selectOne执行mapper封装的sql语句,封装映射信息并返回结果映射
        User user1 = session.selectOne("findById",1);
        User user2 = session.selectOne("findByName","Celine");
        
        System.out.println(user1);
        System.out.println(user2);

        session.close();

    }
}

运行UserTest

 

mybatis 使用java function java的mybatis_java_05

 Mybatis的运行步骤(参考UserTest)

1.mybatis读取核心配置文件mybatis-config.xml

2.加载映射文件mapper

3.构建Sql会话工厂

4.创建Sql会话对象

5.用Sql会话对象包含的selectOne()等方法,通过各个mapper文件中定义的sql方法来操作数据库,并将结果直接映射到java的数据类型

总结:

mybatis是一个优秀的持久层框架,它对jdbc进行了一定程度的封装,是一种半自动化(自定义sql语句)的ORM(对象关系映射,Object Relational Mapping)实现。

mybatis在实体类和sql语句之间建立了映射关系,完成了java对象属性和关系数据库表字段之间数据类型的匹配,能让我们像操作java对象那样的方式来操纵数据库,为我们省略了jdbc中许多繁杂的传参代码,也解决了传参硬编码的问题。

通过mapper文件,mybatis完成了sql语句和java代码的分离,解决了sql语句硬编码的问题,当sql语句需要变动时,使得程序更易于维护,也加强了程序的灵活性。