Note/JAVA/JAVA EE/Web程序设计笔记14——第十章:Spring 和 MyBatis 的整合.md
2023-08-31 12:43:36 +08:00

8.2 KiB
Raw Blame History

第十章Spring 和 MyBatis 的整合

基于SSM的用户管理系统的设计与实现

基于传统的DAO方式的整合

0.导包

mybatis mybatis-spring spring mysql spring-tx spring-jdbc commons-dbcp2

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.4.2</version>
</dependency>
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>1.3.1</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>4.3.6.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-dbcp2</artifactId>
  <version>2.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.28</version>
</dependency>
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>4.3.6.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
  <version>4.3.6.RELEASE</version>
</dependency>

1.准备数据

mybatis 中的 t_customer

image-20220426132557267

2.创建实体类

//在com.gzh.domain下创建
private int id;
private String username;
private String jobs;
private String phone;
//利用 getter  setter 和 toString 方法生成代码

3.在resources下创建CustomerMapper.xml文件

<!--    1.根据id查找用户-->
    <select id="findCustomerById" parameterType="int" resultType="com.gzh.domain.Customer">
        select * from t_customer where id=#{id}
    </select>
</mapper>

4.在resources下创建mybatis-config.xml文件

<!--加载Mapper文件-->
      <mappers>
            <mapper resource="CustomerMapper.xml"/>
      </mappers>

5.创建DAO层接口和实现类

//在com.gzh.dao包下创建接口
public interface CustomerDao {
    Customer findCustomerById(int id);
}
//在com.gzh.dao.impl包下创建实现类
public class CustomerDaoImpl extends SqlSessionDaoSupport implements CustomerDao {
    @Override
    public Customer findCustomerById(int id){
        Customer o = getSqlSession().selectOne("CustomerMapper.findCustomerById", id);
        return o;
    }
}

6.在resources下创建applicationContext.xml文件

<!--    1.连接数据库-->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
        <property name="username" value="root"/>
        <property name="password" value="8520"/>
    </bean>
<!--    2.加载MyBAtis的配置文件-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
<!--    3.创建接口对象-->
    <bean id="customerDao" class="com.gzh.dao.impl.CustomerDaoImpl">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>

7.测试

//在com.gzh.domain包下创建测试类
@Test
public void findCustomerByIdTest(){
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    CustomerDao customerDao = (CustomerDao) applicationContext.getBean("customerDao");
    Customer customerById = customerDao.findCustomerById(1);
    System.out.println(customerById);
}

image-20220426134717655

基于Mapper方式的整合

基于MapperFactoryBean的整合

0.导包

与DAO方式导包数量相同

1.准备数据

同上数据

2.创建实体类

//在com.gzh.domain下创建
private int id;
private String username;
private String jobs;
private String phone;
//利用 getter  setter 和 toString 方法生成代码

3.创建com.gzh.mapper. CustomerMapper接口文件

public interface CustomerMapper {
    Customer findCustomerById(int i);
}

4.在resources下创建com->gzh->mapper->CustomerMapper.Xml文件

com.gzh.mapper 文件夹要一个一个创建,才能保证是嵌套的

<mapper namespace="com.gzh.mapper.CustomerMapper">
<!--1.根据id查询客户信息-->
    <select id="findCustomerById" parameterType="int" resultType="com.gzh.domain.Customer">
        select * from t_customer where id=#{id}
    </select>
</mapper>

5.在resources下创建mybatis-config.xml文件

<mappers>
      <mapper resource="com/gzh/mapper/CustomerMapper.xml"/>
</mappers>

6.在resources下创建applicationContext.xml文件

<!--    1.连接数据库-->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
    <property name="username" value="root"/>
    <property name="password" value="8520"/>
</bean>
<!--    2.加载MyBAtis的配置文件-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!--    3.创建MapperFactoryBean类对象-->
<bean id="factoryBean" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="com.gzh.mapper.CustomerMapper"/>
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

7.测试

@Test
public void findCustomerById(){
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    CustomerMapper factoryBean = (CustomerMapper) applicationContext.getBean("factoryBean");
    Customer customerById = factoryBean.findCustomerById(1);
    System.out.println(customerById);
}

image-20220426135752830

虽然使用Mapper接口编程的方式很简单但是在具体使用时还是需要遵循以下规范。

(I)Mapper接口的名称和对应的Mapper.xml映射文件的名称必须一致。

(2)Mapper,.xml文件中的namespace与Mapper接口的类路径相同即接口文件和映射文件 需要放在同一个包中)。

(3)Mapper接口中的方法名和Mapper.xml中定义的每个执行语句的id相同。

(4)Mapper接口中方法的输入参数类型要和Mapper,.xml中定义的每个sql的parameterType 的类型相同。

(5)Mapper接口方法的输出参数类型要和Mapper.xml中定义的每个sql的resultType的 类型相同。

只要遵循了这些开发规范MyBatis就可以自动生成Mapper接口实现类的代理对象从而 简化我们的开发。

基于MapperScannerConfigurer的整合

在上面的基础上修改

1.在 applicationContext 中注释以下代码

<!--    3.创建MapperFactoryBean类对象-->
    <bean id="factoryBean" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="com.gzh.mapper.CustomerMapper"/>
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>

2.在 applicationContext 中添加以下代码

<!--    4.基于MapperScannerConfigurer的整合-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.gzh.mapper"/>
</bean>

3.创建新的测试类

@Test
public void findCustomerById1(){
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    CustomerMapper bean = applicationContext.getBean(CustomerMapper.class);
    Customer customerById = bean.findCustomerById(1);
    System.out.println(customerById);
}

image-20220427102429052