整合思路

  • SqlSessionFactory对象应该是放到spring容器中,并且是单例;
  • 传统的DAO开发应该从spring容器中获取sqlsession对象;
  • Mapper代理形式中应该从spring容器中直接获得mapper代理对象;
  • 数据库连接以及数据库连接池事务管理都交给spring容器来完成。

整合的jar包

http://download.csdn.net/download/qq_25343557/10162260

详细整合步骤

1、导入jar包
2、加入配置文件:
mybatis核心配置文件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>
    <typeAliases>
        <!-- 批量设置别名,别名为类名,不区分大小写 -->
        <package name="cn.xpu.hcp.bean"/>
    </typeAliases>
    <!-- 数据库的配置交给spring处理 -->
</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"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    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.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 加载数据库配置属性文件 -->
    <context:property-placeholder location="classpath:jdbc.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>
    <!-- 配置SqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 载入核心配置文件 -->
        <property name="configLocation" value="classpath:SqlMapConfig.xml"/>
        <property name="dataSource" ref="dataSource"/>
    </bean>

</beans>

jdbc.properties:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///MybatisSpring
jdbc.username=root
jdbc.password=

DAO开发

需求:

  1. 实现根据用户id查询
  2. 实现根据用户名模糊查询
  3. 添加用户

创建User表:

CREATE TABLE `user` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(32) NOT NULL COMMENT '用户名称',
  `birthday` DATE DEFAULT NULL COMMENT '生日',
  `sex` CHAR(1) DEFAULT NULL COMMENT '性别',
  `address` VARCHAR(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '王五', '2014-07-10', '2', '重庆市');
INSERT INTO `user` VALUES ('10', '张三', '2014-07-10', '1', '北京市');
INSERT INTO `user` VALUES ('16', '张小明', '1995-07-10', '1', '河南郑州');
INSERT INTO `user` VALUES ('22', '陈小明', '1996-09-10', '1', '河南郑州');
INSERT INTO `user` VALUES ('24', '张三丰', '1990-08-10', '1', '河南郑州');
INSERT INTO `user` VALUES ('25', '陈小明', '1995-08-20', '1', '河南郑州');
INSERT INTO `user` VALUES ('26', '王五', '1996-07-10', '1', '上海市');

创建User类:

public class User implements Serializable{
    private static final long serialVersionUID = 1L;
    private int id;
    private String username;

    private String sex;
    private Date birthday;
    private String address;


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public User() {
        super();
    }
    public User(String username, String sex, Date date,
            String address) {
        super();
        this.username = username;
        this.sex = sex;
        this.birthday = date;
        this.address = address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", sex=" + sex
                + ", birthday=" + birthday + ", address=" + address + "]";
    }
}
原始DAO开发

原始DAO开发:DAO接口+实现类
原始DAO开发实现类需要继承SqlsessionDaoSupport类
实现DAO接口:

public interface UserDao {
    User getUserById(int id);

    List<User> getLikeByName(String name);

    void insertUser(User user);
}

实现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="user">
    <select id="getUserById" parameterType="int" resultType="User">
        select * from user where id=#{id}
    </select>

    <select id="getLikeByName" parameterType="string" resultType="User">
        select *
        from user
        where username like "%"#{username}"%"
    </select>

    <insert id="insertUser" parameterType="User">
        <selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
            SELECT LAST_INSERT_ID()
        </selectKey>
        insert into user
        (username,birthday,sex,address) 
        values (#{username},#{birthday},#{sex},#{address})
    </insert>
</mapper>

编写UserDao实现类:

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {

    @Override
    public User getUserById(int id) {
        SqlSession session = super.getSqlSession();
        User user = session.selectOne("getUserById", 1);
        return user;
    }

    @Override
    public List<User> getLikeByName(String name) {
        SqlSession session = super.getSqlSession();
        List<User> list = session.selectList("getLikeByName", name);
        return list;
    }

    @Override
    public void insertUser(User user) {
        SqlSession session = super.getSqlSession();
        session.insert("insertUser", user);
    }

}

在Spring的applicationContext.xml中配置userDao:

<!-- 原始DAO开发,配置DAO到spring中 -->
<bean id="userDao" class="cn.xpu.hcp.daoImpl.UserDaoImpl">
        <!-- 配置SqlSessionFactory -->
        <property name="SqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

测试:

<!--使用spring的单元测试功能需要导入额外jar包-->
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestUtils {

    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;

    @Test
    public void test() {
        User user = userDao.getUserById(1);
        System.out.println(user);

        List<User> list = userDao.getLikeByName("王");
        for (User u : list) {
            System.out.println(u);
        }

        User temp = new User("李四","1",new Date(),"南昌市");
        userDao.insertUser(temp);
    }
}

这里写图片描述
这里写图片描述

Mapper代理形式开发Dao

UserMapper接口与UserDao接口相同,和UserMapper.xml放在一起;
UserMapper.xml中的名称空间设置为UserMapper的全类名。

现在要在applicationContext.xml中配置mapper接口:
方法一:

<!-- 方法一 -->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="cn.xpu.hcp.mapper.UserMapper"/>
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

测试:

@Autowired
    @Qualifier("userMapper")
    private UserMapper userMapper;

    @Test
    public void test() {
        User user = userMapper.getUserById(1);
        System.out.println(user);

        List<User> list = userMapper.getLikeByName("王");
        for (User u : list) {
            System.out.println(u);
        }

        User temp = new User("赵四","1",new Date(),"西宁市");
        userMapper.insertUser(temp);
        System.out.println(temp);
    }

这里写图片描述
这里写图片描述

这种方式有一个明显的缺点:如果我们有很多的mapper接口那么我们要写很多次这种配置,很繁琐。使用方法二可以很方便解决。

方法二:
仅仅是配置mapper的方法不同而已:

<!-- 扫描包的形式配置mapper-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 这种方法不需要写id -->
        <!-- 配置基础包,每个mapper代理对象的id就是类名,首字母小写 -->
        <property name="basePackage" value="cn.xpu.hcp.mapper"/>
</bean>
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐