无xml实现spring + mybatis

spring + mybatis整合,在现在看来,已经是个古老的话题了。
    但是,网上关于只有spring + mybatis两种框架整合的教程却很少,大部分都是SSM的教程。 
    更不要说,无xml实现的spring + mybatis整合。
很多人看到这句话,会想,那这特喵的跟Spring Boot有毛线区别?
    对,这跟Spring Boot一样,都是无xml整合。但是不一样的是,它很精简。
    它是我为了完成在jar中独立运行而搭建的。昨天搭了纯mybatis的。(PS:用main方法就能调用的方式)。

好吧,废话太多,现在进入正题:
老规矩,项目结构:

项目结构

这个类是重点,我在里面写了点注释。
你也可以下载源码自己运行。源码在码云上(点我,快点我㊣)

【更新】添加tx.mybatis支持,避免写通用的CRUD

package com.spring.build;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;

//import org.mybatis.spring.mapper.MapperScannerConfigurer;
import tk.mybatis.spring.mapper.MapperScannerConfigurer;
//这里换成tk的MapperScannerConfigurer

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.yaml.snakeyaml.Yaml;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.spring.build.entity.User;
import com.spring.build.service.IBaseService;


/**
 * Hello world!
 *
 */
@Configuration
@ComponentScan(basePackages = "com.spring.build.service.impl")
public class App {

    //private static final String[] mapperLocations = {"com.spring.build.mapper"};
    private static final String[] mapperLocations = {"tk.mybatis.mapper.common.base", "com.spring.build.mapper"};
    //增加tk的基础mapper

    private static final String configPath = "config" + File.separator + "qyFramework.yml";

    @Bean
    public DataSource druidDataSource() throws Exception {
        Map<String, Object> configs = loadYaml();
        @SuppressWarnings("unchecked")
        Map<String, Object> druidConfig = (Map<String, Object>) configs.get("druid");
        Map<String, String> properties  = valueToStr(druidConfig);
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
        return dataSource;
    }

    @Bean //将mybatis的所有mapper扫描出来,变成bean
    public MapperScannerConfigurer mapperScanner(SqlSessionFactoryBean sqlSessionFactory) {
        MapperScannerConfigurer mapperScanner = new MapperScannerConfigurer();
        for (String mapperLocation : mapperLocations) {
            mapperScanner.setBasePackage(mapperLocation);
        }
        mapperScanner.setSqlSessionFactoryBeanName("sqlSessionFactory");



        //新增配置:由于项目不需要驼峰转下划线,所以,配置style:normal
        Properties properties = new Properties();
        properties.put("style", "normal");//驼峰不转下划线
        mapperScanner.setProperties(properties);

        return mapperScanner;
    }

    @Bean(name = "mysqlTransactionManager")  //spring接管mybatis的所有mapper bean
    public DataSourceTransactionManager mysqlManager(DataSource dataSource) {  
        return new DataSourceTransactionManager(dataSource);  
    }  

    @Bean //spring-mybatis SqlSessionFactoryBean
            //这里的Configuration里配置mapperLocations,
            //是mybatis扫描mapper和mapper.xml。
            //上面的那个MapperScannerConfigurer mapperScanner是扫描mapper,
            //然后提供给spring.两种是有差别的。
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) throws IOException {
        SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource);
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        for (String mapperLocation : mapperLocations) {
            configuration.addMappers(mapperLocation);
        }
        sqlSessionFactory.setConfiguration(configuration);
        return sqlSessionFactory;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(SqlSessionFactoryBean sqlSessionFactoryBean) throws Exception {
        return sqlSessionFactoryBean.getObject();
    }

    @SuppressWarnings("resource") //我把测试用例放在了这里。你可以在任何地方执行这一段。
    //打包成jar后,在其他包里也行.
    public static void main( String[] args ) {
        ApplicationContext context = new AnnotationConfigApplicationContext(App.class);
        IBaseService service = context.getBean(IBaseService.class);
        User user = service.queryUserById(10000l);
        System.out.println(user);
    }

    private static Map<String, String> valueToStr(Map<String, Object> map) {
        Map<String, String> stringMap = new HashMap<String, String>();
        for (Entry<String, Object> entry : map.entrySet()) {
            String value = entry.getValue().toString();
            stringMap.put(entry.getKey(), value);
        }
        return stringMap;
    }

    @SuppressWarnings("unchecked")//加载yml文件
    private static Map<String, Object> loadYaml() {
        ClassLoader loader = App.class.getClassLoader();
        URL rootURL = loader.getResource("");
        String rootPath = rootURL.getPath();
        File config = new File(rootPath + File.separator + configPath);
        FileInputStream input = null;
        Map<String, Object> map = null;
        try {
            input = new FileInputStream(config);
            Yaml yaml = new Yaml();
            map = (Map<String, Object>)yaml.load(input);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                input.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return map;
    } 
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值