Spring+Mybatis

六月ゝ 毕业季﹏ 提交于 2020-03-12 11:01:43

1、整合方式共有四种,这里总结了三种。

2、通用配置

2.1、依赖包:

在导依赖包时,不能导入

<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>5.0.3</version>
</dependency>

此包,否则会报方法找不到的异常,其实是jar包中的类冲突。

<project xmlns="http://maven.apache.org/POM/4.0.0"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                                                 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.lin</groupId>
    <artifactId>spring-mybatis</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <!-- spring -->
        <dependency>
            <artifactId>org.springframework</artifactId>
            <groupId>spring-jdbc</groupId>

            <version>3.2.7.RELEASE</version>
         </dependency>
         <dependency>
             <artifactId>org.springframework</artifactId>
             <groupId>spring-core</groupId>
             <version>3.2.7.RELEASE</version>
         </dependency>
         <dependency>
            <artifactId>org.springframework</artifactId>
            <groupId>spring-context</groupId>
            <version>3.2.7.RELEASE</version>
        </dependency>
        <dependency>
            <artifactId>org.springframework</artifactId>
            <groupId>spring-beans</groupId>
            <version>3.2.7.RELEASE</version>
        </dependency>
        <dependency>
            <artifactId>org.springframework</artifactId>
            <groupId>spring-tx</groupId>
            <version>3.2.7.RELEASE</version>
        </dependency>
        <dependency>
            <artifactId>org.springframework</artifactId>
            <groupId>spring-expression</groupId>
            <version>3.2.7.RELEASE</version>
        </dependency>
        <dependency>
            <artifactId>org.springframework</artifactId>
            <groupId>spring-aop</groupId>
            <version>3.2.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aopalliance</groupId>
            <artifactId>com.springsource.org.aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.12</version>
        </dependency>
        <!-- mybatis-spring桥接 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.2</version>
        </dependency>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.6</version>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.8</version>
        </dependency>
        <!-- c3p0连接池 -->
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
         </dependency>
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>mchange-commons-java</artifactId>
            <version>0.2.15</version>
        </dependency>
        <dependency>
            <artifactId>commons-logging</artifactId>
            <groupId>commons-logging</groupId>
            <version>1.1</version>
        </dependency>
    </dependencies>
</project>

2.2、spring-mybatis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:p="http://www.springframework.org/schema/p"
            xmlns:aop="http://www.springframework.org/schema/aop"
            xmlns:jdbc="http://www.springframework.org/schema/jdbc"
            xmlns:context="http://www.springframework.org/schema/context"
            xmlns:tx="http://www.springframework.org/schema/tx"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
                                                http://www.springframework.org/schema/beans/spring-beans.xsd
                                                http://www.springframework.org/schema/context
                                              http://www.springframework.org/schema/context/spring-context.xsd
                                                http://www.springframework.org/schema/aop
                                                http://www.springframework.org/schema/aop/spring-aop.xsd
                                                http://www.springframework.org/schema/jdbc
                                                http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
                                                http://www.springframework.org/schema/tx
                                                http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- 开启spring注解扫描 -->
    <context:component-scan base-package="service"></context:component-scan>
    <!-- 配置数据源,使用c3p0连接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://192.168.20.40:3306/swan?characterEncoding=utf-8"></property>
        <property name="user" value="devswan"></property>
        <property name="password" value="DEVswan123!"></property>
    </bean>
</beans>

2.3、Service接口

package service;

public interface ILinBookService {
    LinBook getLinBook();
    void addBook(LinBook linBook);
}

2.4、实体类

package bean;

public class LinBook {
    private int bookId;
    private String bookName;
    private int bookNum;
    private String bookCategory;
}

2.4、测试类

public class JTest {

    ILinBookService bean =null;

    @Before
    public void fun() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-mybatis.xml");
        bean = (ILinBookService) applicationContext.getBean("ILinBookService");
    }

    @Test
    public void fun1() {
        LinBook linBook2 = bean.getLinBook();
        System.out.println(linBook2);
    }
}

3、第一种:使用org.mybatis.spring.mapper.MapperScannerConfigurer

3.1、创建sqlSessionFactory

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="mapperLocations" value="dao/ILinBook.xml"></property>
</bean>

3.2、sqlSession

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="dao" />
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>

3.3、ILinBook.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="dao.ILinBook">
    <select id="getBookById" parameterType="Integer" resultType="bean.LinBook" statementType="PREPARED">
        select * from linbook where bookid=#{v}
    </select>
    <insert id="addLinBook" parameterType="bean.LinBook">
        insert into linbook values(#{bookId},#{bookName},#{bookNum},#{bookCategory})
    </insert>
</mapper>

3.4、Service类

package service;

@Component("ILinBookService")
public class LinBookService implements ILinBookService {
    // MapperScannerConfigurer
    @Resource
    private ILinBook ilinbook;
    public LinBook getLinBook() {
        return ilinbook.getBookById(1);
    }

    public void addBook(LinBook linBook) {
        ilinbook.addLinBook(linBook);
    }
}

3.5、Dao层接口

package dao;

@MapperScan
public interface ILinBook {
    LinBook getBookById(int bookId);
    void addLinBook(LinBook linBook);
}

4、第二种:采用org.mybatis.spring.mapper.MapperFactoryBean

4.1、创建sqlSessionFactory

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
</bean>

4.2、sqlSession

<bean id="ILinBook" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="dao.ILinBook" />
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

4.3、Service类

package service;

@Component("ILinBookService")
public class LinBookService implements ILinBookService {

    // MapperFactoryBean
    @Resource
    private ILinBook ilinbook;
    public LinBook getLinBook() {
        return ilinbook.getBookById(1);
    }

    // @Transactional(rollbackFor=Throwable.class)
    public void addBook(LinBook linBook) {
        ilinbook.addLinBook(linBook);
    }
}

4.4、Dao层接口

package dao;

@MapperScan
public interface ILinBook {

    // 注解用于第二种,不需要xml文件
    @Select("select * from linbook where bookid=#{v}")
    LinBook getBookById(@Param("v") int bookId);
    void addLinBook(LinBook linBook);
}

5、第三种:采用org.mybatis.spring.SqlSessionTemplate

5.1、创建sqlSessionFactory

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="mapperLocations" value="dao/ILinBook.xml"></property>
</bean>

5.2、sqlSession

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
</bean>

5.3、ILinBook.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="dao.ILinBook">
    <select id="getBookById" parameterType="Integer" resultType="bean.LinBook" statementType="PREPARED">
        select * from linbook where bookid=#{v}
    </select>

    <insert id="addLinBook" parameterType="bean.LinBook">
        insert into linbook values(#{bookId},#{bookName},#{bookNum},#{bookCategory})
    </insert>
</mapper>

5.4、Service类

package service;

@Component("ILinBookService")
public class LinBookService implements ILinBookService {

    // SqlSessionTemplate
    @Resource
    private SqlSessionTemplate sqlSessionTemplate;

    public LinBook getLinBook() {
        //以下二选一
        return sqlSessionTemplate.getMapper(ILinBook.class).getBookById(1);
        return sqlSessionTemplate.selectOne("dao.ILinBook.getBookById", 1);
    }

    // @Transactional(rollbackFor=Throwable.class)
    public void addBook(LinBook linBook) {
        ilinbook.addLinBook(linBook);
    }
}

5.5、Dao层接口

package dao;

@MapperScan
public interface ILinBook {

    LinBook getBookById(int bookId);
    void addLinBook(LinBook linBook);

}

6、总结

三种方式采用不同的spring提供的工厂,生成sqlSession,使得集成后的spring和mybatis中,mybatis又将一些东西交由spring管理。

6.1、事务

6.1.1、spring-mybatis.xml

加入

<!-- 配置事务控制器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

6.1.2、不使用注解时

<!-- 不使用注解,aop控制事务 -->
<tx:advice id="iccardTxAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!-- read-only:只读事务,事务中没有对数据库修改,mysql会进行优化 -->
        <!-- propagetion:事务传播, -->
        <tx:method name="add*" rollback-for="java.lang.Exception" read-only="false" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

<!-- 把事务控制在service层 -->
<aop:config>
    <aop:pointcut id="iccardTerm" expression="execution(public * service.*.*(..))" />
    <aop:advisor pointcut-ref="iccardTerm" advice-ref="iccardTxAdvice" />
</aop:config>

6.1.3、使用注解时

<!-- 使用注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />

需要在service中的方法上加入注解,如:

rollbackFor是回滚情况

@Transactional(rollbackFor=Throwable.class)

public void addBook(LinBook linBook) {

    ilinbook.addLinBook(linBook);

}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!