注: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文件添加支持
pom依赖代码:
4.0.0
war
ssm
com.yj
ssm
1.0-SNAPSHOT
UTF-8
1.8
1.8
3.7.0
5.0.2.RELEASE
3.4.5
5.1.44
5.1.2
1.3.1
2.1.1
2.4.3
2.9.1
4.12
4.0.0
1.18.2
src/main/java
**/*.xml
src/main/resources
jdbc.properties
*.xml
org.apache.maven.plugins
maven-compiler-plugin
${maven.compiler.plugin.version}
${maven.compiler.target}
${project.build.sourceEncoding}
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.2
mysql
mysql-connector-java
${mysql.version}
true
org.mortbay.jetty
maven-jetty-plugin
6.1.7
8888
30000
${project.build.directory}/${pom.artifactId}-${pom.version}
/
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}
org.mybatis
mybatis
${mybatis.version}
mysql
mysql-connector-java
${mysql.version}
com.github.pagehelper
pagehelper
${pagehelper.version}
org.mybatis
mybatis-spring
${mybatis.spring.version}
org.apache.commons
commons-dbcp2
${commons.dbcp2.version}
org.apache.commons
commons-pool2
${commons.pool2.version}
org.apache.logging.log4j
log4j-core
${log4j2.version}
org.apache.logging.log4j
log4j-api
${log4j2.version}
org.apache.logging.log4j
log4j-web
${log4j2.version}
junit
junit
${junit.version}
test
javax.servlet
javax.servlet-api
${servlet.version}
provided
org.projectlombok
lombok
${lombok.version}
provided
2.1 注解式开发
开启注解
context:annotation-config/
2.2 引入外部jdbc配置文件
2.3 配置dbcp2数据库连接池
详见“dbcp2.txt”:
2.4 spring和mybatis整合
详见“spring与mybatis整合.txt”
2.5 注解式事物配置
配置事务管理(环绕通知) 有关数据库操作的开启、提交操作都是在环绕在数据库操作的前后
切面
excution(* *..*Biz.*(..))
2.6 开启动态代理
aop:aspectj-autoproxy/
文件:
helperDialect=mysql
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123
/root/workspace/lucenedemo/logs
/root/workspace/lucenedemo/logs/error
/root/workspace/lucenedemo/logs/warn
%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n
@Repository:将DAO类声明为Bean
@Service:通常作用在业务层
@Constroller:通常作用在控制层,将在Spring MVC中使用
@Component:是一个泛化的概念,仅仅表示spring中的一个组件(Bean),可以作用在任何层次
@Scope:模式声明(singleton|prototype)
@Autowired:将自动在代码上下文与其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方
@Resource:
1)@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
2)指定了name或者type则根据指定的类型去匹配bean
3)指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错
问题:@Autowired和@Resource两个注解的区别:
相当于之前spring、hibernate时代中的set注入,省去set、get方法
1)@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
2)@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了
Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。
@Transactional
注:个人感觉注解式事务比以前的声明式事务更加麻烦,要写的东西更多
注:工具类在上一篇博客已经发了,所以不发了
package com.yj.mapper;
import com.yj.model.Book;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
@Repository
public interface BookMapper {
int deleteByPrimaryKey(Integer bid);
int insert(Book record);
int insertSelective(Book record);
Book selectByPrimaryKey(Integer bid);
int updateByPrimaryKeySelective(Book record);
int updateByPrimaryKey(Book record);
List
bid, bname, price
delete from t_mvc_book
where bid = #{bid,jdbcType=INTEGER}
insert into t_mvc_book (bid, bname, price
)
values (#{bid,jdbcType=INTEGER}, #{bname,jdbcType=VARCHAR}, #{price,jdbcType=REAL}
)
insert into t_mvc_book
bid,
bname,
price,
#{bid,jdbcType=INTEGER},
#{bname,jdbcType=VARCHAR},
#{price,jdbcType=REAL},
update t_mvc_book
bname = #{bname,jdbcType=VARCHAR},
price = #{price,jdbcType=REAL},
where bid = #{bid,jdbcType=INTEGER}
update t_mvc_book
set bname = #{bname,jdbcType=VARCHAR},
price = #{price,jdbcType=REAL}
where bid = #{bid,jdbcType=INTEGER}
实体类跳过。
package com.yj.service;
import com.yj.model.Book;
import com.yj.util.PageBean;
import java.util.List;
import java.util.Map;
/**
* @author 仰望天空
* @site
* @company xxx公司
* @create 2019-09-24 19:41
*/
public interface BookService {
int deleteByPrimaryKey(Integer bid);
int insert(Book record);
int insertSelective(Book record);
Book selectByPrimaryKey(Integer bid);
int updateByPrimaryKeySelective(Book record);
int updateByPrimaryKey(Book record);
List
package com.yj.service.Impl;
import com.yj.mapper.BookMapper;
import com.yj.model.Book;
import com.yj.service.BookService;
import com.yj.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* @author 仰望天空
* @site
* @company xxx公司
* @create 2019-09-24 19:43
*/
@Service
public class BookServiceImpl implements BookService {
@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.insertSelective(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 aaaa(Map map, PageBean pageBean) {
return bookMapper.aaaa(map);
}
@Override
public List listPager(Map map, PageBean pageBean) {
return bookMapper.aaaa(map);
}
}
package com.yj;
import com.yj.model.Book;
import com.yj.util.PageBean;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author 仰望天空
* @site
* @company xxx公司
* @create 2019-09-24 19:39
* 放一些公有代码
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class SpringBaseTest {
protected Book book;
protected PageBean pageBean;
@Before
public void init(){
book = new Book();
pageBean = new PageBean();
}
}
BookServiceImplTest
package com.yj.service.Impl;
import com.yj.SpringBaseTest;
import com.yj.model.Book;
import com.yj.service.BookService;
import com.yj.util.StringUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author 仰望天空
* @site
* @company xxx公司
* @create 2019-09-24 20:17
*/
public class BookServiceImplTest extends SpringBaseTest {
@Autowired
private BookService bookService;
@Test
public void insert() {
book.setBid(10006);
book.setBname("aaa");
book.setPrice(100f);
this.bookService.insert(book);
}
@Test
public void selectByPrimaryKey() {
Book b = this.bookService.selectByPrimaryKey(10006);
System.out.println(b);
}
@Test
public void aaaa() {//不分页
Map map = new HashMap();
map.put("bname", StringUtils.toLikeStr("圣墟"));
List aaaa = this.bookService.aaaa(map, pageBean);
for (Map m : aaaa) {
System.out.println(m);
}
}
@Test
public void listPager() {//分页
Map map = new HashMap();
map.put("bname", StringUtils.toLikeStr("圣墟"));
pageBean.setPage(3);
List aaaa = this.bookService.listPager(map, pageBean);
for (Map m : aaaa) {
System.out.println(m);
}
}
}
package com.yj;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.yj.util.PageBean;
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
* @company xxx公司
* @create 2019-09-24 20:45
*
* 思路:
* 处理* *..*Service.*Pager(..)这个方法,只要调用这个方法,就能够达到分页的效果
*
* PageHelper.start();
* 调用目标方法之前
* 处理结果集
*
* .Pager(map,pagebean)
* *pager(map,bname)
*/
@Component
@Aspect
public class PagerAspect {
//定义切入点
@Around("execution(* *..*Service.*Pager(..))")
public Object invoke(ProceedingJoinPoint args) throws Throwable{
//判断符合条件的方法中是否包含pager的方法
Object[] params = args.getArgs();
PageBean pageBean = null;
for (Object param : params) {
if(param instanceof PageBean){
pageBean = (PageBean)param;
}
}
if(pageBean !=null && pageBean.isPagination()){
PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
}
Object list = args.proceed(params);
if(pageBean !=null && pageBean.isPagination()){
PageInfo pageInfo = new PageInfo((List )list);
pageBean.setTotal(pageInfo.getTotal()+"");
}
return null;
}
}