一、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
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;
}
}