飞道的博客

【MyBatis】| MyBatis核⼼配置⽂件详解

301人阅读  评论(0)

目录

一:MyBatis核⼼配置⽂件详解

1. Mybatis核心配置文件之多环境

2. Mybatis事务管理器

3. 对数据源的深度剖析

4. properties和mapper标签的配置和使用


一:MyBatis核⼼配置⽂件详解

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

(2)environments:以“s”结尾表示复数,也就是说mybatis的环境可以配置多个数据源。

default属性:后面跟着default属性,表示默认使⽤的是哪个环境,default后⾯填写的是environment的id,default的值只需要和environment的id值⼀致即可。

(3)environment:具体的环境配置(主要包括:事务管理器的配置 + 数据源的配置)。

id属性:给当前环境一个唯⼀标识,该标识⽤在environments的default后⾯,⽤来指定默认环境的 选择。

(4)transactionManager:配置事务管理器

type属性:指定事务管理器具体使⽤什么⽅式,可选值包括两个

(5)dataSource:指定数据源

type属性:⽤来指定具体使⽤的数据库连接池的策略,可选值包括三个 

(6)mappers:在mappers标签中可以配置多个sql映射⽂件的路径。

(7)mapper:配置某个sql映射⽂件的路径:

resource属性:使⽤相对于类路径的资源引⽤⽅式 。

url属性:使⽤完全限定资源定位符(URL)⽅式 。


  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <environments default="development">
  7. <environment id="development">
  8. <transactionManager type="JDBC"/>
  9. <dataSource type="POOLED">
  10. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  11. <property name="url" value="jdbc:mysql://localhost:3306/po
  12. wernode"/>
  13. <property name="username" value="root"/>
  14. <property name="password" value="root"/>
  15. </dataSource>
  16. </environment>
  17. </environments>
  18. <mappers>
  19. <mapper resource="CarMapper.xml"/>
  20. </mappers>
  21. </configuration>

1. Mybatis核心配置文件之多环境

environments标签

(1)environments标签表示可以有多个环境,一个环境environment对应一个数据库,一个数据库就对应着一个SqlSessionFactory对象!

(2)一个环境environment对应着一个唯一标识的id,多个环境environments对应的default属性可输入environment对应的id,用来指定默认使用的数据库对象


  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- 默认获取的是mybatis数据库-->
  7. <environments default="mybatisDB">
  8. <!--连接的是mybatis数据库-->
  9. <environment id="mybatisDB">
  10. <transactionManager type="JDBC"/>
  11. <dataSource type="POOLED">
  12. <property name="driver" value="com.mysql.jdbc.Driver"/>
  13. <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
  14. <property name="username" value="root"/>
  15. <property name="password" value="123"/>
  16. </dataSource>
  17. </environment>
  18. <!--连接的是bjpowernode数据库-->
  19. <environment id="bjpowernodeDB">
  20. <transactionManager type="JDBC"/>
  21. <dataSource type="POOLED">
  22. <property name="driver" value="com.mysql.jdbc.Driver"/>
  23. <property name="url" value="jdbc:mysql://localhost:3306/bjpowernode"/>
  24. <property name="username" value="root"/>
  25. <property name="password" value="123"/>
  26. </dataSource>
  27. </environment>
  28. </environments>
  29. <mappers>
  30. <!--关联CarMapper.xml配置文件-->
  31. <mapper resource="CarMapper.xml"/>
  32. </mappers>
  33. </configuration>

(3)编写sql语句


  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="car">
  6. <insert id="insertCar">
  7. insert into t_car values(null,'8888','特斯拉',30.0,'2000-11-11','燃油车')
  8. </insert>
  9. </mapper>

(4)编写测试程序


  
  1. package com.bjpowernode.mybatis.test;
  2. import org.apache.ibatis.io.Resources;
  3. import org.apache.ibatis.session.SqlSession;
  4. import org.apache.ibatis.session.SqlSessionFactory;
  5. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  6. import org.junit.Test;
  7. /**
  8. * @Author:朗朗乾坤
  9. * @Package:com.bjpowernode.mybatis.test
  10. * @Project:mybatis
  11. * @name:ConfigurationTest
  12. * @Date:2022/12/30 20:15
  13. */
  14. public class ConfigurationTest {
  15. @Test
  16. public void testEnvironment () throws Exception{
  17. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  18. // 使用默认的
  19. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream( "mybatis-config.xml"));
  20. // 自己指定连接数据库的对象
  21. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream( "mybatis-config.xml"), "bjpowernodeDB");
  22. SqlSession sqlSession = sqlSessionFactory.openSession();
  23. // 执行sql
  24. int count = sqlSession.insert( "car.insertCar");
  25. System.out.println(count);
  26. sqlSession.commit();
  27. sqlSession.close();
  28. }
  29. }

2. Mybatis事务管理器

transactionManager标签
(1)作用:配置事务管理器。指定mybatis具体使用什么方式去管理事务。
(2)type属性有两个值:

①JDBC:使⽤JDBC原⽣的事务管理机制。

底层原理:事务开启 conn.setAutoCommit(false); ...处理业务...事务提交conn.commit();

②MANAGED:mybatis不再负责事务的管理,交给其它容器来管理事务,⽐如:Spring等。如果没有管理事务的容器,则没有事务。没有事务的含义是只要执⾏⼀条DML语句,则提交⼀次。
(3)不缺分大小写,但是不能写其他值。只能是二选一: jdbc、managed
(4)在mybatis中提供了一个事务管理器接口:Transaction该接口下有两个实现类:
①如果type="JDBC",那么底层会实例化JdbcTransaction对象。
②如果type="MANAGED",那么底层会实例化ManagedTransaction对象。        

 <transactionManager type="JDBC"/>

3. 对数据源的深度剖析

dataSource标签

(1)dataSource被称为数据源,作用是为程序提供连接对象;凡是给程序提供Connection对象的都叫做数据源。

(2)数据源实际上是一套规范。JDK中有这套规范:javax.sql.DataSource;我们自己也可以编写数据源组件,只要实现javax.sql.DataSource接口就行了。实现接口当中所有的方法。这样就有了自己的数据源,比如:可以写一个属于自己的数据库连接池(数据库连接池是提供连接对象的,所以数据库连接池就是一个数据源)。

(3)常见的数据源组件有哪些呢【常见的数据库连接池有哪些呢】?

 阿里巴巴的德鲁伊连接池:druid、c3p0、dbcp ....

(4)type属性用来指定数据源的类型,就是指定具体使用什么方式来获取Connection对象,type属性有三个值:type="[UNPOOLED|POOLED|JNDI]"
①UNPOOLED:不使用数据库连接池,每一次请求过来后,都是创建新的Connection对象
②POOLED:使用mybatis自己实现的数据库连接池。
③JNDI:集成其它第三方的数据库连接池。

(5)JNDI是:java命名目录接口,是一套规范。大部分的web容器都实现了JNDI规范;例如:Tomcat、Jetty、WebLogic、WebSphere,这些服务器(容器)都实现了JNDI规范。
 (6)连接池的优点:每一次获取连接都是从连接池中拿,所以每次连接对象的创建数量都是可控的。

①UNPOOLED:采⽤传统的获取连接的⽅式,虽然也实现Javax.sql.DataSource接⼝,但是 并没有使⽤池的思想。 property可以是:

😊driver:JDBC 驱动的 Java 类全限定名。

😊url:数据库的 JDBC URL 地址。

😊username:登录数据库的⽤户名。

😊password:登录数据库的密码。

😊defaultTransactionIsolationLevel:默认的连接事务隔离级别。

😊defaultNetworkTimeout:等待数据库操作完成的默认⽹络超时时间(单位:毫秒)

②POOLED:采⽤传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实 现。property可以是(除了包含UNPOOLED中之外):

😊poolMaximumActiveConnections – 在任意时间可存在的活动(正在使用)连接数量,默认值:10

😊poolMaximumIdleConnections – 任意时间可能存在的空闲连接数;例如:上面配置的最多连接数量是10,这里配置最多空闲的数量是5个,如果空闲第6个了,此时连接池为了保证最多空闲的数量是5个,会真正关闭多余的空闲的连接对象。

😊poolMaximumCheckoutTime – 设置超时时间,在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)。

😊poolTimeToWait – 间隔多久打印一次日志信息,并尝试获取连接。

其它....

③JNDI:采⽤服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所拿到 DataSource不⼀样。如果不是web或者maven的war⼯程,JNDI是不能使⽤的。property可以是(最多只包含以下两个属性):

😊initial_context 这个属性⽤来在 InitialContext 中寻找上下⽂(initialContext.lookup(initial_context))这是个可选属性,如果忽略,那么将会直接从

InitialContext 中寻找 data_source 属性。

😊data_source 这是引⽤数据源实例位置的上下⽂路径。提供了 initial_context 配置时会 在其返回的上下⽂中进⾏查找,没有提供时则直接在 InitialContext 中查找。


  
  1. <dataSource type="POOLED">
  2. <property name="driver" value="com.mysql.jdbc.Driver"/>
  3. <property name="url" value="jdbc:mysql://localhost:3306/bjpowernode"/>
  4. <property name="username" value="root"/>
  5. <property name="password" value="123"/>
  6. <!--连接池中最多正在使用的连接对象的数量上限,默认是10-->
  7. <property name="poolMaximumActiveConnections" value="10" />
  8. <!--最多的空闲数量-->
  9. <property name="poolMaximumIdleConnections" value="5" />
  10. <!--强行让让某个连接空闲,超时时间的设置-->
  11. <property name="poolMaximumCheckoutTime" value="100000" />
  12. <!--每隔2秒打印日志,并且尝试获取连接对象-->
  13. <property name="poolTimeToWait" value="2000" />
  14. </dataSource>

4. properties和mapper标签的配置和使用

(1)java.util.Properties类,实际上是一个Map集合,key和value都是String类型;语法格式:<property name="属性名" value="属性值"/>

(2)例如:我们可以把连接数据库的代码单独抽取出来配置,然后在通过变量的形式赋值过去即可


  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- 单独抽取出来连接数据库的代码-->
  7. <properties>
  8. <property name="jdbc.driver" value="com.mysql.jdbc.Driver" />
  9. <property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybatis" />
  10. <property name="jdbc.username" value="root" />
  11. <property name="jdbc.password" value="123" />
  12. </properties>
  13. <settings>
  14. <setting name="logImpl" value="SLF4J"/>
  15. </settings>
  16. <!-- 默认获取的是mybatis数据库-->
  17. <environments default="mybatisDB">
  18. <!--连接的是mybatis数据库-->
  19. <environment id="mybatisDB">
  20. <transactionManager type="JDBC"/>
  21. <dataSource type="POOLED">
  22. <property name="driver" value="${jdbc.driver}"/>
  23. <property name="url" value="${jdbc.url}" />
  24. <property name="username" value="${jdbc.username}"/>
  25. <property name="password" value="${jdbc.password}"/>
  26. </dataSource>
  27. </environment>
  28. </environments>
  29. <mappers>
  30. <!--关联CarMapper.xml配置文件-->
  31. <mapper resource="CarMapper.xml"/>
  32. </mappers>
  33. </configuration>

(3)实际上这些连接数据库中的信息,可以配置到一个文件里;在类路径下(resources),创建一个jdbc.properties文件

jdbc.properties配置文件


  
  1. jdbc.driver=com.mysql.jdbc.Driver
  2. jdbc.url=jdbc:mysql: //localhost:3306/mybatis
  3. jdbc.username=root
  4. jdbc.password= 123

使用resource引入配置文件


  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--resource一定是从类路径下开始查找资源-->
  7. <properties resource="jdbc.properties" />
  8. <settings>
  9. <setting name="logImpl" value="SLF4J"/>
  10. </settings>
  11. <!-- 默认获取的是mybatis数据库-->
  12. <environments default="mybatisDB">
  13. <!--连接的是mybatis数据库-->
  14. <environment id="mybatisDB">
  15. <transactionManager type="JDBC"/>
  16. <dataSource type="POOLED">
  17. <property name="driver" value="${jdbc.driver}"/>
  18. <property name="url" value="${jdbc.url}" />
  19. <property name="username" value="${jdbc.username}"/>
  20. <property name="password" value="${jdbc.password}"/>
  21. </dataSource>
  22. </environment>
  23. </environments>
  24. <mappers>
  25. <!--关联CarMapper.xml配置文件-->
  26. <mapper resource="CarMapper.xml"/>
  27. </mappers>
  28. </configuration>

(4)也可以使用url属性,表示从绝对路径中加载资源,绝对路径的语法:file:///路径

例如:把jdbc.properties放到d盘的根目录下


  
  1. <!--从绝对路径下加载-->
  2. <properties url="file:///d:/jdbc.properties" />

(5)注意:mapper标签的使用和properties标签的使用很相似;也是resource属性:使⽤相对于类路径的资源引⽤⽅式 ;url属性:使⽤绝对路径中加载资源。


转载:https://blog.csdn.net/m0_61933976/article/details/128493372
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场