我的第一个MyBatis-Spring项目

前提:Mybatis-Spring项目不是Spring框架的子项目,所以我们需要自己下载jar包。
具体下载方法:mybatis-spring.1.3.1.jar

配置Mybatis-Spring项目需要以下几步:

  1. 配置数据库
  2. 配置SqlSessionFactory,也可以选择配置SqlSessionTemplate,在同时配置SqlSessionFactory和SqlSessionTemplate的情况下,优先采用SqlSessionTemplate。
  3. 配置Mapper,可以配置单个Mapper,也可以通过扫描的方法生成Mapper,比较灵活。
  4. 事务管理。

下面我按照顺序编写代码。
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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值