Mybatis详细教程

1.mybatis概述

2.mybatis快速入门

1.需求:查询User表中所有数据

2.步骤:

​ (1)创建user表,添加数据

​ (2)创建模块,导入坐标

​ (3)编写mybatis核心配置文件----->替换连接信息,解决编码问题

​ (4)编写sql映射文件---->统一管理sql语句,解决硬编码问题

​ (5)编码

​ ①定义POJO类

​ ②加载核心配置文件,获取sqlsessionfactory对象

​ ③获取sqlsession对象,执行sql语句

​ ④释放资源

2.1创建maven工程

2.1.1打包方式:jar

2.1.2引入依赖

  <dependencies>
		<!--mybatis核心配置文件-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.7</version>
    </dependency>
		<!--mysql驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.3</version>
    </dependency>

		<!--测试类-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
     </dependency>  
  </dependencies>

2.2创建mybatis的核心配置文件

​ 习惯命名为mybatis-config.xml,这个命名仅仅是建议,将来整合spring之后,这个配置文件可以省略,所以大家操作时可以直接复制,粘贴。

​ 核心配置文件主要用于配置连接数据库的环境及Mybatis的全局配置。

核心配置文件放在src/main/resource目录下

<configuration>

<!--    1.设置数据库文件-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>


    </environments>
    <!--        2.引入映射文件-->
    <mappers>
        <mapper resource="mappers/UserMapper.xml" />
    </mappers>
</configuration>

2.3创建mapper接口

mybatis中的mapper接口相当于一档的到,但是区别在于mapper仅仅是接口,不需要提供实现类

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

2.4创建mybatis的映射文件

2.4.1相关概念

ORM(Object Relationship Mapping)对象映射。

对象:代表Java的实体类对象

关系:关系型数据库

映射:二者之间的关系

JAVA概念数据库概念
属性字段/列
对象记录/行

1.映射文件的命名规则

表所对应的实体类名+Mapper.xml

例如:t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml,因此一个映射文件对应一个实体类,对应一张表的操作,Mybatis映射文件用户编写sql,访问以及操作表中的数据。

2.mybatis中可以面向接口操作数据库,要保证两个一致

①mapper接口的全类名和映射文件的命名空间(namespace)保持一致

②mapper接口中方法的方法名和映射文件中便携的Sql的标签id数学保持一致。

<?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>
    <insert id="insertUser" >
        insert into t_user values (null,'xiaoming','123',23,'woman');
    </insert>
</mapper>

2.5测试

3.mybatis核心配置文件

3.1初识核心配置文件

<?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.gs.pojo"/>
    </typeAliases>

    <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}"/>
            </dataSource>
        </environment>

    </environments>

    <mappers>
       <!-- <mapper resource="com/com.com.gs/dao/UserMapper.xml"/>-->
        <!--<mapper class="com.com.com.gs.dao.UserMapper"/>-->
        <package name="com.gs.dao"/>
    </mappers>

</configuration>

1.我们可以从例子中发现configuration的标签中是enviroments,我们不妨推断Mybatis可以配置多套环境。注意点:尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境。

2.接着观察transactionManager标签,这是配置我们的事务处理器,Mybatis默认使用的是JDBC,而dataSource表示我们使用的数据源,默认类型为 POOLED

3.2细究各个配置

3.2.1属性(properties)

作用:我们可以通过properties属性来实现音容配置文件,这些属性可以在外部进行设置,并可以进行动态替换,也就是说我们进行properties有两种方式,一种是外部引入,另一种是嵌套使用,更推荐使用外部数据源引入

(1)方式一:嵌套使用

<environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
</environments>

(2)方式二:引入外部数据源

①在resource目录下编写一个配置文件db.properties

db.driver = com.mysql.jdbc.Driver
db.url= jdbc:mysql://localhost:3306/mybatis
db.username = root
db.password =123456

②在mybatis-config.xml配置文件中引入数据源

<!--    properties属性来实现引用配置文件-->
<properties resource="db.properties"/>
<!--    设置数据库文件-->
<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${db.driver}"/>
                <property name="url" value="${db.url}"/>
                <property name="username" value="${db.username}"/>
                <property name="password" value="${db.password}"/>
        </dataSource>
    </environment>
</environments>

3.2.2类型别名(typeAliases)

若我们没有配置该属性,编写xml文件的实体类时要使用全类名

例如: resultType=“com.tz.bean.User”>

<select id="getUserList" resultType="com.tz.bean.User">
     select * from t_user;
</select>

为了简化上面的写法,我们可以在核心配置文件中进行别名的是设置,

(1)方式1:直接在mybatis-config.xml中进行相关实体类的全类名胚子

<!--可以给实体类起别名-->
<typeAliases>
    <typeAlias type="com.tz.bean.User" alias="User"/>
</typeAliases>

在相应的Mapper.xml文件中引用

    <select id="getUserList" resultType="User">
        select * from t_user;
    </select>

(2)方式2:我们也可以只指定一个包名,MyBatis会在包名下面搜索需要的JavaBen(扫描是实体类的包中,这个类的别名,引用时推荐使用首字母小写,不过没有强制要求)

<!--    给实体类起别名-->
    <typeAliases>
        <package name="com.tz.bean"/>
    </typeAliases>

在相应的Mapper.xml文件中引用

<!--  resultType="user"  -->
    <select id="getUserList" resultType="user">
        select * from t_user;
    </select>

使用场景:

​ 1.在实体类比较少时,建议使用第一种

​ 2.如果实体类比较多,建议使用第二种

​ 3.第一种可以DIY别名,第二种则不行; 如果非要修改,需要在实体类上增加注解

@Alias("user")
public class User {}

3.2.3设置(settings)

这是Mybatis中极为重要的调整设置,它们会改变Mybatis的运行时行为,官方中的配置项解释的十分清楚,可以进行相关查阅:https://mybatis.net.cn/configuration.html#environments

image-20220828155406714

这里介绍两种开发中经常使用的设置

(1)驼峰命名(mapUnderscoreToCamelCase),用来解决我们实体类中属性名与数据库中的列名不一致问题

例如:数据库名字为user_id,实体类名字为userId,这时候我们需要配置该项,否则取不到值

(2)配置日志工厂logImpl,这里方便我们查看输出日志排查错误,可以理解成我们平常使用的System.out;

下面使用的值为STDOUT_LOGGING则为我们标准的日志输出,比较常用的还有Log4j;

<setting name="logImpl" value="STDOUT_LOGGING"/>

3.2.4映射器(mappers)

image-20220828160224568

(1)使用类路径的资源引用(在mybatis-config.xml核心配置文件中配置)(推荐)

<mappers>
    <mapper resource="com/tz/dao/UserMapper.xml"/>
</mappers>

这种方式对类名和Mapper.xml文件的位置没有任何限制

(2)使用class文件绑定注册(在mybatis-config.xml核心配置文件中配置)

<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="com.tz.dao.UserMapper"/>
</mappers>

注意:

​ ①接口和他的Mapper配置文件必须同名

​ ②接口和他的Mapper配置文件必须在同一个包下

(3)使用扫描包进行注入绑定(在mybatis-config.xml核心配置文件中配置)

<mappers>
    <package name="com.tz.dao"/>
</mappers>

注意:

​ ①接口和他的Mapper配置文件必须同名

​ ②接口和他的Mapper配置文件必须在同一个包下

这三种方式各有各的优势,使用上也没有所谓的优劣之分,只不过第一种对我们配置文件的命名和它所放的位置没有特殊限定,相对比较灵活。

3.2.5生命周期和作用域

不同作用域和生命周期类别是至关重要,因此错误的使用会导致非常严重的并发问题,下面以一张图简单描述一下我们mybatis开发的流程

image-20220828161347040

记住这里的每一个mapper就对应我们编写的一个具体接口,即我们具体业务

这里我们创建Mybatis相关对象的工具类

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;

public class MybatisUtil {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            String resource = "mybatis-config";
            InputStream resourceAsStream = Resources.getResourceAsStream(resource);
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession(true);
    }
}

解析:

①SqlSessionFactoryBuilder:

一旦创建了SqlSessionFactory,就不再需要Builder这个对象了,所以我们可以把它设置为局部变量或使用静态代码块(也就是我们只需实例化出一个SqlSessionFactoryBuilder:对象)
如上面所写的

private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream resourceAsStream = Resources.getResourceAsStream(resource);
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

②SqlSessionFactory

可以通俗理解为我们的数据库连接池

SqlSessionFactory一旦创建就应该在运行期间一直存在,没有任何理由丢弃它或者重新创建另一个实例

SqlSessionFactory的最佳作用域是应用层上的,这种实现可以通过使用单例或静态单例模式

③SqlSession

相当于连接池的一个请求

SqlSession的实例不是线程安全的,因此不能被共享,所以最佳作用与是请求或方法作用域

用完知乎需要关闭,否则资源会被占用

4.mybatis增删改查

后续更新

5.动态sql

qlSessionFactoryBuilder.build(resourceAsStream);

    } catch (IOException e) {
        e.printStackTrace();
    }
}

②SqlSessionFactory

>  可以通俗理解为我们的数据库连接池
>
>  SqlSessionFactory一旦创建就应该在运行期间一直存在,没有任何理由丢弃它或者重新创建另一个实例
>
>  SqlSessionFactory的最佳作用域是应用层上的,这种实现可以通过使用单例或静态单例模式

③SqlSession

>  相当于连接池的一个请求
>
>  SqlSession的实例不是线程安全的,因此不能被共享,所以最佳作用与是请求或方法作用域
>
>  用完知乎需要关闭,否则资源会被占用



# 4.mybatis增删改查

后续更新

# 5.动态sql

后续更新
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值