Bootstrap

2022版MyBatis入门教程笔记

1. MyBatis简介

  1. MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
  2. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
  3. MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录

1.1 MyBatis历史

  1. 原是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了Google Code,随着开发团队转投Google Code
    旗下, iBatis3.x正式更名为MyBatis ,代码于2013年11月迁移到Github(下载地址见后)。https://github.com/mybatis/mybatis-3/
  2. iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)

1.2 MyBatis特性

MyBatis是支持定制化SQL,存储过程以及高级映射的优秀的持久层框架
MyBatis避免了几乎所有的JDBC代码和手动设置参数以及候去结果集
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录
MyBatis是一个半自动的ORM框架

1.3. VS其他持久层框架

  • JDBC:

    对于已经打包部署的项目,需要重新编辑代码再打包部署,非常麻烦。
    在这里插入图片描述

-Hibernate 和 JPA
在这里插入图片描述

  • MyBatis

    xml 中编写SQL语句

    在这里插入图片描述

2. 快速开始(简单介绍各个部分)

2.1 开发环境

  • IDE:IDEA: 2022.1。
  • 构建工具:maven 3.8.5
  • MySQL版本:MySQL8
  • MyBatis 版本:MyBatis 3.5.7

2.2 Maven

根据你自己项目的类型创建具体Maven项目即可 (参考 IDEA 2022.1 中 Maven 项目的创建)

<dependencies>
   
    <!-- mybatis 核心 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>

    <!-- junit 测试 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

    <!-- MySQL驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.10</version>
    </dependency>
</dependencies>

创建数据库SSM

t_user表:
在这里插入图片描述

创建实体类User

public class User {
   
    
    private Integer id;
    
    private String username;
    
    private String password;
    
    private Integer age;
    
    private String sex;
    
    private String email;

    public User() {
   
        
    }

    public User(Integer id, String username, String password, Integer age, String sex, String email) {
   
        this.id = id;
        this.username = username;
        this.password = password;
        this.age = age;
        this.sex = sex;
        this.email = email;
    }

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

    public Integer getId() {
   
        return id;
    }

    public void setId(Integer id) {
   
        this.id = id;
    }

    public String getUsername() {
   
        return username;
    }

    public void setUsername(String username) {
   
        this.username = username;
    }

    public String getPassword() {
   
        return password;
    }

    public void setPassword(String password) {
   
        this.password = password;
    }

    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 String getEmail() {
   
        return email;
    }

    public void setEmail(String email) {
   
        this.email = email;
    }
}

2.3 创建MyBatis的核心配置文件

习惯上命名:mybatis-config.xml,非强制。将来整合Spring的时候可以省略。将来整合Spring之后,这个配置文件可以省略,所以操作时可以直接复制

作用:1. 配置链接数据库的环境 2. 配置MyBatis

放置位置:src/main/resources

<?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>
    <!--别名-->
    <typeAliases>
        <package name="com.qq.mybatis.POJO"/>
    </typeAliases>

    <!--配置连接数据库的环境-->
    <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://localhost:3306/ssm?characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="数据库密码"/>
            </dataSource>
        </environment>
    </environments>

<!--引入mybatis的映射文件-->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>

</configuration>

2.4创建mapper接口

MyBatis中的mapper接口相当于以前的dao。但是区别在于mapper仅仅是接口,我们不需要提供实现类。

public interface UserMapper {
   
    
    //添加用户信息
    int insertUser();
    
}

2.5创建MyBatis的映射文件

相关概念:ORM对象关系

  • 对象:java的实体类对象
  • 关系:关系型数据库
  • 映射:二者之间的对应关系
Java概念 数据库概念
属性· 字段/列
对象 记录/行

1.映射文件的命名规则:
表所对应的实体类的类名+Mapper.xml
eg:表t_user,映射文件的实体类为User,所对应的映射文件为UserMapper.xml
因此一个映射文件对应一个实体类,对应一张表的操作
2.mapper接口和映射文件要保证两个保持一致:
(1)mapper接口的全类名和映射文件的namespace一致
(2)mapper接口中的方法的方法名要和映射文件中的sql的id保持一致

放置位置:src/main/resources/mapper目录下

<?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.qq.mybatis.Mapper.UserMapper">

    <!--int insertUser();-->
    <insert id="insertUser">
        insert into t_user values (NULL, 'admin', '123456', 23, '男', '[email protected]')
    </insert>

</mapper>

2.6测试功能

下方代码:从开始到创建 SqlSessionFactory 只用创建一次即可,因此可以单独封装即可。
openSession() 获得 SqlSession默认是不自动提交事务,因此需要自己手动提交。

@Test
    public void InsertTest(){
   
        try {
   
            //配置核心配置文件的输入流
            InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
            //获取SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
            //获取SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory=sqlSessionFactoryBuilder.build(is);
            //获取sql的会话对象SqlSession,是Mybatis提供的操作数据库的对象
            SqlSession sqlSession=sqlSessionFactory.openSession(true);
            //获取UserMapper的代理实现类
            UserMapper mapper=sqlSession.getMapper(UserMapper.class);
            int result=mapper.insertUser();
            System.out.println(result);
            // 关闭资源
            sqlSession.close();
        } catch (IOException e) {
   
            e.printStackTrace();
        }
    }

2.7加入log4j日志功能

1.加入依赖

<!--log4j日志-->
       <dependency>
           <groupId>log4j</groupId>
           <artifactId>log4j</artifactId>
           <version>1.2.17</version>
       </dependency>

2.加入log4j的配置文件

log4j的配置文件名为log4j.xml存放位置为src/main/resources目录下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5d %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n"/>
        </layout>
    </appender>

    <logger name="java.sql">
        <level value="debug"/>
    </logger>
    <logger name="org.apache.ibatis" >
        <level value="info"/>
    </logger>

    <!-- 默认配置,级别为debug 且根据name为log.console和 log.file两个appender输出-->
    <root>
        <level value="debug"/>
        <appender-ref ref="STDOUT"/>
    </root>
</log4j:configuration>

FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试)
从左到右打印的内容越来越详细

2.8测试修改和删除用户的功能

1.创建utils文件下SqlSessionUtil.java

public class SqlSessionUtil {
   

    public  static SqlSession getSqlSession(){
   
        SqlSession sqlSession=null;
        try {
   
            //配置核心配置文件的输入流
            InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
            //获取SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
            //获取SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory=sqlSessionFactoryBuilder.build(is);
            //获取sql的会话对象SqlSession,是Mybatis提供的操作数据库的对象
            sqlSession=sqlSessionFactory.openSession(true);
        } catch (IOException e) {
   
            e.printStackTrace();
        }
        return sqlSession;
    }
}

(1)修改用户信息

Mapper/UserMapper接口:

//修改用户信息
    void updateUser();

Usermapper.xml

<!--void updateUser();-->
    <update id="updateUser">
        update t_user set username='root',password='1238' where id=3
    </update>

测试类:

//根据id修改用户信息
    @Test
    public void UpdateTest(){
   
        SqlSession sqlSession=SqlSessionUtil.getSqlSession();
        UserMapper mapper=sqlSession.getMapper(UserMapper.class);
        mapper.updateUser();
        sqlSession.close();
    }

(2)删除用户信息

Mapper/UserMapper接口:

//根据id删除用户信息
    int deleteUser();

UserMapper.xml

 <!--int deleteUser();-->
    <delete id="deleteUser">
        delete from t_user where id=2
    </delete>

测试类:

 //根据id删除用户信息
    @Test
    public void DeleteTest(){
   
        SqlSession sqlSession=SqlSessionUtil.getSqlSession();
        UserMapper mapper=sqlSession.getMapper(UserMapper.class);
        int result=mapper.deleteUser();
        System.out.println("result:"+result);
        sqlSession.close();
    }

4.9测试查询功能

(1)根据id查询用户信息
mapper/UserMapper接口:

//根据id查询用户信息
    User getUserById(@Param("id")Integer id);

UserMapper.xml

<!--User getUserById(@Param("id")Integer id);-->
    <!--
        resultMap:自定义映射,处理多对一或一对多的映射关系
        resultType:设置结果映射,即查询的数据要转换为java类型
    -->
    <select id="getUserById" resultType="User">
        select * from t_user where id=#{
   id}
    </select>

测试类:

//根据id查询用户信息
    @Test
    public void SelectTest(){
   
        SqlSession sqlSession=SqlSessionUtil.getSqlSession();
        UserMapper mapper=sqlSession.getMapper(UserMapper.class);
        User user=mapper.getUserById(3);
        System.out.println(user);
    }

(2)查询所有用户
mapper/UserMapper接口:

//查询所有用户信息
    List<User> getAllUser();

mapper/UserMapper.xml

    <!--List<User> getAllUser();-->
    <select id="getAllUser" resultType="User">
        select * from t_user
    </select>

测试类:

//查询所用用户信息
    @Test
    public void SelectAllUserTest(){
   
        SqlSession sqlSession=SqlSessionUtil.getSqlSession();
        UserMapper mapper=sqlSession.getMapper(UserMapper.class);
        List<User>list =mapper.getAllUser();
        System.out.println(list);
    }

3.核心配置文件详解

核心配置文件中的标签必须按照固定的顺序:
properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseldProvider?,mappers?

3.1核心配置文件之environments

可以配置多个环境,使用id区分,不能重复

<?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>

    <!--别名-->
    <typeAliases>
        <package name="com.qq.mybatis.POJO" />
    </typeAliases>

    <!--配置连接数据库的环境
        属性:
        default:设置默认使用环境的id
    -->
    <environments default="development">
        <!--
            environment:设置一个具体的连接数据库的环境
                属性:
                id:设置环境的唯一标识,不能重复
        -->
        <environment id="development">
            <!--
                transactionManager:设置事务管理器
                属性:
                type:设置事务管理的方式
                type:"JDBC|MANAGED"
                    JDBC:表示使用JDBC中原生的事务管理方式
                    MANAGED:被管理,例如:spring
            -->
            <transactionManager type="JDBC"/>
            <!--
                dataSource:设置数据源
                属性:
                    type:设置数据源的类型
                    type="POOLED|UNPOOLED|JNDI"
                        POOLED:表示使用数据连接池
                        UNPOOLED:表示不使用数据库连接池
                        JNDI:表示使用上下文中的数据源
            -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://localhost:3306/ssm?characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>

        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://localhost:3306/ssm?characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>

    </environments>

    <!--引入mybatis的映射文件-->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>

</configuration>

3.2核心配置文件之properties

创建位置src/main/resources/jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8
jdbc.username=root
jdbc.password=数据库密码

使用引入文件jdbc.properties

<?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>

   <!--引入jdbc.properties,此后就可以再当前文件中使用${
   key}的方式访问value-->
    <properties resource="jdbc.properties"/>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.user}"/>
                <property name="password" value="${jdbc.password}"</
;