跳转至

MyBatis

https://github.com/mybatis/mybatis-3/tree/master?tab=readme-ov-file

mybaits中文网址:https://mybatis.org/mybatis-3/zh_CN/index.html

等效于对之前学习JDBC的MyBatis框架。

MyBatis是持久层框架

持久层是分层开发中专门负责访问数据源的一层。

把访问数据源的代码和业务逻辑代码分离开,有利于后期维护和团队分工开发。同时也增加了数据访问代码的复用性。

MyBatis是ORM框架

ORM(Object Relation Mapping),中文名称:对象关系映射。是一种解决数据库发展和面向对象编程语言发展不匹配问题而出现的技术。

image-20230420215343107

搭建MyBatis框架

1、创建数据库表

直接在MySQL中,创建表和数据。

2、创建Maven项目

通过Maven导入对应框架。

3、pom.xml文件中添加依赖

<?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>com.hh</groupId>
    <artifactId>TestMyBatis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--MySQL依赖,mybatis链接数据库需要mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
        <!--Mybatis依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
    </dependencies>

</project>

4、实体类

Mybatis查询到的数据要封装成对象,对象要依托于类。

5、Mapper数据库连接层

Mapper数据库连接层

6、创建MyBatis全局配置文件

6.1、配置数据库属性文件

项目|模块|src|main|resources中创建db.properties文件,后缀名必须是.properties

里面放数据库的配置信息。

数据库的参数和核心配置文件解耦。改数据库的参数在db.properties里面改。

url=jdbc:mysql://localhost:3306/msb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
driver=com.mysql.cj.jdbc.Driver
username=数据库名字
password=数据库密码

6.2、在项目|模块|src|main|resources中创建mybatis.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!--标签约束,xml的标签不能随便写,一旦随便写,代码会出错-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--    加载数据库配置文件-->
    <properties resource="db.properties"></properties>
    <!--    别名设置-->
    <typeAliases>
        <typeAlias type="com.hh.pojo.Book" alias="b"></typeAlias>
        <package name="com.hh.pojo"/>
    </typeAliases>

    <!--数据库配置信息-->
    <environments default="mysql">
        <!--链接MySQL数据库的数据源配置-->
        <environment id="mysql">
            <!--配置mybatis中的事务管理-->
            <transactionManager type="JDBC"></transactionManager>
            <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="com/hh/mapper/BookMapper.xml"></mapper>
    </mappers>

</configuration>

别名设置

MyBatis提供了别名机制可以给某个类某个包下所有类起别名,简化resultType取值的写法。

在核心配置文件mybatis.xml中,通过<typeAlias>标签明确设置类型的别名。

  • type:类型全限定路径
  • alias:别名名称

1、具体的类起别名

<typeAliases>  
    <typeAlias type="com.hh.pojo.Book" alias="b"></typeAlias>
</typeAliases>

2、指定的包起别名

当类个数较多时,明确指定别名工作量较大,可以通过<package>标签指定包下全部类的别名。指定后所有类的别名就是类名。(也不区分大小写)

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

PS:明确指定别名和指定包的方式可以同时存在。

内置别名

MyBatis框架中内置了一些常见类型的别名。这些别名不需要配置

别名 映射的类型 别名 映射的类型 别名 映射的类型
_byte byte string String date Date
_long long byte Byte decimal BigDecimal
_short short long Long bigdecimal BigDecimal
_int int short Short object Object
_Integer int int Integer map Map
_double double integer Integer hashmap HashMap
_float float double Double list List
_boolean boolean float Float arraylist ArrayList
boolean Boolean collection Collection
iterator Iterator

7、测试类,启动项目

package com.hh.test;

import com.hh.mapper.BookMapper;
import com.hh.pojo.Book;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class test {
    public static void main(String[] args) throws IOException {
        //指定核心配置文件的路径:从resources下开始加载,mybatis.xml在resources根目录下,所以直接写mybatis.xml。
        String resource = "mybatis.xml";
        //获取加载配置文件的输入流:
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //加载配置文件,创建工厂类
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂类获取一个会话:
        SqlSession sqlSession = sqlSessionFactory.openSession();


            /// 1、不使用接口类的情况:
        //执行查询:
        List list0 = sqlSession.selectList("com.hh.mapper.BookMapper.selectAllBooks");
        /// 2、使用接口类的情况:
        //动态代理模式:通过接口找到接口对应的实现类 BookMapper mapper = BookMapper实现类BookMapper.xml
        BookMapper mapper = sqlSession.getMapper(BookMapper.class);
        List list = mapper.selectAllBooks();
        //遍历:
        for (int i = 0; i <= list.size() - 1; i++) {
            Book b = (Book) list.get(i);
            System.out.println(b.getName() + "---" + b.getAuthor());
        }

        Book book = mapper.selectOneBook("java", "jj");
        System.out.println(book.getName());

        //参数传一个对象
        Book b = new Book();
        b.setName("java");
        b.setAuthor("jj");
        Book book1 = mapper.selectOneBook2(b);
        System.out.println(book1.getAuthor());

        Book book2 = mapper.selectOneBook3("java", b);
        System.out.println(book2.getAuthor());

        //插入数据
        Book book3 = new Book();
        book3.setId(3);
        book3.setName("flutter");
        book3.setAuthor("msb");
        book3.setPrice(89);
        int n = mapper.insertBook(book3);
        if (n > 0) {
            System.out.println("插入成功");
        }
        //事务相关操作
        sqlSession.commit();
        //关闭资源:
        sqlSession.close();
    }
}

参数传递

使用接口绑定方案之前:

  • 一个参数:直接传递
  • 多个参数:封装为对象、集合

使用接口绑定方法之后:

可以直接调用方法传递参数即可。

在BookMapper接口文件中定义接口,在BookMapper.xml映射文件中写参数的名字和接口中的要对应。

获取数据方式-使用内置名称进行调用

使用符号: #{}进行获取

{}中名字使用规则:

  • arg0、arg1、argM(M为从0开始的数字,和方法参数顺序对应)
  • param1、param2、paramN(N为从1开始的数字,和方法参数顺序对应)。

一个参数且参数为对象,获取参数如何处理呢?

使用符号: #{}进行获取

直接利用属性名即可

多个参数且参数有对象,获取参数如何处理呢?

使用符号: #{}进行获取

  • argM.属性名
  • paramN.属性名

PS:argM.或者paramN.不可以省略不写

先接口、再映射文件。