Spring—mybatis
一、 Spring整合MyBatis框架
- 将MyBatis和Spring的相关依赖导入到项目
Spring-context
Aspectj-weaver
Mybatis核心包
Mybatis-spring(MyBatis与spring的整合包)
Spring-jdbc
Spring-tx(Spring事务管理包)
Mysql驱动包
Druid
Log4j
3.常用注解
@Configuration:标注类为一个配置类
@Bean:Spring受管对象注解,该注解只能在配置类的方法中使用
@ComponentScan:指定扫描组件的包,将指定包下的带有@Compont注解的类,自动创建对象并交由spring进行管理
@Component("userService"):Bean组件注解,带有该注解的类Spring会自动创建对象并管理该对象
@Service("userService")//等同于@Component注解,主要应用于服务层是@Component注解的别名(语义注解)
@Repository("userDao")//等同于@Component注解,主要应用于持久层,是@Component注解的别名(语义注解)
@Autowired:自动装配(自动注入),会将spring管理对象自动注入到指定的属性中,默认根据类型装配,当同类型的对象有多个时在根据对象名装配
@Lazy:标注类使用懒加载模式创建对象
@Scope("prototype"):指定对象的存活期(单例Singlten,原型prototype)如果设置为prototype表示每次从spring容器中获取都会创建一个对象
@PostConstruct:当前方法为初始化方法,在构造器执行后自动执行
@PreDestroy:当前方法在对象销毁前执行
AOP注解:
@Aspect:使用该注解后该类就成了一个切面类
@EnableAspectJAutoProxy:启用springAop自动代理功能
@Pointcut("execution(* com.jiazhong.aop.service..*.*(..))"):定义切入点表达式
@Before("myPointcut()"):前置通知
@AfterReturning("myPointcut()"):后置通知
@AfterThrowing("myPointcut()"):异常通知
@After("myPointcut()"):最终通知
@Around("myPointcut()"):环绕通知
- Mybatis与Spring整合后,MyBatis的核心配置文件由Spring进行配置和管理
@Configuration
@ComponentScan("com.jiazhong.sm.service")//组件扫描器
@MapperScan("com.jiazhong.sm.dao")//映射器扫描器
public class AppConfig {
/***
* 配置数据库连接池
* @return
*/
@Bean
public DataSource dataSource(){
//创建DruidDataSource
DruidDataSource dataSource = new DruidDataSource();
//设置相关属性
//数据库连接属性
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/tbl_goods");
dataSource.setUsername("root");
dataSource.setPassword("root");
//数据库连接池属性
dataSource.setInitialSize(3);
dataSource.setMaxActive(5);
dataSource.setMaxWait(1000);
dataSource.setMinIdle(3);
return dataSource;
}
@Bean
@Autowired//注入datasource
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
//如果不使用pageHelper插件忽略 此内容
--------------------配置pageHelper插件 开始-----------------------------------
//配置pageHelper插件
//创建PageHelper拦截对象
PageInterceptor pageInterceptor = new PageInterceptor();
//属性资源对象,等同于资源文件 使用key-map的形式保存数据
Properties properties = new Properties();
properties.setProperty("heplerDialect","mysql");//配置方言->指定所使用的数据库
//分页合理化设置
properties.setProperty("reasonable","true");
//将pageHelper注入相关属性
pageInterceptor.setProperties(properties);
//将pageHelper拦截器设置到sqlSessionFactoryBean对象中
factoryBean.setPlugins(pageInterceptor);
--------------------配置pageHelper插件 结束-------------------------------
return factoryBean.getObject();
}
/**
* 配置事务管理器
*/
@Bean
@Autowired
public DataSourceTransactionManager txManager(DataSource dataSource){
DataSourceTransactionManager txManager = new DataSourceTransactionManager();
txManager.setDataSource(dataSource);
return txManager;
}
}
serviceDaoImpl:整合spring—mybatis 使用PageHelper插件
@Service("goodsService")
public class GoodsServiceImpl implements GoodsService {
@Autowired
private GoodsDao goodsDao;
public void addGoods(Goods goods) {
System.out.println("执行addGoods....");
goodsDao.addGoods(goods);
}
public Map<String,Object> queryGoods() {
/**
* PageHelper分页插件的实现
* 需要三步实现:
* 1.初始化PageHelper环境
* 2.查询数据列表
* 3.将数据列表封装到PageInfo对象中
* 以上三步不能分割,顺序不能颠倒
*/
PageParams pageParams = new PageParams();
pageParams.setPageNum(2);//设置当前页
pageParams.setPageSize(10);//设置每页显示的记录数
//1.初始化PageHelper环境
PageHelper.startPage(pageParams);
//2.查询数据列表
List<Goods> goodsList = goodsDao.queryGoods();
//3.将数据列表封装到PageInfo对象中
PageInfo pageInfo = new PageInfo(goodsList);
long total = pageInfo.getTotal();//获得总记录数
List<Goods> goodsList1 = pageInfo.getList();
Map<String,Object> map = new HashMap<String,Object>();
map.put("total",total);
map.put("goodsList",goodsList1);
return map;
}
}
测试方法:
public class GoodsServiceTest {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
GoodsService goodsService = (GoodsService) context.getBean("goodsService");
// Goods goods = new Goods();
// goods.setG_name("打火机x");
// goods.setG_price(10.0);
// goods.setG_date(new Date());
// goodsService.addGoods(goods);//添加方法
Map<String,Object> map = goodsService.queryGoods();
System.out.println("总记录数:"+map.get("total"));
//获取数据
List<Goods> goodsList = (List<Goods>) map.get("goodsList");
for(Goods goods : goodsList){
System.out.println(goods);
}
}
}