学科分类
目录
SSM框架

传统DAO方式的开发整合

上一小节已经完成了对MyBatis与Spring整合环境的搭建工作,可以说完成了这些配置后,就已经完成了这两个框架大部分的整合工作。接下来,本小节将通过传统DAO层开发的方式,来演示这两个框架实际的整合使用。

采用传统DAO开发方式进行MyBatis与Spring框架的整合时,我们需要编写DAO接口以及接口的实现类,并且需要向DAO实现类中注入SqlSessionFactory,然后在方法体内通过SqlSessionFactory创建SqlSession。为此,我们可以使用mybatis-spring包中所提供的SqlSessionTemplate类或SqlSessionDaoSupport类来实现此功能。这两个类的描述如下:

● SqlSessionTemplate:是mybatis-spring的核心类,它负责管理MyBatis的SqlSession,调用MyBatis的SQL方法。当调用SQL方法时,SqlSessionTemplate将会保证使用的SqlSession和当前Spring的事务是相关的。它还管理SqlSession的生命周期,包含必要的关闭、提交和回滚操作。

● SqlSessionDaoSupport:是一个抽象支持类,它继承了DaoSupport类,主要是作为DAO的基类来使用。可以通过SqlSessionDaoSupport类的getSqlSession()方法来获取所需的SqlSession。

了解了传统DAO开发方式整合可以使用的两个类后,下面以SqlSessionDaoSupport类的使用为例,来讲解下传统的DAO开发方式整合的实现,其具体步骤如下:

1.实现持久层

(1)在src目录下,创建一个com.itheima.po包,并在包中创建持久化类Customer,在Customer类中定义相关属性和方法后,如文件1所示。

文件1 Customer.java

 1    package com.itheima.po;
 2     
 3    /**
 4     * 客户持久化类
 5     */
 6    public class Customer  {
 7         
 8        private Integer id;       // 主键id
 9        private String username; // 客户名称
 10        private String jobs;      // 职业
 11        private String phone;     // 电话
 12        public Integer getId() {
 13            return id;
 14        }
 15        public void setId(Integer id) {
 16            this.id = id;
 17        }
 18        public String getUsername() {
 19            return username;
 20        }
 21        public void setUsername(String username) {
 22            this.username = username;
 23        }
 24        public String getJobs() {
 25            return jobs;
 26        }
 27        public void setJobs(String jobs) {
 28            this.jobs = jobs;
 29        }
 30        public String getPhone() {
 31            return phone;
 32        }
 33        public void setPhone(String phone) {
 34            this.phone = phone;
 35        }
 36        @Override
 37        public String toString() {
 38            return "Customer [id=" + id + ", username=" + username + 
 39                           ", jobs=" + jobs + ", phone=" + phone + "]";
 40        }
 41    }

(2)在com.itheima.po包中,创建映射文件CustomerMapper.xml,在该文件中编写根据id查询客户信息的映射语句,如文件2所示。

文件2 CustomerMapper.xml

 1    <?xml version="1.0" encoding="UTF-8"?>
 2    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 3        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 4    <mapper namespace="com.itheima.po.CustomerMapper">
 5        <!--根据id查询客户信息 -->
 6        <select id="findCustomerById" parameterType="Integer"
 7                 resultType="customer">
 8            select * from t_customer where id = #{id}
 9        </select>
 10    </mapper>

(3)在MyBatis的配置文件mybatis-config.xml中,配置映射文件CustomerMapper.xml的位置,具体如下:

<mapper resource="com/itheima/po/CustomerMapper.xml" />

2.实现DAO层

(1)在src目录下,创建一个com.itheima.dao包,并在包中创建接口CustomerDao,在接口中编写一个通过id查询客户的方法findCustomerById(),如文件3所示。

文件3 CustomerDao.java

 1    package com.itheima.dao;
 2    import com.itheima.po.Customer;
 3    public interface CustomerDao {
 4        // 通过id查询客户
 5        public Customer findCustomerById(Integer id);
 6    }

(2)在src目录下,创建一个com.itheima.dao.impl包,并在包中创建CustomerDao接口的实现类CustomerDaoImpl,编辑后如文件4所示。

文件4 CustomerDaoImpl.java

 1    package com.itheima.dao.impl;
 2    import org.mybatis.spring.support.SqlSessionDaoSupport;
 3    import com.itheima.dao.CustomerDao;
 4    import com.itheima.po.Customer;
 5    public class CustomerDaoImpl 
 6                          extends SqlSessionDaoSupport implements CustomerDao {
 7        // 通过id查询客户
 8        public Customer findCustomerById(Integer id) {
 9                 return this.getSqlSession().selectOne("com.itheima.po"
 10                          + ".CustomerMapper.findCustomerById", id);
 11        }
 12    }

在文件4中,CustomerDaoImpl类继承了SqlSessionDaoSupport 类,并实现了CustomerDao接口。其中,SqlSessionDaoSupport类在使用时需要一个 SqlSessionFactory 或一个 SqlSessionTemplate对象,所以需要通过Spring给SqlSessionDaoSupport类的子类对象注入一个SqlSessionFactory或SqlSessionTemplate。这样,在子类中就能通过调用SqlSessionDaoSupport类的getSqlSession()方法来获取SqlSession对象,并使用SqlSession对象中的方法了。

(3)在Spring的配置文件applicationContext.xml中,编写实例化CustomerDaoImpl的配置,代码如下所示。

<!--实例化Dao -->
<bean id="customerDao" class="com.itheima.dao.impl.CustomerDaoImpl">
<!-- 注入SqlSessionFactory对象实例-->
   **<property name="sqlSessionFactory" ref="sqlSessionFactory" />**
</bean>

上述代码创建了一个id为customerDao的Bean,并将SqlSessionFactory对象注入到了该Bean的实例化对象中。

3.整合测试

在src目录下,创建一个com.itheima.test包,在包中创建测试类DaoTest,并在类中编写测试方法findCustomerByIdDaoTest(),如文件5所示。

文件5 DaoTest.java

 1    package com.itheima.test;
 2    import org.junit.Test;
 3    import org.springframework.context.ApplicationContext;
 4    import 
 5         org.springframework.context.support.ClassPathXmlApplicationContext;
 6    import com.itheima.dao.CustomerDao;
 7    import com.itheima.po.Customer;
 8    /**
 9     * DAO测试类
 10     */
 11    public class DaoTest {
 12        @Test
 13        public void findCustomerByIdDaoTest(){
 14            ApplicationContext act = 
 15                new ClassPathXmlApplicationContext("applicationContext.xml");
 16              // 根据容器中Bean的id来获取指定的Bean
 17             CustomerDao customerDao = 
 18                                  (CustomerDao) act.getBean("customerDao");
 19            Customer customer = customerDao.findCustomerById(1);
 20            System.out.println(customer);
 21        }
 22    }

在上述方法中,我们采用的是根据容器中Bean的id来获取指定Bean的方式。有些读者在通过其他一些参考资料学习时,可能还会看到另一种获取Bean的方式,即根据类的类型来获取Bean的实例,此种方式就是第一章中讲解的Spring另一种获取Bean的方式。如果要采用这种方式,只需将第17~18行代码替换成如下:

CustomerDao customerDao = act.getBean(CustomerDao.class);

这样在获取Bean的实例时,就不再需要进行强制类型转换了。

使用JUnit4执行上述方法后,控制台的输出结果如图1所示。

图1 运行结果

从图1可以看出,通过CustomerDao实例的findCustomerById()方法已经查询出了id为1的客户信息,这也就说明了MyBatis与Spring整合成功。

点击此处
隐藏目录