Spring整合任何第三方资源套路基本一致。
Spring是一个对象容器
整合MyBatis应该交给Spring的对象是?
SqlSessionFactoryBuilder(临时对象),
SqlSessionFactory(单例),
SqlSession,Mapper
添加依赖
org.springframework spring-context 5.3.15 org.springframework spring-jdbc 5.2.9.RELEASE mysql mysql-connector-java 5.1.46 org.mybatis mybatis 3.5.6 junit junit 4.13 test
添加一个中间依赖
org.mybatis mybatis-spring 2.0.4
将数据源交给Spring管理,德鲁伊连接池,所谓配置连接池,就是配置一个数据源对象
添加druid的依赖
com.alibaba druid 1.1.10
在spring的配置文件中,解注册一个Druid的数据源
配置文件:
或者利用注解配置:
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;import javax.sql.DataSource;@Configuration
@PropertySource(value = "config/db.properties")
public class DataSourceConfig {@Beanpublic DataSource dataSource(){return new DruidDataSource();}
}
其中配置文件resource/config/db.properties格式如下:
druid.url=jdbc:mysql://ip:3306/test?useUnicode=true&characterEncoding=UTF-8
druid.driver=com.mysql.jdbc.Driver
druid.username=username
druid.password=password
将SqlSessionFactory交给Spring管理
将MyBatis完全托管给Spring,所以MyBatis配置文件中的所有内容全部删除,只留根节点:
在Spring的配置文件中注册一个SqlSessionFactory
测试类
@Testpublic void test(){ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");SqlSessionFactory sqlSessionFactory=ac.getBean(SqlSessionFactory.class);SqlSession sqlSession=sqlSessionFactory.openSession();List
代理mapper的配置
MyBatis可以根据接口生成代理Mapper,Spring整合MyBatis之后一样可以生成代理Mapper,
定义Mapper接口
public interface UserRepository {public List findAll();
}
给这个Mapper接口接口写一个对应的配置文件
配置文件中的namespace必须和Mapper接口的全限定类名一致,将配置文件与Mapper接口放在同一个包中
修改SqlSessionFactory中的映射文件的配置内容
测试类
@Testpublic void test(){ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");//从容器中获取对应的Mapper接口对象UserRepository userRepository=ac.getBean(UserRepository.class);List users=userRepository.findAll();System.out.println(users);}
代理Mapper注意的几个细节
maven生成的执行文件中没有对应的映射文件会报错,原因是maven的工程结构中默认所有的资源文件(.properties,xml,ymal)等都是在src/main/resources下,所以当资源文件存在于src/main/java下时,maven不会将这些文件打包到输出目录中
调整方法:在pom.xml中加入
src/main/java **/*.xml src/main/resources **/*
添加一个著配置类 AppConfig
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan("org.example")
@MapperScan("org.example.repository")//配置映射文件和接口所在的包
public class AppConfig {
}
DataSource和SqlSessionFactory
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;import javax.sql.DataSource;@Configuration
@PropertySource(value = "config/db.properties")
public class DataSourceConfig {@Value("${druid.username}")private String username;@Value("${druid.password}")private String password;@Value("${druid.url}")private String url;@Value("${druid.driver}")private String driverClassName;@Beanpublic DataSource dataSource(){DruidDataSource dataSource=new DruidDataSource();dataSource.setUsername(username);dataSource.setPassword(password);dataSource.setUrl(url);dataSource.setDriverClassName(driverClassName);return dataSource;}@Beanpublic SqlSessionFactory sqlSessionFactory() throws Exception{SqlSessionFactoryBean sqlSessionFactoryBean=new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource());sqlSessionFactoryBean.setTypeHandlersPackage("org.example.entity");return sqlSessionFactoryBean.getObject();}
}
测试类
@Testpublic void test(){ApplicationContext ac=new AnnotationConfigApplicationContext(AppConfig.class);UserRepository userRepository=ac.getBean(UserRepository.class);System.out.println(userRepository.findAll());}