一、添加相关依赖
注:spring 5.0.1.RELEASE有冲突
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文件添加支持
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>mybatis01</artifactId>
<groupId>com.aa</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../mybatis01/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ssm</artifactId>
<packaging>war</packaging>
<name>ssm Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version>
<!--添加jar包依赖-->
<!--1.spring 5.0.2.RELEASE相关-->
<spring.version>5.0.2.RELEASE</spring.version>
<!--2.mybatis相关-->
<mybatis.version>3.4.5</mybatis.version>
<!--mysql-->
<mysql.version>5.1.44</mysql.version>
<!--pagehelper分页jar依赖-->
<pagehelper.version>5.1.2</pagehelper.version>
<!--mybatis与spring集成jar依赖-->
<mybatis.spring.version>1.3.1</mybatis.spring.version>
<!--3.dbcp2连接池相关 druid-->
<commons.dbcp2.version>2.1.1</commons.dbcp2.version>
<commons.pool2.version>2.4.3</commons.pool2.version>
<!--4.log日志相关-->
<log4j2.version>2.9.1</log4j2.version>
<!--5.其他-->
<junit.version>4.12</junit.version>
<servlet.version>4.0.0</servlet.version>
<lombok.version>1.18.2</lombok.version>
</properties>
<dependencies>
<!--1.spring相关-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!--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>
</dependencies>
<build>
<finalName>ssm</finalName>
<resources>
<!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>jdbc.properties</include>
<include>*.xml</include>
</includes>
</resource>
</resources>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<dependencies>
<!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
<configuration>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
二、导入相关文件,因为要用spring整合,那么要创建applicationContent.xml 与 applicationContent-mybatis.xml
applicationContent.xml 的作用是 引入mybatis的相关配置文件
applicationContent-mybatis.xml 的作用是实现 注解式开发、引入外部jdbc配置文件、配置dbcp2数据库连接池、spring和mybatis整合、 注解式事物配置、开启动态代理六部。
1、注解式开发
<!--1. 注解式开发 --> <!-- 注解驱动 --> <context:annotation-config/> <!-- 用注解方式注入bean,并指定查找范围:com.zking.ssh2及子子孙孙包--> <context:component-scan base-package="com.zking.oa"/> |
2、引入外部jdbc配置文件
<context:property-placeholder location="classpath:jdbc.properties"/> |
3、配置dbcp2数据库连接池
|
4、spring和mybatis整合
|
5、注解式事务配置
|
6、开启动态代理
<aop:aspectj-autoproxy/>
配置完之后让idea自动创建接口、bean和配置文件
三、注解式开发
1、@Repository :将Dao类声明为Bean
2、@Service:通常作用咋业务层
3、@Constroller:通常作用在控制层,将在SpringMVC中使用
4、@Component:是一个泛化的概念,仅仅表示spring中的一个组件(Bean),可以作用在任何层次
5、@Autowired:将自动在代码上文与其匹配(默认是类型匹配)的Bean,并自动注入到响应的地方
6、@Resource:
1)@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
2)指定了name或者type则根据指定的类型去匹配bean
3)指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错
在service层创建BookService与BookServiceImpl
BookServiceImpl.xml 中用了注解@Service和@Autowired,在以前用eclipse写实现时要写set注入,这里@autowired
和@Resource相当于spring、hibernate时代中的set注入、省去了set、get方法
package com.aa.ssm.service.impl;
import com.aa.ssm.mapper.BookMapper;
import com.aa.ssm.model.Book;
import com.aa.ssm.service.BookService;
import com.aa.ssm.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author 疯子侠
* @site www.donggua.com
* @company donggua公司
* @create 2018-12-17 11:55
*/
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookMapper bookMapper;
@Override
public int insert(Book record) {
return bookMapper.insert(record);
}
@Override
public Book selectByPrimaryKey(Integer bid) {
return bookMapper.selectByPrimaryKey(bid);
}
}
四、测试:Spring Test+Junit完美组合
1、在工程的pom文件中增加spring-test的依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
2、创建BaseTestCase,作用是
为了加载整个spring 新管理的javabean,
并在该类上加上两个注解
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
五、分页
这里的分页用了aop编程是为了解决分页代码重复的问题
创建了PagerAspect类,这个类相当于环绕通知,在类里面用了@Component与@Aspect,@Around注解,通过applicationContent-mybatis.xml中的自动扫描,对项目中任何包下以Service结尾的类中以Pager结尾的方法名进行筛选。
注释已经在内容里很详细了。
package com.aa.ssm.util;
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.donggua.com
* @company donggua公司
* @create 2018-12-17 18:28
*/
@Component
@Aspect
public class PagerAspect {
/**
* 就是个环绕通知,作用在目标对象上
* @param args
* @return
* @throws Throwable
*/
//任何包下以Service结尾的包下的以Pager结尾的方法名
@Around("execution(* *..*Service.*Pager(..))")
public Object invoke(ProceedingJoinPoint args) throws Throwable{
//可获取目标方法传递过来的参数集合
Object[] params = args.getArgs();
//如果说传过来的参数有pagebean,按么进行分页
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());
// List<Book> books = bookMapper.queryByNamePager(book);
Object proceed = args.proceed(params);
if(pageBean!=null&&pageBean.isPagination()){
PageInfo pageInfo = new PageInfo((List)proceed);
pageBean.setTotal(pageInfo.getTotal()+"");
}
return proceed;
}
}
六、测试:
@Test
public void queryByNamePager() {
Book book = new Book();
PageBean pageBean = new PageBean();
pageBean.setPage(2);
book.setBname("%圣墟%");
List<Book> books = this.bookService.queryByNamePager(book, pageBean);
for (Book book1 : books) {
System.out.println(book1);
}
}
注意:
问题:@Autowired和@Resource两个注解的区别:
1)@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
2)@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了
Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。