为什么要集成MyBatis
每次都需要在MyBatis的核心配置文件中写Mapper文件的路径,如果Mapper文件非常多,需要手动的一个一个写
<!-- 映射文件 -->
<mappers>
<mapper resource="mappers/person.xml"/>
<mapper resource="mappers/xxxx.xml"/>
<mapper resource="mappers/xxxx.xml"/>
</mappers>
每次做数据库的查询操作都需要拿到sqlSession对象,然后再调用getMapper方法拿到Dao代理对象执行操作,如果能直接拿到Dao代理对象就好了,并且如果进行数据库的插入、修改、删除操作还要手动的提交事务
//使用该方式生成Dao接口的代理对象
CustomerDaoInterface customerDao = session.getMapper(CustomerDaoInterface.class);
customerDao.add(customers1);
session.commit();
需要提前创建好sqlSessionFactory工厂对象,。。。。。。。等等
集成所需的依赖
Spring的依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
MyBatis的依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.22</version>
</dependency>
Spring整好MyBatis所需的依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
其它日志、单元测试等(可选) ```xml
ch.qos.logback logback-classic 1.2.3
<a name="u6kvy"></a>
## Spring配置文件
以后我们不再需要关系MyBatis的配置文件了,统一使用Spring的配置文件来管理MyBatis的配置文件。
- 数据源
```xml
<!-- 数据源(Druid) 当然可以使用其的数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/customer_test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
创建SqlSessionFactory
<!-- 创建SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 这个包底下的类会自动设置别名(一般是领域模型) -->
<property name="typeAliasesPackage" value="com.lff.domain"/>
<!-- 映射文件的位置 -->
<property name="mapperLocations">
<array>
<value>mappers/*.xml</value>
</array>
</property>
</bean>
注意上面别名的配置,在自己的项目要修改
扫描dao
<!-- 扫描dao -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 设置SqlSessionFactoryBean的id -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 设置dao的包 -->
<property name="basePackage" value="com.lff.dao"/>
</bean>
具体外界使用
外界使用先创建好对应的Mapper文件,Dao、模型
模型:
package com.lff.domain;
public class Customer {
private Integer custId;
private String custName;
private String custAddress;
private String custCity;
private String custState;
private String custZip;
private String custCountry;
private String custContact;
private String custEmail;
//setter and getter
}
Dao
package com.lff.dao;
import com.lff.domain.Customer;
import java.util.List;
public interface CustomerDao {
public List<Customer> list();
}
mapper
<?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.lff.dao.CustomerDao">
<select id="list" resultMap="customerDomain">
SELECT * FROM Customers
</select>
<resultMap id="customerDomain" type="com.lff.domain.Customer">
<result property="custName" column="cust_name" />
<result property="custCity" column="cust_city" />
</resultMap>
<delete id="delete" parameterType="int">
DELETE FROM Customers WHERE cust_id = #{id}
</delete>
</mapper>
外界使用:
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerDao customerDao = ctx.getBean("customerDao", CustomerDao.class);
List<Customer> list = customerDao.list();
System.out.println(customerDao.list());
因为在配置文件里面已经扫描到项目中的所有Dao啦,所以可以直接使用以下代码取到Dao
ctx.getBean("customerDao", CustomerDao.class);
bean的id是Dao的小驼峰形式,比如com.lff.Dao.CustomerDao的id是customerDao
拿到Dao后执行Dao相关的数据库操作,是不是非常简单啦哈哈
注解方式集成
我们可以不在Spring配置文件里面配置下面内容
<!-- 数据源(Druid) 当然可以使用其的数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/customer_test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- 创建SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 这个包底下的类会自动设置别名(一般是领域模型) -->
<property name="typeAliasesPackage" value="com.lff.domain"/>
<!-- 映射文件的位置 -->
<property name="mapperLocations">
<array>
<value>mappers/*.xml</value>
</array>
</property>
</bean>
<!-- 扫描dao -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 设置SqlSessionFactoryBean的id -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 设置dao的包 -->
<property name="basePackage" value="com.lff.dao"/>
</bean>
上面的内容完全可以使用注解的方式替代
思路很简单,XML配置的内容会创建对应的对象放到IOC容器里面,我们也只要创建对应的对象放到IOC容器里面就可以了。
@Configuration
@MapperScan("com.lff.dao")//扫描dao层,生成动态代理,相当于写了MapperScannerConfigurer类的Bean
@EnableTransactionManagement //事务管理,相当于写<tx:annotation-driven transaction-manager="transactionManager" />
public class MyBatisConfig {
//配置数据源
@Bean
public DataSource dataSource() {
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/customer_test");
ds.setUsername("root");
ds.setPassword("root");
return ds;
}
//配置核心Mybatis核心工厂
@Bean
public SqlSessionFactoryBean sqlSessionFactory() throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource());
bean.setTypeAliasesPackage("com.lff.domain");//设置实体类别名
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
bean.setMapperLocations(resolver.getResources("classpath:/mappers/*.xml"));//配置Mapper映射文件的路径
return bean;
}
//配置事务管理器,替换配置里面的DataSourceTransactionManager
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource ds){
DataSourceTransactionManager dm = new DataSourceTransactionManager();
dm.setDataSource(ds);
return dm;
}
}