续上节
- 建立如下目录结构

1.修改SqlMapConfig.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>
<mappers>
<mapper resource="mybatis/user.xml" />
</mappers>
</configuration>
2.添加applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
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-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 连接池的最大数据库连接数 -->
<property name="maxActive" value="10" />
<!-- 最大空闲数 -->
<property name="maxIdle" value="5" />
</bean>
<!-- SqlSessionFactoryBean配置,核心路径 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- name="dataSource"为属性,在org.mybatis.spring.SqlSessionFactoryBean中
ref="dataSource" 为上面bean声明名-->
<property name="dataSource" ref="dataSource" />
<!-- 加载SqlMapConfig.xml核心配置文件 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
<!-- 别名包扫描 -->
<property name="typeAliasesPackage" value="com.mybatis.domain" />
</bean>
<!-- 传统配置 -->
<bean class="com.mybatis.dao.impl.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<!-- 动态代理1 -->
<!-- <bean id="baseMapper" class="org.mybatis.spring.mapper.MapperFactoryBean" abstract="true" lazy-init="true">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean> -->
<!-- parent="baseMapper" bean id="baseMapper" 名字一致-->
<!-- 配置一个接口 -->
<!-- <bean id="oneBaseMapper" parent="baseMapper">
<property name="mapperInterface" value="com.mybatis.mapper.UserMapper" />
</bean> -->
<!-- 动态代理,第二种方式:包扫描(推荐): -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- basePackage多个包用","分隔 -->
<!-- <property name="basePackage" value="com.mybatis.mapper" /> -->
<property name="basePackage" value="com.mybatis.mapper" />
</bean>
</beans>
3.UserDao接口
package com.mybatis.dao;
import java.util.List;
import com.mybatis.domain.User;
public interface UserDao {
User getUserById(Integer id);
List<User> getUserByUserName(String userName);
void insertUser(User user);
}
4.UserDaoImpl实现类
package com.mybatis.dao.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import com.mybatis.dao.UserDao;
import com.mybatis.domain.User;
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
@Override
public User getUserById(Integer id) {
SqlSession sqlSession=super.getSqlSession();
return sqlSession.selectOne("user.getUserByid", id);
}
@Override
public List<User> getUserByUserName(String userName) {
SqlSession sqlSession=super.getSqlSession();
return sqlSession.selectList("user.getUserByUserName",userName);
}
@Override
public void insertUser(User user) {
SqlSession sqlSession=super.getSqlSession();
sqlSession.insert("user.insertUser", user);
}
}
5.UserMapper接口
package com.mybatis.mapper;
import java.util.List;
import com.mybatis.domain.User;
public interface UserMapper {
User getUserById(int id);
List<User> getUserByUserName(String userName);
void insertUser(User user);
}
6.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">
<!-- 动态代理 开发规则:
namespace 和接口全路径名一致
SQL id 和接口方法名一致
接口入参和 parameterType类型一致
接口返回值和resultType类型一致-->
<mapper namespace="com.mybatis.mapper.UserMapper">
<sql id="user_id">
<!-- 引用定义好的SQL片段 -->
`id`,
`username`,
`birthday`,
`sex`,
`address`
</sql>
<select id="getUserById" parameterType="int" resultType="user">
SELECT
<include refid="user_id"></include>
FROM `user`
WHERE id=#{id}
</select>
<!-- 如果返回为集合时,设置每个数据类型即可 -->
<select id="getUserByUserName" parameterType="string" resultType="com.mybatis.domain.User">
SELECT
`id`,
`username`,
`birthday`,
`sex`,
`address`
FROM `user`
WHERE username LIKE '%${value}%'
</select>
<!-- useGeneratedKeys使用自增,keyProperty结合使用,为user主键 -->
<insert id="insertUser" parameterType="com.mybatis.domain.User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO `user`
(`username`,
`birthday`,
`sex`,
`address`)
VALUES (#{username},
#{birthday},
#{sex},
#{address});
</insert>
</mapper>
7.单元测试
package com.mybatis.test;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mybatis.dao.UserDao;
import com.mybatis.domain.User;
public class UserDaoTest {
private ApplicationContext applicationContext;
@Before
public void init() {
applicationContext=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
}
@Test
public void testGetUserById() {
UserDao userDao=applicationContext.getBean(UserDao.class);
User user = userDao.getUserById(30);
System.out.println(user);
}
@Test
public void testGetUserByUserName() {
fail("Not yet implemented");
}
@Test
public void testInsertUser() {
fail("Not yet implemented");
}
}
package com.mybatis.test;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mybatis.dao.UserDao;
import com.mybatis.domain.User;
import com.mybatis.mapper.UserMapper;
public class UserMapperTest {
private ApplicationContext applicationContext;
@Before
public void init() {
applicationContext=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
}
@Test
public void testGetUserById() {
UserMapper userMapper=applicationContext.getBean(UserMapper.class);
User user=userMapper.getUserById(30);
System.out.println(user);
}
@Test
public void testGetUserByUserName() {
fail("Not yet implemented");
}
@Test
public void testInsertUser() {
fail("Not yet implemented");
}
}