现有需求:要求查询user表的所有用户信息。
jar包准备:
依照数据库的表写好user实体类,略。
dao层书写:
准备UserMapper.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.bdqn.dao.UserMapper">
<select id="queryUserList" resultType="user">
select * from easybuy_user
</select>
</mapper>
书写接口:
public interface UserMapper {
public List<User>queryUserList();
}
service层:
首先是UserService接口:
public interface UserService {
public List<User>getUserList();
}
它的实现类,UserServiceImpl:
public class UserServiceImpl implements UserService {
private UserMapper userDao;
public UserMapper getUserDao() {
return userDao;
}
public void setUserDao(UserMapper userDao) {
this.userDao = userDao;
}
public List<User> getUserList() {
// TODO Auto-generated method stub
return userDao.queryUserList();
}
}
它有一个属性,UserMapper。
创建resource文件夹,准备配置文件,数据库配置文件,database.properties。mybatis的配置文件Mybatis-config.xml,spring的配置文件ApplicationContext.xml。
Mybatis-config.xml:
<?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>
<typeAliases>
<package name ="com.bdqn.entity" />
</typeAliases>
<mappers>
<mapper resource="com/bdqn/dao/UserMapper.xml"/>
</mappers>
</configuration>
方式一:在dao层增加UserMapperImpl实现类。这种方式符合我们以前的思维方式,通过创建实现类来创建对象,因为接口是不能实例化的,而我们又需要在service层引用该实例对象。
UserMapperImpl:
public class UserMapperImpl implements UserMapper {
private SqlSessionTemplate sqlSession;
public SqlSessionTemplate getSqlSession() {
return sqlSession;
}
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
public List<User> queryUserList() {
// TODO Auto-generated method stub
List<User> queryUserList = sqlSession.getMapper(UserMapper.class).queryUserList();
return queryUserList;
}
}
sqlSessionTemplate负责管理MyBatis的SqlSession,调用SQL映射语句,实现对数据库的访问。由mybatis-spring.1.2.0.jar提供。可以理解是sqlSession。
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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 导入数据库配置文件 -->
<context:property-placeholder location="classpath:database.properties"/>
<!-- dbcp数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:Mybatis-config.xml"></property>
</bean>
<!-- sqlSession -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
</bean>
<bean id="userDao" class="com.bdqn.dao.UserMapperImpl">
<property name="sqlSession" ref="sqlSession"></property>
</bean>
<bean id="userService" class="com.bdqn.service.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
sqlSessionFactoryBean由mybatis-spring.1.2.0.jar提供。可以理解是sqlSessionFactory。
这种方式不会采用,通过创建实现类多次一举。
方式二:
采用数据映射器(MapperFactoryBean)的方式完成对数据库操作
根据Mapper接口获取Mapper对象,它封装了原有的SqlSession.getMapper()功能的实现
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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 导入数据库配置文件 -->
<context:property-placeholder location="classpath:database.properties"/>
<!-- dbcp数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:Mybatis-config.xml"></property>
</bean>
<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.bdqn.dao.UserMapper"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
<bean id="userService" class="com.bdqn.service.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
不用创建接口的实现类。因为使用MapperFactoryBean创建的代理类实现了 UserMapper 接口,并且注入到应用程序中。它有两个属性需要注入:1.mapperInterface,指定映射器,只能是接口类型。2.sqlSessionFactory,注入SqlSessionFactory以提供SqlSessionTemplate实例。因此原先的如下代码:
<!-- sqlSession -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
</bean>
<bean id="userDao" class="com.bdqn.dao.UserMapperImpl">
<property name="sqlSession" ref="sqlSession"></property>
</bean>
就可以删除了。
方式三:
MapperScannerConfigurer
采用方式二有一个问题:若映射器很多的话,相应的配置项也会很多。
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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 导入数据库配置文件 -->
<context:property-placeholder location="classpath:database.properties"/>
<!-- dbcp数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:Mybatis-config.xml"></property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.bdqn.dao"></property>
</bean>
<bean id="userService" class="com.bdqn.service.UserServiceImpl">
<property name="userDao" ref="userMapper"></property>
</bean>
</beans>
MapperScannerConfigurer自动扫描指定包下的Mapper接口,并将它们直接注册为MapperFactoryBean
MapperScannerConfigurer递归扫描基准包下所有接口,若它们在SQL映射文件中定义过,则动态注册为MapperFactoryBean,如此即可批量产生映射器实现类。
basePackage属性:指定扫描的基准包
测试类:
public class Test1 {
@Test
public void test() {
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
UserServiceImpl us = (UserServiceImpl) ctx.getBean("userService");
List<User> userList = us.getUserList();
for (User user : userList) {
System.out.println("用户名:"+user.getLoginName());
}
}
}
测试结果: