为什么要集成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 mapperPUBLIC "-//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 {//配置数据源@Beanpublic 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核心工厂@Beanpublic 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@Beanpublic DataSourceTransactionManager dataSourceTransactionManager(DataSource ds){DataSourceTransactionManager dm = new DataSourceTransactionManager();dm.setDataSource(ds);return dm;}}
