Spring—mybatis

一、 Spring整合MyBatis框架
  1. 将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()"):环绕通知
  1. 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);
        }
    }
}