从 XML 中构建 SqlSessionFactory
先学会xml文件的方式后,再从Maven构建项目就简单很多。
Mybatis官网链接
提示:这里对文章进行总结:
数据库连接可以在容器启动的时候就先进行一定数量的连接,放在连接池当中,等待调用。
举例子:jdbc.initialSize1=50
常用连接池功能不仅仅局限于连接,还能对sql语句进行监控管理、处理异常、管理事务作用。
项目代码中已经创建mapper文件夹,并且创建xml,里面写了sql语句,如何让其对应数据库连接并生效对数据库操作呢?举例子:关注MapperScannerConfigurer配置。
第一步:配置数据源jdbc.properties(配置多个)
这里配置2个数据源为例子
对应mapper.xml的所在文件夹一般是对某个数据库操作的。
数据源的属性名可以自定义,但是xml 配置中就必须统一
比如jdbc.username数据源中可以改其他名,只要配置在数据源xml中对即可。
--------------------------------------数据源__1----------------------------------------
#驱动器
driveConfigClass1=com.mysql.jdbc.Driver
url1=jdbc\:mysql\://localhost\:3306/DataBase_Name?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
username1=
password1=
#连接池初始化时初始化的数据库连接数,当项目第一次进行增,删,改,查的时候,连接池会初始化,这个时候会根据initialSize参数初始化数据库连接放入连接池中。
initialSize1=50
#最大空闲数
maxIdle1=300
#最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请
minIdle1=50
#最大激活数
maxActive1=300
#用来验证数据库连接的有效性
validationQuery1=select 1
--------------------------------------数据源__2----------------------------------------
#驱动器
driveConfigClass2=com.mysql.Driver
url2=:mysql\://localhost\:3306/DataBase_Name?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
name=
word=
#连接池初始化时初始化的数据库连接数,当项目第一次进行增,删,改,查的时候,连接池会初始化,这个时候会根据initialSize参数初始化数据库连接放入连接池中。
initialSize2=10
#最大空闲数
maxIdle2=15
#最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请
minIdle2=10
#最大激活数
maxActive2=15
#用来验证数据库连接的有效性
validationQuery2=select 1
testOnBorrow=true
--------------------------------------数据源__3----------------------------------------
#配置驱动
sqlServerDrive=com.microsoft.sqlserver.jdbc.SQLServerDriver
url3=jdbc:sqlserver://localhost;database=DataBase_Name
usernameTEST=
passwordTEST=
#最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请
initialSizeTest=15
minIdleTEST=15
maxIdleTEST=1200
#最大激活数
maxActiveTEST=1200
testOnBorrow=true
第二步:配置数据源的Mybatis全局配置
首要的配置数据库sql语句执行日志,监控和管理,而log4.properties配置是对非sql日志监控
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。
在使用mybatis框架时,首先导入其对应的jar包,并进行相应的配置,所以得对配置文件的每个参数都得了解。一个完全的mybatis配置文件结构如下:
mybatis-Config.xml常用配置注解包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
#一个配置完整的 settings 元素的示例如下:
<settings>
# 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。
<setting name="cacheEnabled" value="true"/>
# 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
# 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。
<setting name="useGeneratedKeys" value="true"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
#常用配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(PreparedStatement); BATCH 执行器不仅重用语句还会执行批量更新。
<setting name="defaultExecutorType" value="REUSE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="safeResultHandlerEnabled" value="true"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
<setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/>
<setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumTypeHandler"/>
<setting name="callSettersOnNulls" value="false"/>
<setting name="returnInstanceForEmptyRow" value="false"/>
<setting name="logPrefix" value="exampleLogPreFix_"/>
#日志 关于mysql语句运行的日志
<setting name="logImpl" value="SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING"/>
<setting name="proxyFactory" value="CGLIB | JAVASSIST"/>
<setting name="vfsImpl" value="org.mybatis.example.YourselfVfsImpl"/>
# 允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的项目必须采用 Java 8 编译,并且加上 -parameters 选项。(新增于 3.4.1)
<setting name="useActualParamName" value="true"/>
<setting name="configurationFactory" value="org.mybatis.example.ConfigurationFactory"/>
</settings>
#类型别名(typeAliases)
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
#分页插件
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
</configuration>
第三步:将前两步的配置注入连接池和Bean类的属性值中
文件名 springContext-dao.xml
#将数据源的值注入到三个Bean中,这里只是注入了数据源1,另外连个一次类推
1.DruidDataSource链接学习:
数据库连接池当用户不使用的时候,并没有断开与数据库的连接,而是将连接放到连接池当中,
否则每次连接会耗费极大的连接资源。
Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,
内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。
2.SqlSessionFactoryBean
浏览器和服务器之间的会话通过Session标记,Session用来维护无状态请求之间的状态的信息。
因此SqlSession是客户端与数据库Server之间建立的会话,并维护了客户端和数据库Server的一些状态信息。
1.SqlSession是关联到具体数据库连接的,实现了SqlSession接口,可以执行sql命令、获取mapper和管理事务
2.SqlSessionFactoryBean是生产SqlSessionFactory的一种工厂Bean;
3.SqlSessionFactory是一种生产SqlSession的工厂,其能力(方法 )就是打开一个会话(客户端和数据库Server)
4.SqlSession是代表数据库连接客户端和数据库Server之间的会话信息;
5.SqlSessionTemplate是SqlSession的一个具体实现。
3.MapperScannerConfigurer
此配置会扫描所在项目的文件夹下的所有接口,然后创建各自接口的动态代理类。这样,Service就可以注入dao的实例了。
mybatis-spring提供了MapperScannerConfigurer这个类,它将会查找类路径下的映射器并自动将它们创建成MapperFactoryBean。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
#将jdbc文件引用到这个文件
<context:property-placeholder location="classpath:文件夹名字/jdbc.properties" />
--------------#为将 数据源1 注入到Bean中-----------------------
<!--配置数据库连接池,使用的连接池是druid-->
<bean id="dataSource_ID1" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driveConfigClass1}"></property>
<property name="url" value="${url1}"></property>
<property name="username" value="${username1}"></property>
<property name="password" value="${password1}"></property>
<property name="initialSize" value="${initialSize1}"/>
<property name="maxActive" value="${maxActive1}" />
<property name="maxIdle" value="${maxIdle1}" />
<property name="minIdle" value="${minIdle1}"/>
<property name="validationQuery" value="${validationQuery}"/>
<property name="testOnBorrow" value="${testOnBorrow}"/>
</bean>
<!--配置SqlSession的工厂-->
<bean id="sqlSessionFactory_ID1" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:Mybatis-Config.xml"/>
#引用dataSource_ID1 给sqlsession
<property name="dataSource" ref="dataSource_ID1"></property>
</bean>
<!--配置数据库操作的接口以及xml所在package-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--配置basePackage的需要扫描Dao接口包-->
<property name="basePackage"
value="net.test.xxx1.mapper",
"net.test.xxx2.mapper",
"net.test.xxx3.mapper",
......
>
</property>
<!--注入sqlSessionFactory_ID1-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_ID1" />
</bean>
</beans>
--------------#为将 数据源3 注入到Bean中-----------------------
#将jdbc文件引用到这个文件
<context:property-placeholder location="classpath:文件夹名字/jdbc.properties" />
--------------#为将 数据源3 注入到Bean中-----------------------
<!--配置数据库连接池,使用的连接池是druid-->
<bean id="dataSource_ID3" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${sqlServerDrive}"></property>
<property name="url" value="${url3}"></property>
<property name="username" value="${usernameTEST}"></property>
<property name="password" value="${passwordTEST}"></property>
<property name="initialSize" value="${initialSizeTest}"/>
<property name="maxActive" value="${maxActiveTEST}" />
<property name="maxIdle" value="${maxIdleTEST}" />
<property name="minIdle" value="${minIdleTEST}"/>
<property name="testOnBorrow" value="${testOnBorrow}"/>
</bean>
<!--配置SqlSession的工厂-->
<bean id="sqlSessionFactory_ID3" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:Mybatis-Config.xml"/>
#引用dataSource_ID3 给sqlsession
<property name="dataSource" ref="dataSource_ID3"></property>
</bean>
<!--配置数据库操作的接口以及xml所在package-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--配置basePackage的需要扫描Dao接口包-->
<property name="basePackage"
value="net.test.xxxxx1.mapper","net.test.xxxxx2.mapper",
"net.test.xxxxx3.mapper",
......
></property>
<!--注入sqlSessionFactory_ID-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_ID3" />
</bean>
</beans>
总结
1.配置数据源
2.将数据源配置监控即mybatis-config.xml
3.SpringContext_dao将数据源和对应的mapper文件中sql语句进行匹配,就是匹配这些sql语句在哪个数据库连接上生效的意思。
此篇配置文件会在接下来几个章节被引用
提示:这里对文章进行总结:
点解连接
第一章:Spring流程执行步骤
第二章:Spring核心思想和IOC和AOP依赖注入
第三章:Spring常用注解解释
第四章:Spring七大核心模块Bean、Core、Context
第五章:Spring细分一如何让mapper文件夹下的SQL语句对数据库生效,jdbc和mybatis-config.xml
第六章:Springmvc事务管理和配置文件xml详解和七大事务和注解@Transactional