前提:Mybatis-Spring项目不是Spring框架的子项目,所以我们需要自己下载jar包。
具体下载方法:mybatis-spring.1.3.1.jar
配置Mybatis-Spring项目需要以下几步:
- 配置数据库
- 配置SqlSessionFactory,也可以选择配置SqlSessionTemplate,在同时配置SqlSessionFactory和SqlSessionTemplate的情况下,优先采用SqlSessionTemplate。
- 配置Mapper,可以配置单个Mapper,也可以通过扫描的方法生成Mapper,比较灵活。
- 事务管理。
下面我按照顺序编写代码。
1、配置数据库
<!--数据库连接池 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="username" value="root" />
<property name="password" value="123456" />
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/ssm" />
</bean>
2、配置SqlSessionFactory
SqlSessionFactory是产生SqlSession的基础,因此配置SqlSessionFactory十分关键。在MyBatis-Spring项目中提供了SqlSessionFactoryBean去支持SqlSessionFactory的配置。由于使用了第三方的包,一般而言,我们倾向于XML的配置,代码如下:
<!--配置SqlSessionFactory -->
<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:sqlMapConfig.xml" />
</bean>
这里配置了SqlSessionFactoryBean,但是只配置了数据源,然后引入一个MyBatis配置文件。下面我们来看看配置文件的代码:
<?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>
<settings>
<!-- 这个配置使全局的映射器启用或者禁用缓存-->
<setting name="cacheEnabled" value="true" />
<!-- 允许JDBC支持生成的键。需要适当的驱动。如果设置为true,则这个设置强制生成的键被使用-->
<setting name="useGeneratedKeys" value="true" />
<!-- 配置默认的执行器 :SIMPLE执行器没有什么特别之处。REUSE执行器重用预处理语句,BATCH执行器重用语句和批量更新-->
<setting name="defaultExecutorType" value="REUSE" />
<!--全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 设置超时时间,它决定驱动等待一个数据库相应的时间-->
<setting name="defaultStatementTimeout" value="25000" />
</settings>
<!-- 别名设置-->
<typeAliases>
<typeAlias alias="role" type="firstMybatisSpringActivity.pojo.Role" />
</typeAliases>
<!-- 指定映射器路径-->
<mappers>
<mapper resource="firstMybatisSpringActivity/mapper/RoleMapper.xml" />
</mappers>
</configuration>
这里通过mapper标签引入了映射器RoleMapper.xml。RoleMapper.xml代码如下:
<?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="firstMybatisSpringActivity.mapper.RoleMapper">
<insert id="insertRole" useGeneratedKeys="true" keyProperty="id">
insert into role(role_name,note) values (#{roleName},#{note})
</insert>
<delete id="deleteRole" parameterType="long">
delete from role where id=#{id}
</delete>
<select id="getRole" parameterType="long" resultType="role">
select id,role_name as roleName,note from role where id=#{id}
</select>
<update id="updateRole" parameterType="role">
update role
set role_name=#{roleName},
note=#{note}
where id=#{id}
</update>
</mapper>
这里定义了一个命名空间——firstMybatisSpringActivity.mapper.RoleMapper,并且提供了对角色的增删改查方法。按照Mybatis的规则定义了一个接口RoleMapper.java,这样才能调用它。代码如下:
package firstMybatisSpringActivity.mapper;
import firstMybatisSpringActivity.pojo.Role;
import org.apache.ibatis.annotations.Param;
public interface RoleMapper {
public int insertRole(Role role);
public int deleteRole(@Param("id") Long id);
public Role getRole(@Param("id") Long id);
public int updateRole(Role role);
}
到这里就完成了关于MyBatis框架的主要代码,但是RoleMapper是一个接口,而不是一个类,它不能产生实例,所以我们要用另外的方法去配置它。
MyBatis-Spring提供了一个MapperFactoryBean类作为中介,我们可以配置它来实现我们想要的Mapper。现在我们来配置RoleMapper的映射器对象。代码如下:
<bean id="roleMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!-- RoleMapper接口将被扫描为Mapper -->
<property name="mapperInterface" value="firstMybatisSpringActivity.mapper.RoleMapper" />
<property name="SqlSessionFactory" ref="SqlSessionFactory" />
</bean>
这里我们可以看到MapperFactoryBean存在3个属性可以配置,分别是mapperInterface、SqlSessionFactory和sqlSessionTemplate,其中:
- mapperInterface是映射器的接口。
- 如果同时配置SqlSessionFactory和sqlSessionTemplate,那么他就会启用sqlSessionTemplate,而SqlSessionFactory作废。
这里笔者插一手sqlSessionTemplate组件的介绍。
严格来说,SqlSessionTemplate并不是一个必须配置的组件,但是他也有一定的价值。首先他是线程安全的类,也就是确保每一个线程使用的SqlSession唯一且不互相冲突。其次,它提供了一系列的功能,比如增删改查等常用功能,不过在此之前需要先配置它,代码如下:
<!-- 配置SqlSessionTemplate-->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="SqlSessionFactory" />
</bean>
最后我们用代码来测试一下:
package firstMybatisSpringActivity.main;
import firstMybatisSpringActivity.mapper.RoleMapper;
import firstMybatisSpringActivity.pojo.Role;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class main {
public static void main(String[] args){
//ctx为Spring IoC容器
ApplicationContext ctx=new ClassPathXmlApplicationContext("spring-config.xml");
RoleMapper roleMapper=ctx.getBean(RoleMapper.class);
Role role=new Role();
role.setRoleName("role_name_mapper");
role.setNote("note_mapper");
roleMapper.insertRole(role);
Long id=role.getId();
roleMapper.getRole(id);
role.setNote("note_mapper_update");
roleMapper.updateRole(role);
roleMapper.deleteRole(id);
}
}
运行结果:
DEBUG 2020-04-19 21:26:22,739 org.springframework.context.support.AbstractApplicationContext: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@782830e
DEBUG 2020-04-19 21:26:23,044 org.springframework.beans.factory.xml.XmlBeanDefinitionReader: Loaded 5 bean definitions from class path resource [spring-config.xml]
DEBUG 2020-04-19 21:26:23,122 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry: Creating shared instance of singleton bean 'org.mybatis.spring.mapper.MapperScannerConfigurer#0'
WARN 2020-04-19 21:26:23,258 org.mybatis.spring.mapper.ClassPathMapperScanner: No MyBatis mapper was found in '[firstMybatisSpringActivity.mapper]' package. Please check your configuration.
DEBUG 2020-04-19 21:26:23,299 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry: Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
DEBUG 2020-04-19 21:26:23,320 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry: Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'
DEBUG 2020-04-19 21:26:23,322 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry: Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
DEBUG 2020-04-19 21:26:23,324 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry: Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
DEBUG 2020-04-19 21:26:23,326 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry: Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
DEBUG 2020-04-19 21:26:23,346 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry: Creating shared instance of singleton bean 'dataSource'
DEBUG 2020-04-19 21:26:23,414 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry: Creating shared instance of singleton bean 'SqlSessionFactory'
DEBUG 2020-04-19 21:26:23,436 org.apache.ibatis.logging.LogFactory: Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG 2020-04-19 21:26:23,653 org.mybatis.spring.SqlSessionFactoryBean: Parsed configuration file: 'class path resource [sqlMapConfig.xml]'
DEBUG 2020-04-19 21:26:23,654 org.mybatis.spring.SqlSessionFactoryBean: Property 'mapperLocations' was not specified or no matching resources found
DEBUG 2020-04-19 21:26:23,657 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry: Creating shared instance of singleton bean 'sqlSessionTemplate'
DEBUG 2020-04-19 21:26:23,694 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry: Creating shared instance of singleton bean 'roleMapper'
DEBUG 2020-04-19 21:26:23,741 org.mybatis.spring.SqlSessionUtils: Creating a new SqlSession
DEBUG 2020-04-19 21:26:23,752 org.mybatis.spring.SqlSessionUtils: SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e6f74c] was not registered for synchronization because synchronization is not active
DEBUG 2020-04-19 21:26:23,759 org.springframework.jdbc.datasource.DataSourceUtils: Fetching JDBC Connection from DataSource
DEBUG 2020-04-19 21:26:23,760 org.springframework.jdbc.datasource.SimpleDriverDataSource: Creating new JDBC Driver Connection to [jdbc:mysql://localhost:3306/ssm]
DEBUG 2020-04-19 21:26:24,227 org.mybatis.spring.transaction.SpringManagedTransaction: JDBC Connection [com.mysql.jdbc.JDBC4Connection@683dbc2c] will not be managed by Spring
DEBUG 2020-04-19 21:26:24,240 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Preparing: insert into role(role_name,note) values (?,?)
DEBUG 2020-04-19 21:26:24,279 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: role_name_mapper(String), note_mapper(String)
DEBUG 2020-04-19 21:26:24,302 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <== Updates: 1
DEBUG 2020-04-19 21:26:24,304 org.mybatis.spring.SqlSessionUtils: Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e6f74c]
DEBUG 2020-04-19 21:26:24,309 org.mybatis.spring.SqlSessionUtils: Creating a new SqlSession
DEBUG 2020-04-19 21:26:24,309 org.mybatis.spring.SqlSessionUtils: SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@65b3f4a4] was not registered for synchronization because synchronization is not active
DEBUG 2020-04-19 21:26:24,311 org.springframework.jdbc.datasource.DataSourceUtils: Fetching JDBC Connection from DataSource
DEBUG 2020-04-19 21:26:24,311 org.springframework.jdbc.datasource.SimpleDriverDataSource: Creating new JDBC Driver Connection to [jdbc:mysql://localhost:3306/ssm]
DEBUG 2020-04-19 21:26:24,327 org.mybatis.spring.transaction.SpringManagedTransaction: JDBC Connection [com.mysql.jdbc.JDBC4Connection@28975c28] will not be managed by Spring
DEBUG 2020-04-19 21:26:24,327 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Preparing: select id,role_name as roleName,note from role where id=?
DEBUG 2020-04-19 21:26:24,328 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: 5(Long)
DEBUG 2020-04-19 21:26:24,349 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <== Total: 1
DEBUG 2020-04-19 21:26:24,350 org.mybatis.spring.SqlSessionUtils: Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@65b3f4a4]
DEBUG 2020-04-19 21:26:24,351 org.mybatis.spring.SqlSessionUtils: Creating a new SqlSession
DEBUG 2020-04-19 21:26:24,351 org.mybatis.spring.SqlSessionUtils: SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@55f616cf] was not registered for synchronization because synchronization is not active
DEBUG 2020-04-19 21:26:24,351 org.springframework.jdbc.datasource.DataSourceUtils: Fetching JDBC Connection from DataSource
DEBUG 2020-04-19 21:26:24,351 org.springframework.jdbc.datasource.SimpleDriverDataSource: Creating new JDBC Driver Connection to [jdbc:mysql://localhost:3306/ssm]
DEBUG 2020-04-19 21:26:24,360 org.mybatis.spring.transaction.SpringManagedTransaction: JDBC Connection [com.mysql.jdbc.JDBC4Connection@46fa7c39] will not be managed by Spring
DEBUG 2020-04-19 21:26:24,361 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Preparing: update role set role_name=?, note=? where id=?
DEBUG 2020-04-19 21:26:24,361 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: role_name_mapper(String), note_mapper_update(String), 5(Long)
DEBUG 2020-04-19 21:26:24,364 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <== Updates: 1
DEBUG 2020-04-19 21:26:24,364 org.mybatis.spring.SqlSessionUtils: Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@55f616cf]
DEBUG 2020-04-19 21:26:24,365 org.mybatis.spring.SqlSessionUtils: Creating a new SqlSession
DEBUG 2020-04-19 21:26:24,365 org.mybatis.spring.SqlSessionUtils: SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4a668b6e] was not registered for synchronization because synchronization is not active
DEBUG 2020-04-19 21:26:24,365 org.springframework.jdbc.datasource.DataSourceUtils: Fetching JDBC Connection from DataSource
DEBUG 2020-04-19 21:26:24,365 org.springframework.jdbc.datasource.SimpleDriverDataSource: Creating new JDBC Driver Connection to [jdbc:mysql://localhost:3306/ssm]
DEBUG 2020-04-19 21:26:24,377 org.mybatis.spring.transaction.SpringManagedTransaction: JDBC Connection [com.mysql.jdbc.JDBC4Connection@f381794] will not be managed by Spring
DEBUG 2020-04-19 21:26:24,377 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Preparing: delete from role where id=?
DEBUG 2020-04-19 21:26:24,378 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: 5(Long)
DEBUG 2020-04-19 21:26:24,380 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <== Updates: 1
DEBUG 2020-04-19 21:26:24,381 org.mybatis.spring.SqlSessionUtils: Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4a668b6e]