mybatis与spring集成,使用AOP处理分页

一、mybatis集成spring

    1.1.开启注解式开发,并扫描指定包。

<context:component-scan base-package="com.zking"/>

    1.2.引入数据配置文件:jdbc.proerties(详见 jdbc.proerties)。

<context:property-placeholder location="jdbc.properties" />

    1.3.创建dbcp2数据库连接池( 详见“dbcp2.txt”)。

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <!--初始连接数-->
        <property name="initialSize" value="10"/>
        <!--最大活动连接数-->
        <property name="maxTotal" value="100"/>
        <!--最大空闲连接数-->
        <property name="maxIdle" value="50"/>
        <!--最小空闲连接数-->
        <property name="minIdle" value="10"/>
        <!--设置为-1时,如果没有可用连接,连接池会一直无限期等待,直到获取到连接为止。-->
        <!--如果设置为N(毫秒),则连接池会等待N毫秒,等待不到,则抛出异常-->
        <property name="maxWaitMillis" value="-1"/>
</bean>

    1.4.实现mybatis与spring集成配置(包含了集成pagehelper插件,详见:spring与mybatis整合(集成pagehelper分页插件).txt).

        

<!--1) 创建sqlSessionFactory-->
            <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
                <!-- 指定数据源 -->
                <property name="dataSource" ref="dataSource"/>
                <!-- 自动扫描XxxMapping.xml文件,**任意路径 -->
                <property name="mapperLocations" value="classpath*:com/zking/**/mapper/*.xml"/>
                <!-- 指定别名 -->
                <property name="typeAliasesPackage" value="com/zking/**/model"/>
                <!--配置pagehelper插件-->
                <property name="plugins">
                    <array>
                        <bean class="com.github.pagehelper.PageInterceptor">
                            <property name="properties">
                                <value>
                                    helperDialect=mysql
                                </value>
                            </property>
                        </bean>
                    </array>
                </property>
                <!-- 开启驼峰命名映射 -->
                <property name="configuration">
                    <bean class="org.apache.ibatis.session.Configuration">
                        <property name="mapUnderscoreToCamelCase" value="true"/>
                    </bean>
                </property>
            </bean>
            <!--2) 自动扫描com/zking/**/mapper下的所有XxxMapper接口,并实现这些接口,-->
            <!--   即可直接在程序中使用mapper接口,不用再获取sqlsession对象-->
            <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
                <!--basePackage 属性是映射器接口文件的包路径。-->
                <!--你可以使用分号或逗号 作为分隔符设置多于一个的包路径-->
                <property name="basePackage" value="com/zking/**/mapper"/>
                <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
            </bean>

    1.5.开启注解式事务:mybatis的事务处理交给Spring管理(注解式事务,详见:事务处理配置和开启动态代理.txt)。

<!-- 事务相关控制-->
            <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                <property name="dataSource" ref="dataSource" />
            </bean>
            <!-- 启动事务控制器注解-->
            <tx:annotation-driven transaction-manager="transactionManager" />

    1.6.开启动态代理(详见:事务处理配置和开启动态代理.txt)

<aop:aspectj-autoproxy/>

    1.7 springtext + junit实现测试

package com.zking.service.impl;

import com.zking.model.Book;
import com.zking.service.IBookService;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring.xml")
public class BookServiceImplTest {
    @Autowired
    private IBookService bookService;
    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void queryAll() {
        List<Book> bookList = bookService.queryAll();
        bookList.forEach(System.out::println);
    }
}

二、 使用AOP处理分页

package com.zking.aspect;

import com.github.pagehelper.PageInfo;
import com.zking.util.PageBean;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

import java.util.List;

@Aspect //该类就是一个切面类/增强类
public class PageAspect {
    //通过 Aspect 表达式确定要切入的目标方法
    @Around("execution(* *..*Service.*Page(..))")
    public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable {
        //环绕方法执行之前
        PageBean pageBean = null;
        //获取目标方法的参数(目的是为了获取里面的pagebean参数)
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            if (null != arg){
                //判断该参数是不是pageBean
                if (arg instanceof PageBean){
                    pageBean = (PageBean) arg;
                    break;
                }
            }
        }
        //执行目标方法
        Object returnValue = joinPoint.proceed();
        List list = null;
        if(returnValue instanceof List){
            list = (List) returnValue;
        }
        PageInfo pageInfo = new PageInfo(list);
        //目标方法执行之后
        if(null != pageBean && pageBean.isPagination()){
            //给pageBean的总数据量赋值
            pageBean.setTotal((int) pageInfo.getTotal());
        }
        return list;
    }
}

定义方法

List<Book> queryAllPage(Book book);

编写sql语句

<select id="queryAllPage" resultType="com.zking.model.Book">
    select <include refid="Base_Column_List"/>
    from tb_book where 1=1
    <if test="null != bookName and '' != bookName">
        and book_name like concat('%',#{bookName},'%')
    </if>
    order by book_id desc
</select>

测试

package com.zking.service.impl;

import com.github.pagehelper.PageHelper;
import com.zking.model.Book;
import com.zking.service.IBookService;
import com.zking.util.PageBean;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

public class BookServiceImplTest extends BaseTest {
    @Autowired
    private IBookService bookService;
    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void queryAll() {
        List<Book> bookList = bookService.queryAll();
        bookList.forEach(System.out::println);
    }

    @Test
    public void queryAllPage() {
        PageBean pageBean = new PageBean();
        PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        List<Book> bookList = bookService.queryAllPage(Book
                .builder()
                .bookName("童话")
                .build(), pageBean);
        bookList.forEach(System.out::println);
    }
}


版权声明:本文为weixin_62322136原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。