终于来了!SSM整合!第二个SpringMVC撰写!

第一步:Spring整合MyBatis

请参考:http://www.moonlightgate.com/archives/88

第二步:将SpringMVC整合进入Spring和MyBatis

  1. 修改UserServiceImpl.java
package com.royotech.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.royotech.dao.PersonDAO;
import com.royotech.entity.Person;
import com.royotech.service.UserService;

@Service
public class UserServiceImpl implements UserService{
    @Autowired
    private PersonDAO personDAO;

    @Override
    public List<Person> select() {
        return personDAO.selectAll();
    }
}
  1. applicationContext.xml头部增加scanner语句。
<context:component-scan base-package="com.royotech.service"></context:component-scan>
  1. web.xml增加filter
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
  1. 撰写controller
package com.royotech.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.royotech.entity.Person;
import com.royotech.service.UserService;

@Controller //作用:将当前类的对象交给Spring工厂创建
@RequestMapping("user")   //请求路径
public class UserController {
    @Autowired
    private UserService userService;
    @RequestMapping("select") //请求路径
    public String select(Model model) {
        List<Person> listPerson = userService.select();
        model.addAttribute("listPerson",listPerson);
        return "forward:/list.jsp";
    }
}
  1. 撰写list.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Welcome!</title>
</head>
<body>
    <c:forEach var="person" items="${listPerson}">
        ${person.id},${person.name},${person.birthday},${person.telephone},${person.address}<br/>
    </c:forEach>
</body>
</html>
  1. 大功告成,测试结果如下:
    file

第三个Spring程序撰写,整合Spring和MyBatis

MyBatis项目环境搭建及第一个MyBatis程序

请参考:http://www.moonlightgate.com/archives/59

搭建Spring开发环境

请参考:http://www.moonlightgate.com/archives/79

第一个Spring程序的撰写,理解SpringIOC

请参考:http://www.moonlightgate.com/archives/81

第二个Spring程序的撰写,理解SpringAOP

请参考:http://www.moonlightgate.com/archives/86

第三个Spring程序的撰写,整合Spring和MyBatis

第一步:添加依赖。

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.3</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.3</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.21</version>
    </dependency>

第二步:建表、定义对应的实体类
数据库名:java_all,表名:t_person,表结构如下:
file

在entity包下新建实体类Person

package com.royotech.entity;

import java.io.Serializable;

public class Person implements Serializable{
    private Integer id;
    private String name;
    private String birthday;
    private String telephone;
    private String address;

    public Person() {
        super();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", birthday=" + birthday + ", telephone=" + telephone
                + ", address=" + address + "]";
    }
}

第三步:DAO包下定义DAO接口

package com.royotech.dao;

import java.util.List;

import com.royotech.entity.Person;

public interface PersonDAO {
    public List<Person> selectAll();
}

第四步:applicationContext.xml下增加对应的bean标签

    <!-- 1.创建数据源(之前在mybatis-config.xml中配置) -->
    <bean id="ds" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="jdbc:mysql://localhost:3306/java_all?useUnicode=true&characterEncoding=utf8"></property>
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="username" value="root"></property>
        <property name="password" value="123123"></property>
    </bean>
    <!-- 2.创建SqlSessionFactory对象 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="ds"></property>
        <!-- 相当于mybaits-config.xml中的mapper注册,可以使用通配符* -->
        <property name="mapperLocations" value="classpath:mappers/*Mapper.xml"></property>
        <property name="typeAliasesPackage" value="com.royotech.entity"></property>
    </bean>
    <!-- 3.创建DAO对象 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 提供DAO接口包名,自动创建该包下所有DAO接口的实现类对象 -->
        <!-- DAO类名的首字母小写,就是从工厂中获取该接口对应实现类对象的id -->
        <property name="basePackage" value="com.royotech.dao"></property>
    </bean>

第五步:在view包下建立SelectPersonSpringMyBatis对象

package com.royotech.view;

import java.util.List;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.royotech.dao.PersonDAO;
import com.royotech.entity.Person;

public class SelectPersonSpringMyBatis {    
    public static void main(String[] args) throws Exception{
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        PersonDAO personDAO = (PersonDAO)ac.getBean("personDAO");
        List<Person> listPerson = personDAO.selectAll();
        for(Person person : listPerson) {
            System.out.println(person);
        }
    }
}

运行一下,大功告成:
file

程序使用Spring和MyBatis前后的对比

  1. MyBatis用于替换DAO.impl包下的实现类,也就是DAO实现类。替代方法是使用mybatis-config.xml和mapper.xml文件。
  2. Spring和MyBatis整合后,mybatis-config.xml文件也省略了,其中对应的内容被写进了Spring配置文件applicationContext.xml文件中。

MyBatis项目环境搭建及第一个MyBatis程序

1. 导入相关jar包。

需要导入的jar包有两部分,一个是MyBatis的jar包。
另外由于MyBatis是操作数据库的,我们以MySQL数据库作为示范,所以还要导入MySQL数据库的jar包。
导入jar包的方式有很多种,最简单的就是去官网下载jar包,然后复制到代码目录里。
但这里我们通过添加MAVEN依赖的方式导入。

2. 通过MAVEN导入依赖。

至于MAVEN是什么,请参照本站有关MAVEN的文章。要说的是,MAVEN其实很简单。
需要添加的MAVEN依赖如下:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.3</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.6</version>
</dependency>

3. 导入并撰写配置文件mybatis-config.xml

  • mybatis-config.xml 用于配置mybatis的基本参数(数据库接口类型、用户名、密码)
  • 为了对应MAVEN目录结构,mybatis-config.xml放在resources目录下。
    基本上就是固定格式

    <?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>
    <environments default="development">
    <!-- 数据库环境:开发环境 -->
    <environment id="development">
      <transactionManager type="JDBC"/> <!-- JDBC:手动完成事物管理; MANAGED:由第三方完成事物管理 -->
      <dataSource type="POOLED">        <!-- POOLED:使用数据库连接池;UNPOOLED:不使用数据库连接池 -->
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/java_all"/>
        <property name="username" value="root"/>
        <property name="password" value="123123"/>
      </dataSource>
    </environment>
    </environments>
    </configuration>

4. 创建Entity类和DAO接口

MyBatis的存在意义就是代替DAO接口实现类,所以不需要再创建DAO接口实现类了。

创建Entity类

/** 
 * 定义实体类
 * 1. 实体类定义在entity包下
 * 2. 实体类必须实现Serializable接口
 * 3. 实体类属性名字和数据库字段名一致,这样可以自动赋值
 * 4. 实体类属性数值类型使用包装类,并提供get、set方法
 * 5. 实体类必须提供无参数的构造方法
 * 6. 实体类可以重载toString方法,这样方便println直接使用。
 */
package com.royotech.entity;

import java.io.Serializable;

public class Person implements Serializable{
    private Integer id;
    private String name;
    private String birthday;
    private String telephone;
    private String address;

    public Person() {
        super();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", birthday=" + birthday + ", telephone=" + telephone
                + ", address=" + address + "]";
    }
}

创建DAO接口

/**
 * 
 * DAO:Data Access Object,DAO接口是Entity类和数据库之间的连接纽带,封装增删改查的操作。
 * 
 * DAO接口:实体类名+DAO,所有DAO接口都在DAO包下。
 *
 * 一个表 一个实体 一个DAO接口
 */

package com.royotech.dao;

import com.royotech.entity.Person;

public interface PersonDAO {
    public Person selectPersonById(Integer id);
}

5. 撰写XXXMapper.xml文件

撰写PersonDAOMapper.xml映射文件

  • XXXMapper.xml 配置一个DAO接口方法要执行的SQL语句。XXXMapper.xml文件和DAO接口一一对应。
  • 为了对应MAVEN目录结构,XXXMapper.xml放在resources/mappers子目录下。
    <?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.royotech.dao.PersonDAO"> <!-- 对应的DAO接口的全类名 -->
    <select id = "selectPersonById" resultType="com.royotech.entity.Person"> <!-- id对应类下面的方法名;resultType对应该方法的返回值类型-->
        select *
        from t_person
        where id = #{id}<!-- 方法中形参的名字 -->
    </select>
    </mapper>

6. 在mybatis-config.xml中注册mapper

<?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>
  <environments default="development">
    <!-- 数据库环境:开发环境 -->
    <environment id="development">
      <transactionManager type="JDBC"/> <!-- JDBC:手动完成事物管理; MANAGED:由第三方完成事物管理 -->
      <dataSource type="POOLED">        <!-- POOLED:使用数据库连接池;UNPOOLED:不使用数据库连接池 -->
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/java_all"/>
        <property name="username" value="root"/>
        <property name="password" value="123123"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="mappers/PersonDAOMapper.xml"/>
  </mappers>
</configuration>

7. 大功告成,测试一下结果吧。

建立一个SelectPerson.java文件

package com.royotech.view;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.royotech.dao.PersonDAO;
import com.royotech.entity.Person;

public class SelectPerson { 
    public static void main(String[] args) throws Exception{
        //1. 读取配置文件
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        //2. 获取SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3. 获取SqlSession
        SqlSession sqlSession = factory.openSession();
        //4. 获取PersonDAO实现类对象
        PersonDAO dao = sqlSession.getMapper(PersonDAO.class);
        //5. 调用DAO的方法
        Person p = dao.selectPersonById(3);
        System.out.println(p);

        //6. 关闭sqlSession
        sqlSession.close();
    }
}

数据库结构、数据和运行结果如下:
file