Mybatis与Spring集成

一、Mybatis与spring集成

     解决了代码重复的问题

1、导入pom依赖
1.1 添加spring相关依赖(5.0.2.RELEASE)
spring-core

   spring-beans

   spring-context

   spring-orm

   spring-tx

   spring-aspects

   spring-web

1.2 添加mybatis相关依赖
mybatis核心:mybatis(3.4.5)

   Mybatis分页:pagehelper(5.1.2)

1.3 spring整合mybatis(1.3.1)
mybatis-spring

1.4 添加dbcp2连接池
commons-dbcp2(2.1.1)

   commons-pool2(2.4.3)

1.5 添加日志配置(2.9.1)
log4j-core

   log4j-api

   log4j-web

1.6 其他
junit(4.12)

   javax.servlet-api(4.0.0)

   lombok(1.18.2)

注:使用mybatis-generator插件,pom文件添加支持

org.springframework spring-context ${spring.version} org.springframework spring-orm ${spring.version} org.springframework spring-tx ${spring.version} org.springframework spring-aspects ${spring.version} org.springframework spring-web ${spring.version} org.springframework spring-test ${spring.version}
<!--2.mybatis相关-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>${mybatis.version}</version>
</dependency>
<!--mysql-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
</dependency>
<!--pagehelper分页插件jar包依赖-->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>${pagehelper.version}</version>
</dependency>
<!--mybatis与spring集成jar包依赖-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>${mybatis.spring.version}</version>
</dependency>

<!--3.dbcp2连接池相关-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-dbcp2</artifactId>
    <version>${commons.dbcp2.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>${commons.pool2.version}</version>
</dependency>

<!--4.log日志相关依赖-->
<!--核心log4j2jar包-->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>${log4j2.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>${log4j2.version}</version>
</dependency>
<!--web工程需要包含log4j-web,非web工程不需要-->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>${log4j2.version}</version>
</dependency>

<!--5.其他-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>${servlet.version}</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok.version}</version>
    <scope>provided</scope>
</dependency>
src/main/java **/*.xml src/main/resources jdbc.properties *.xml org.apache.maven.plugins maven-compiler-plugin ${maven.compiler.plugin.version} ${maven.compiler.source} ${maven.compiler.target} ${project.build.sourceEncoding} org.mybatis.generator mybatis-generator-maven-plugin 1.3.2 mysql mysql-connector-java ${mysql.version} true

2、利用mybatis逆向工程生成模型层层代码
工作目录修改为当前的工作区间
3、编写配置文件applicationContext-mybatis.xml

<?xml version="1.0" encoding="UTF-8"?>




context:annotation-config/

<context:component-scan base-package=“com.mjx”/>

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

<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>

<!--4. spring和MyBatis整合 -->
<!--1) 创建sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 指定数据源 -->
    <property name="dataSource" ref="dataSource"/>
    <!-- 自动扫描XxxMapping.xml文件,**任意路径 -->
    <property name="mapperLocations" value="classpath*:com/mjx/**/mapper/*.xml"/>
    <!-- 指定别名 -->
    <property name="typeAliasesPackage" value="com/mjx/**/model"/>
    <!--配置pagehelper插件-->
    <property name="plugins">
        <array>
            <bean class="com.github.pagehelper.PageInterceptor">
                <property name="properties">
                    <value>
                        helperDialect=mysql
                    </value>
                </property>
            </bean>
        </array>
    </property>
</bean>

<!--2) 自动扫描com/mwy/**/mapper下的所有XxxMapper接口(其实就是DAO接口),并实现这些接口,-->
<!--   即可直接在程序中使用dao接口,不用再获取sqlsession对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!--basePackage 属性是映射器接口文件的包路径。-->
    <!--你可以使用分号或逗号 作为分隔符设置多于一个的包路径-->
    <property name="basePackage" value="com/mjx/**/mapper"/>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<aop:aspectj-autoproxy/>
在工程的pom文件中增加spring-test的依赖

org.springframework spring-test

${spring.version}

在测试类上加
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={“classpath:applicationContext-mybatis.xml”})
BookServicImpl(注解代替配置)

package com.mjx.servic.impl;

import com.mjx.mapper.BookMapper;
import com.mjx.model.Book;
import com.mjx.servic.BookServic;
import com.mjx.util.PageBean;
import com.mjx.vo.BookVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
@Service
public class
package com.mjx.servic.impl;

import com.mjx.mapper.BookMapper;
import com.mjx.model.Book;
import com.mjx.servic.BookServic;
import com.mjx.util.PageBean;
import com.mjx.vo.BookVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
@Service
public class BookServicImpl implements BookServic {
@Autowired
private BookMapper bookMapper;

@Override
public int deleteByPrimaryKey(Integer bid) {
    return bookMapper.deleteByPrimaryKey(bid);
}

@Override
public int insert(Book record) {
    return bookMapper.insert(record);
}

@Override
public int insertSelective(Book record) {
    return bookMapper.insert(record);
}

@Override
public Book selectByPrimaryKey(Integer bid) {
    return bookMapper.selectByPrimaryKey(bid);
}

@Override
public int updateByPrimaryKeySelective(Book record) {
    return bookMapper.updateByPrimaryKeySelective(record);
}

@Override
public int updateByPrimaryKey(Book record) {
    return bookMapper.updateByPrimaryKey(record);
}

@Override
public List<Book> selectBooksIn(List bookIds) {
    return bookMapper.selectBooksIn(bookIds);
}

@Override
public List<Book> selectBooksLike1(String bname) {
    return bookMapper.selectBooksLike1(bname);
}

@Override
public List<Book> selectBooksLike2(String bname) {
    return bookMapper.selectBooksLike2(bname);
}

@Override
public List<Book> selectBooksLike3(String bname) {
    return bookMapper.selectBooksLike3(bname);
}

@Override
public List<Book> list1() {
    return bookMapper.list1();
}

@Override
public List<Book> list2() {
    return bookMapper.list2();
}

@Override
public Book list3(BookVo bookVo) {
    return bookMapper.list3(bookVo);
}

@Override
public List<Map> list4() {
    return bookMapper.list4();
}

@Override
public Map list5(Map book) {
    return bookMapper.list5(book);
}

@Override
public List<Map> listPager(Map map, PageBean pageBean) {
    if(pageBean != null && pageBean.isPagination()) {
        PageHelper.startPage(pageBean.getPage(), pageBean.getRows());

    }
    List<Map> list = bookMapper.listPager(map);
    if(pageBean != null && pageBean.isPagination()){
        PageInfo pageInfo = new PageInfo(list);
        System.out.println("页码:"+pageInfo.getPageNum());
        System.out.println("页大小:"+pageInfo.getPageSize());
        System.out.println("总记录:"+pageInfo.getTotal());
        pageBean.setTotal(pageInfo.getTotal()+"");
    }
    return list;
}

@Override
public List<Book> list6(BookVo bookVo) {
    return bookMapper.list6(bookVo);
}

@Override
public List<Book> list7(BookVo bookVo) {
    return bookMapper.list7(bookVo);
}

}
implements BookServic {
@Autowired
private BookMapper bookMapper;

@Override
public int deleteByPrimaryKey(Integer bid) {
    return bookMapper.deleteByPrimaryKey(bid);
}

@Override
public int insert(Book record) {
    return bookMapper.insert(record);
}

@Override
public int insertSelective(Book record) {
    return bookMapper.insert(record);
}

@Override
public Book selectByPrimaryKey(Integer bid) {
    return bookMapper.selectByPrimaryKey(bid);
}

@Override
public int updateByPrimaryKeySelective(Book record) {
    return bookMapper.updateByPrimaryKeySelective(record);
}

@Override
public int updateByPrimaryKey(Book record) {
    return bookMapper.updateByPrimaryKey(record);
}

@Override
public List<Book> selectBooksIn(List bookIds) {
    return bookMapper.selectBooksIn(bookIds);
}

@Override
public List<Book> selectBooksLike1(String bname) {
    return bookMapper.selectBooksLike1(bname);
}

@Override
public List<Book> selectBooksLike2(String bname) {
    return bookMapper.selectBooksLike2(bname);
}

@Override
public List<Book> selectBooksLike3(String bname) {
    return bookMapper.selectBooksLike3(bname);
}

@Override
public List<Book> list1() {
    return bookMapper.list1();
}

@Override
public List<Book> list2() {
    return bookMapper.list2();
}

@Override
public Book list3(BookVo bookVo) {
    return bookMapper.list3(bookVo);
}

@Override
public List<Map> list4() {
    return bookMapper.list4();
}

@Override
public Map list5(Map book) {
    return bookMapper.list5(book);
}

@Override
public List<Map> listPager(Map map, PageBean pageBean) {
    if(pageBean != null && pageBean.isPagination()) {
        PageHelper.startPage(pageBean.getPage(), pageBean.getRows());

    }
    List<Map> list = bookMapper.listPager(map);
    if(pageBean != null && pageBean.isPagination()){
        PageInfo pageInfo = new PageInfo(list);
        System.out.println("页码:"+pageInfo.getPageNum());
        System.out.println("页大小:"+pageInfo.getPageSize());
        System.out.println("总记录:"+pageInfo.getTotal());
        pageBean.setTotal(pageInfo.getTotal()+"");
    }
    return list;
}

@Override
public List<Book> list6(BookVo bookVo) {
    return bookMapper.list6(bookVo);
}

@Override
public List<Book> list7(BookVo bookVo) {
    return bookMapper.list7(bookVo);
}

}
BookServicImplTest
package impl;

import com.mjx.mapper.BookMapper;
import com.mjx.model.Book;
import com.mjx.servic.BookServic;
import com.mjx.servic.impl.BookServicImpl;
import com.mjx.util.PageBean;
import com.mjx.util.SessionUtil;
import com.mjx.vo.BookVo;
import org.apache.ibatis.session.SqlSession;
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.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={“classpath:applicationContext-mybatis.xml”})
public class BookServicImplTest {
@Autowired
private BookServic bookServic;
@Test
public void testSelectBooksIn() {
System.out.println(“Mybatis中的foreach标签…”);
List books=this.bookServic.selectBooksIn(Arrays.asList(new Integer[]{24, 28, 29}));
books.forEach(System.out::println);
}
@Test
public void deleteByPrimaryKey() {
System.out.println(“业务方法…”);
this.bookServic.deleteByPrimaryKey(23);
}
@Test
public void testSelectByPrimaryKey() {
this.bookServic.selectByPrimaryKey(23);

}
@Test
public void selectBooksLike1() {
    System.out.println("Mybatis中的模糊查询#与$......");
    List<Book> books=this.bookServic.selectBooksLike1("%圣墟%");
    books.forEach(System.out::println);
}
@Test
public void selectBooksLike2() {
    System.out.println("Mybatis中的模糊查询#与$......");
    List<Book> books=this.bookServic.selectBooksLike2("%圣墟%");
    books.forEach(System.out::println);
}

public void selectBooksLike3() {
    System.out.println("Mybatis中的模糊查询#与$......");
    List<Book> books=this.bookServic.selectBooksLike3("圣墟");
    books.forEach(System.out::println);
}
@Test
public void list1() {
    System.out.println("五中返回类型配置......");
    List<Book> books=this.bookServic.list1();
    books.forEach(System.out::println);
}
@Test
public void list2() {
    System.out.println("五中返回类型配置......");
    List<Book> books=this.bookServic.list2();
    books.forEach(System.out::println);
}
@Test
public void list3() {
    System.out.println("五中返回类型配置......");
    BookVo bookVo=new BookVo();
    bookVo.setBookIds(Arrays.asList(new Integer[]{29}));
    System.out.println(this.bookServic.list3(bookVo));
}
@Test
public void list4() {
    System.out.println("五中返回类型配置......");
    List<Map> books=this.bookServic.list4();
    books.forEach(System.out::println);
}
@Test
public void list5() {
    System.out.println("五中返回类型配置......");
    Map map=new HashMap();
    map.put("bid",29);
    Map m= this.bookServic.list5(map);
    System.out.println(m);

}
@Test
public void list6() {
    System.out.println("五中返回类型配置......");
   BookVo vo=new BookVo();
   vo.setMin(20f);
   vo.setMax(40f);
   List<Book> books= this.bookServic.list6(vo);
    books.forEach(System.out::println);

}
@Test
public void list7() {
    System.out.println("五中返回类型配置......");
    BookVo vo=new BookVo();
    vo.setMin(20f);
    vo.setMax(40f);
    List<Book> books= this.bookServic.list7(vo);
    books.forEach(System.out::println);

}
@Test
public void listPager() {
    System.out.println("五中返回类型配置......");
    Map<String,String> map=new HashMap();
    map.put("bname","圣墟");
    PageBean pageBean=new PageBean();
    //不分页
   // pageBean.setPagination(false);
    List<Map> ms=this.bookServic.listPager(map,pageBean);
    ms.forEach(System.out::println);
}


@Before
public void setUp() throws Exception {

// System.out.println(“调用方法前使用”);
// BookServicImpl bookServic=new BookServicImpl();
// SqlSession sqlSession= SessionUtil.openSession();
// BookMapper mapper=sqlSession.getMapper(BookMapper.class);
// bookServic.setBookMapper(mapper);
// this.bookServicServic=bookServic;
}

@After
public void tearDown() throws Exception {

// System.out.println(“调用方法后使用”);
// this.sqlSession.commit();
// this.sqlSession.close();
// this.bookServic=bookServic;
}

}

二、Aop整合pagehelper插件

分页总结:

1、定义分页的方法,分页方法至少需要两个传递参数

2、分页的核心关键点

   ①、PageBean

   ②、PageHelper

3、代码的逻辑顺序

PageHelper.startPage 启动分页>正常查询业务>处理查询结果集

1、切面中需要思考的部分
pageHelper.startPage 启动分页>处理查询结果集>加入环绕通知中

2、切面类上要定义规则,只有分页方法才能进切面类

3、必须要判断*Pager是否传递了pageBean

编码阶段
1、拿到被代理的方法的参数列表,进行遍历,如果列表中包含了pagebean,给pagebean赋值

2、核心代码 : PageHelper.startPage 启动分页>正常查询业务>处理查询结果集

PagerAspert (切面)
package com.mjx.aspect;

import com.mjx.util.PageBean;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.util.List;

/**

  • @author 小李飞刀

  • @site www.javaxl.com

  • @company

  • @create 2019-09-20 11:50
    /
    @Component
    @Aspect
    public class PagerAspert {
    //切面类上要定义规则,只有分页方法才能进切面类
    @Around("execution(
    *…*Servic.*Pager(…))")
    public Object invoke(ProceedingJoinPoint args) throws Throwable {
    Object[] params = args.getArgs();
    PageBean pageBean = null;
    for (Object param : params) {
    if(param instanceof PageBean){
    pageBean = (PageBean)param;
    break;
    }
    }

     if(pageBean != null && pageBean.isPagination()) {
    
         PageHelper.startPage(pageBean.getPage(), pageBean.getRows());
     }
     Object list = args.proceed(params);
    
     if(null != pageBean && pageBean.isPagination()){
         PageInfo pageInfo = new PageInfo((List) list);
         pageBean.setTotal(pageInfo.getTotal()+"");
     }
     return list;
    

    }
    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值