spring整合mybatis
一、Mybatis实现
在spring整合mybatis之前我们回顾一下mybatis的实现步骤。
- mybatis配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--mybatis的主配置文件-->
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--配置数据源信息 default指的是选择数据源-->
<environments default="mysql">
<environment id="mysql">
<!--配置事务类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源信息-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/study-demo"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--配置映射文件mapper文件地址-->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
<mapper resource="mapper/NetCourseMapper.xml"/>
</mappers>
</configuration>
- 实体类
@Data
public class User {
private Integer id;
private String userName;
private Integer age;
}
- mapper接口
public interface NetCourseMapper {
int insertCourse(NetCourse netCourse);
List<NetCourse> findAll();
}
- mapper映射xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tencent.dao.mapper.UserMapper">
<resultMap id="BaseResultMapper" type="com.tencent.dao.entity.User">
<id column="id" jdbcType="INTEGER" property="id"/>
<result column="username" jdbcType="VARCHAR" property="userName"/>
<result column="age" jdbcType="INTEGER" property="age"/>
</resultMap>
<insert id="insertUser">
insert into user(user_name,age) values(#{username},#{age})
</insert>
<select id="findAll" resultMap="BaseResultMapper">
select * from user
</select>
<select id="findById" resultMap="BaseResultMapper">
select * from user where id = #{id}
</select>
</mapper>
- 执行方法
//1.加载mybatis配置文件到内存
InputStream in = Resources.getResourceAsStream("MybatisConfig.xml");
//2.创建工厂构建者
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.根据配置文件构建SqlSession工厂
SqlSessionFactory sqlSessionFactory = builder.build(in);
//4.构建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//5.创建代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//6.执行方法
List<User> users = userMapper.findAll();
二、Spring整合Mybatis的三个关键点
- 将Mybatis的
DataSource
交给Spring IoC
来管理,使用第三方数据库连接池(Druid、C3P0等)
代替MyBatis内置的数据库连接池。 - 将MyBatis的
SqlSessionFactory
交给Spring IoC
容器创建并管理,使用spring-mybati
整合jar包提供的SqlSessionFactoryBean
来替代项目中的MyBatis中的MyBatisUtils工具。 - 将MyBatis的
接口代理方式生成实现类交给Spring IoC容器创建并管理
。
三、整合步骤
声明,这里是基于spring纯注解的方式进行整合
3.1 导入jar包
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.19.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.14</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.22</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.9</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.1.2</version>
</dependency>
</dependencies>
3.2 编写spring配置文件ApplicationConfig
@Configuration
@ComponentScan("com.tencent.*")
//@MapperScan("com.tencent.dao.mapper") 这里不使用注解是因为使用MapperScannerConfigurer对象实现了
public class ApplicationConfig{
/**
* 配置数据源信息,交给spring来管理
* @return
*/
@Bean
public DataSource dataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
druidDataSource.setUrl("jdbc:mysql://localhost:3306/study-demo");
druidDataSource.setUsername("root");
druidDataSource.setPassword("root");
return druidDataSource;
}
/**
* 创建SqlSessionFactory对象,交给spring管理
* @param dataSource
* @return
* @throws Exception
*/
@Bean
public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
//配置数据源
sessionFactory.setDataSource(dataSource);
//指定mapper映射文件地址
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
//下划线转换驼峰
sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return sessionFactory.getObject();
}
/**
* 配置包扫描地址,或者在配置类上使用@MapperScan注解,并且指定扫描路径,如@MapperScan("com.tencent.dao.mapper")
* @return
*/
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.tencent.dao.mapper");
return mapperScannerConfigurer;
}
}
3.3 编写实体类
@Data
public class User {
private Integer id;
private String userName;
private Integer age;
}
3.4 编写mapper接口
@Repository
public interface NetCourseMapper {
int insertCourse(NetCourse netCourse);
List<NetCourse> findAll();
}
3.5 编写servie
@Service
public class UserService {
@Autowired
UserMapper userMapper;
public List<User> findAll(){
return userMapper.findAll();
}
}
3.6 编写测试类,为了方便演示,这里使用main方法对service进行调用
public static void main(String[] args) throws IOException {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationConfig.class);
UserService userService = applicationContext.getBean("userService", UserService.class);
List<User> users= userService.findAll();
System.out.println(users);
}