<mapper namespace="mapper.UserMapper">(2)mapper.java接口中的方法名和mapper.xml中sql配置的id值一致
public interface UserMapper { //根据id查询用户信息 public User findUserById(String id) throws Exception; //添加用户信息 public void addUser(User user) throws Exception; //根据Id删除用户信息 public void deleteUserById(String id) throws Exception; }
public class UserMapperTest { private SqlSessionFactory sqlSessionFactory; @Before public void setUp() throws IOException{ //创建SqlSessionFactory String resource = "sqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //创建会话工厂 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindUserById() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //获取UserMapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.findUserById("4028818f47e229d70147e2742f1b0005"); System.out.println(user); sqlSession.close(); } }
<?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"> <configuration> <!-- 加载映射文件 --> <mappers> <!-- 通过package进行批量加载mapper接口 name:指定mapper接口的包名,mybatis自动扫描包下的mapper接口 需要遵循一些规范: (1)这种方式只适用于mapper代理方式 (2)mapper接口类名与mapper.xml配置文件名保存一致,且在一个目录 --> <package name="mapper"/> </mappers> </configuration>
spring配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mybatisdb?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull"/> <property name="user" value="root"/> <property name="password" value="888"/> <property name="minPoolSize" value="5" /> <property name="initialPoolSize" value="5" /> <property name="maxPoolSize" value="50" /> <property name="maxIdleTime" value="30000" /> <property name="checkoutTimeout" value="6000"/> <property name="acquireIncrement" value="5" /> <property name="acquireRetryAttempts" value="5" /> <property name="acquireRetryDelay" value="1000" /> <property name="idleConnectionTestPeriod" value="1800" /> <property name="breakAfterAcquireFailure" value="false" /> <property name="preferredTestQuery" value="select 1" /> </bean> <!-- SqlSessionFactory 原生态的mybatis里,sqlMapConfig.xml全局配置文件里配置了environments元素【配置数据源】和一些映射文件, 我们是通过SqlSessionFactoryBuilder加载读取解析全局配置文件,然后生成SqlSessionFactory会话工厂。 现在mybatis和spring进行整合,则sqlMapConfig.xml里不再需要environments,数据源的配置交给了spring来管理; SqlSessionFactoryBuilder解脱了,SqlSessionFactory会话工厂的创建交由spring来管理了 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加载mybatis配置文件(此时配置文件里面主要是一些映射文件,一些全局的配置信息) --> <property name="configLocation" value="sqlMapConfig.xml"/> <!-- 数据源 --> <property name="dataSource" ref="dataSource"/> </bean> <!-- mapper配置 针对单个mapper接口生成代理对象,之前是根据sqlSession.getMapper(UserMapper.class)生成代理对象 现在把生成代理对象的操作交过了spring来管理 --> <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <!-- 指定mapper接口 --> <property name="mapperInterface" value="mapper.UserMapper"/> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> </beans>
package mapper; import pojo.User; public interface UserMapper { //根据id查询用户信息 public User findUserById(String id) throws Exception; //添加用户信息 public void insertUser(User user) throws Exception; //根据Id删除用户信息 public void deleteUserById(String id) throws Exception; }
package mybatis; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import mapper.UserMapper; import pojo.User; public class UserMapperTest { private ApplicationContext context; @Before public void setUp() throws Exception { context = new ClassPathXmlApplicationContext("classpath:ApplicationContext.xml"); } @Test public void testFindUserById() throws Exception { //获取代理对象 UserMapper userMapper = (UserMapper) context.getBean("userMapper"); User user = userMapper.findUserById("402881bc492d83bb01492d8630ad0000"); System.out.println(user); } }
上面的测试中,我们在spring容器里中通过
<!-- mapper配置 针对单个mapper接口生成代理对象,之前是根据sqlSession.getMapper(UserMapper.class)生成代理对象 现在把生成代理对象的操作交过了spring来管理 --> <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <!-- 指定mapper接口 --> <property name="mapperInterface" value="mapper.UserMapper"/> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>这个配置去生成一个userMaper代理对象。如果有N个mapper接口,那么根据这种方法,就需要在spring配置文件里配置N个org.mybatis.spring.mapper.MapperFactoryBean
这是非常不方便的。所以我们采用org.mybatis.spring.mapper.MapperScannerConfigurer进行mapper的扫描。
<!-- mapper的批量扫描,从mapper包中扫描mapper接口,自动创建代理对象,注入到spring容器 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 通过这里配置对mapper接口的扫描,mybatis全局配置文件里对mapper的扫描就不需要配置了 。 对mapper接口的扫描和代理对象的生成都由spring来管理了 --> <property name="basePackage" value="mapper"/> <!-- 这里name使用sqlSessionFactoryBeanName而不使用sqlSessionFactory, 原因是MapperScannerConfigurer这个配置会先加载,如果使用sqlSessionFactory,那么数据源还没开始加载, MapperScannerConfigurer的加载就开始了,这会导致找不到数据源。所以需要使用sqlSessionFactoryBeanName --> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean>
<?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"> <configuration> </configuration>
最后的spring配置文件ApplicationContent.xml的内容为:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mybatisdb?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull"/> <property name="user" value="root"/> <property name="password" value="888"/> <property name="minPoolSize" value="5" /> <property name="initialPoolSize" value="5" /> <property name="maxPoolSize" value="50" /> <property name="maxIdleTime" value="30000" /> <property name="checkoutTimeout" value="6000"/> <property name="acquireIncrement" value="5" /> <property name="acquireRetryAttempts" value="5" /> <property name="acquireRetryDelay" value="1000" /> <property name="idleConnectionTestPeriod" value="1800" /> <property name="breakAfterAcquireFailure" value="false" /> <property name="preferredTestQuery" value="select 1" /> </bean> <!-- SqlSessionFactory 原生态的mybatis里,sqlMapConfig.xml全局配置文件里配置了environments元素【配置数据源】和一些映射文件, 我们是通过SqlSessionFactoryBuilder加载读取解析全局配置文件,然后生成SqlSessionFactory会话工厂。 现在mybatis和spring进行整合,则sqlMapConfig.xml里不再需要environments,数据源的配置交给了spring来管理; SqlSessionFactoryBuilder解脱了,SqlSessionFactory会话工厂的创建交由spring来管理了 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加载mybatis配置文件(此时配置文件里面主要是一些映射文件,一些全局的配置信息) 目前这里没有什么内容需要加载,因为别名的设置都由下面的typeAliasesPackage来扫描配置完成 而对mapper接口的扫描,则通过MapperScannerConfigurer中的basePackage来完成了 --> <!-- <property name="configLocation" value="sqlMapConfig.xml"/> --> <!-- 扫描某包下的实体类,别名设置为类名(首字母大小写都可以) --> <property name="typeAliasesPackage" value="pojo"/> <!-- 数据源 --> <property name="dataSource" ref="dataSource"/> </bean> <!-- mapper的批量扫描,从mapper包中扫描mapper接口,自动创建代理对象,注入到spring容器 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 通过这里配置对mapper接口的扫描,mybatis全局配置文件里对mapper的扫描就不需要配置了 。 对mapper接口的扫描和代理对象的生成都由spring来管理了 --> <property name="basePackage" value="mapper"/> <!-- 这里name使用sqlSessionFactoryBeanName而不使用sqlSessionFactory, 原因是MapperScannerConfigurer这个配置会先加载,如果使用sqlSessionFactory,那么数据源还没开始加载, MapperScannerConfigurer的加载就开始了,这会导致找不到数据源。所以需要使用sqlSessionFactoryBeanName --> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> </beans>