前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >4. MyBatis核心配置文件详解

4. MyBatis核心配置文件详解

作者头像
捞月亮的小北
发布2024-06-22 09:00:19
600
发布2024-06-22 09:00:19
举报
文章被收录于专栏:捞月亮的小北捞月亮的小北

我出门的时候必遭杀害 ,因为门外有狮子

对mybatis-config.xml文件进行剖析

代码语言:javascript
复制
<?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/north_mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--sql映射文件创建好之后,需要将该文件路径配置到这里-->
        <!--这里存放的是执行XxxMapper.xml文件的路径-->
        <!--resource 属性自动会从类的根路径下开始查找资源-->
        <mapper resource="CarMapper.xml"/>
    </mappers>
</configuration>

1. configuration 详解

configuration:根标签,表示配置信息。

2. environment 详解

environments 讲解 environments:环境(多个),以“s”结尾表示复数,也就是说mybatis的环境可以配置多个数据源。 default属性:表示默认使用的是哪个环境,default后面填写的是environment的id。default的值只需要和environment的id值一致即可。

environment 讲解 environment:具体的环境配置(主要包括:事务管理器的配置 + 数据源的配置) id:给当前环境一个唯一标识,该标识用在environments的default后面,用来指定默认环境的选择。 一个环境environment会对应一个SqlSessionFactory对象 一般一个数据库会对应一个SqlSessionFactory对象。

代码演示:

mybatis-config.xml

代码语言:javascript
复制
<?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="dev">-->
    <!--默认使用生产环境-->
    <environments default="production">
        <!--开发环境-->
        <environment id="dev">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
        <!--生产环境-->
        <environment id="production">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="CarMapper.xml"/>
    </mappers>
</configuration>

CarMapper.xml

代码语言:javascript
复制
<?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="car">
    <insert id="insertCar">
        insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
    </insert>
</mapper>

测试类:

代码语言:javascript
复制
public class ConfigurationTest {
    @Test
    public void testEnvironment() throws Exception{
        // 准备数据
        Car car = new Car();
        car.setCarNum("133");
        car.setBrand("丰田霸道");
        car.setGuidePrice(50.3);
        car.setProduceTime("2020-01-10");
        car.setCarType("燃油车");

        // 一个数据库对应一个SqlSessionFactory对象
        // 两个数据库对应两个SqlSessionFactory对象,以此类推
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

        // 使用默认数据库
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        int count = sqlSession.insert("insertCar", car);
        System.out.println("插入了几条记录:" + count);

        // 使用指定数据库
        SqlSessionFactory sqlSessionFactory1 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "dev");
        SqlSession sqlSession1 = sqlSessionFactory1.openSession(true);
        int count1 = sqlSession1.insert("insertCar", car);
        System.out.println("插入了几条记录:" + count1);
    }
}

3. transactionManager 详解

相关的笔记:2. Mybatis 的事务管理机制深度剖析

transactionManager:配置事务管理器 type属性:指定事务管理器具体使用什么方式,可选值包括两个

  • JDBC:使用JDBC原生的事务管理机制。底层原理:事务开启conn.setAutoCommit(false); ...处理业务...事务提交conn.commit();
  • MANAGED:交给其它容器来管理事务,比如WebLogic、JBOSS等。如果没有管理事务的容器,则没有事务。没有事务的含义:只要执行一条DML语句,则提交一次。

transactionManager标签:详解

  1. 作用:配置事务管理器。指定mybatis具体使用什么方式去管理事务。
  2. type属性有两个值:
    1. 第一个:JDBC: 使用原生的JDBC代码来管理事务。 conn.setAutoCommit(false); .... conn.commit();
    2. 第二个:MANAGED:mybatis不再负责事务的管理,将事务管理交给其它的JEE(JavaEE)容器来管理。例如:spring ‍
  3. 大小写无所谓。不缺分大小写。但是不能写其他值。只能是二选一:jdbc、managed
  4. 在mybatis中提供了一个事务管理器接口:Transaction
    1. 该接口下有两个实现类: JdbcTransaction ManagedTransaction 如果type="JDBC",那么底层会实例化JdbcTransaction对象。 如果type="MANAGED",那么底层会实例化ManagedTransaction

4. dataSource 详解

dataSource配置:

  1. dataSource被称为数据源。
  2. dataSource作用是什么?为程序提供Connection对象。(但凡是给程序提供Connection对象的,都叫做数据源。)
  3. 数据源实际上是一套规范。JDK中有这套规范:javax.sql.DataSource(这个数据源的规范,这套接口实际上是JDK规定的。)
  4. 我们自己也可以编写数据源组件,只要实现javax.sql.DataSource接口就行了。实现接口当中所有的方法。这样就有了自己的数据源。比如你可以写一个属于自己的数据库连接池(数据库连接池是提供连接对象的,所以数据库连接池就是一个数据源)。
  5. 常见的数据源组件有哪些呢【常见的数据库连接池有哪些呢】? 阿里巴巴的德鲁伊连接池:druid , c3p0 , dbcp 等
  6. type属性用来指定数据源的类型,就是指定具体使用什么方式来获取Connection对象:
    1. type属性有三个值:必须是三选一。
    2. type="[UNPOOLED|POOLED|JNDI]"
    3. UNPOOLED:不使用数据库连接池技术。每一次请求过来之后,都是创建新的Connection对象。
    4. POOLED:使用mybatis自己实现的数据库连接池。
    5. JNDI:集成其它第三方的数据库连接池。
  7. JNDI是一套规范。谁实现了这套规范呢?大部分的web容器都实现了JNDI规范:
    • 例如:Tomcat、Jetty、WebLogic、WebSphere,这些服务器(容器)都实现了JNDI规范。
  8. JNDI是:java命名目录接口。Tomcat服务器实现了这个规范。

代码展示:别只认识那几个常用的 ,来玩点不一样的 ,提升自己的见识

代码语言:javascript
复制
          <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
                <!--提醒:正常使用连接池的话,池中有很多参数是需要设置的。设置好参数,可以让连接池发挥的更好。事半功倍的效果。-->
                <!--具体连接池当中的参数如何配置呢?需要反复的根据当前业务情况进行测试。-->
                <!--poolMaximumActiveConnections:连接池当中最多的正在使用的连接对象的数量上限。最多有多少个连接可以活动。默认值10-->
                <property name="poolMaximumActiveConnections" value="10"/>
                <!--每隔2秒打印日志,并且尝试获取连接对象-->
                <property name="poolTimeToWait" value="2000"/>
                <!--强行让某个连接空闲,超时时间的设置-->
                <property name="poolMaximumCheckoutTime" value="10000"/>
                <!--最多的空闲数量-->
                <property name="poolMaximumIdleConnections" value="5"/>
            </dataSource>

5. properties 详解

properties 的第一种配置方案: 在xml里面进行配置

代码语言:javascript
复制
    <properties>
    <!--这是其中的一个属性-->
    <!--<property name="属性名" value="属性值"/>-->
    <property name="jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
    <property name="jdbc.url" value="jdbc:mysql://localhost:3306/powernode"/>
    <property name="jdbc.username" value="root"/>
    <property name="jdbc.password" value="root"/>
    </properties>

properties 的第二种配置方案:引入properties配置文件

代码语言:javascript
复制
   <!--resource,一定是从类路径下开始查找资源-->
    <properties resource="jdbc.properties" />

    <!--从绝对路径当中加载资源。绝对路径怎么写?file:///路径-->
    <properties url="file:///d:/jdbc.properties" />

6. mapper 详解

mapper标签的简单使用 mapper标签用来指定SQL映射文件的路径,包含多种指定方式,这里先主要看其中两种:

  • 第一种:resource,从类的根路径下开始加载【比url常用】
  • 第二种:url,从指定的url位置加载

第一种方式的代码演示:

mybatis-config.xml文件

代码语言:javascript
复制
<mappers>
  <mapper resource="CarMapper.xml"/>
</mappers>

如果是这样写的话,必须保证类的根下有CarMapper.xml文件。

如果类的根路径下有一个包叫做test,CarMapper.xml如果放在test包下的话,这个配置应该是这样写:

代码语言:javascript
复制
<mappers>
  <mapper resource="test/CarMapper.xml"/>
</mappers>

第二种方式的代码演示:(不过我个人感觉不用这样写 ,因为这样写的方式会有点麻烦)

假设CarMapper.xml文件放在d盘的根下,这个配置就需要这样写:

代码语言:javascript
复制
<mappers>
  <mapper url="file:///d:/CarMapper.xml"/>
</mappers>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. configuration 详解
  • 2. environment 详解
  • 3. transactionManager 详解
  • 4. dataSource 详解
  • 5. properties 详解
  • 6. mapper 详解
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档