MyBatis学习教程(八)-Mybatis3.x与Spring4.x整合图文详解

一、搭建开发环境

1.1、使用Maven创建Web项目

  执行如下命令:

复制代码 代码如下:
mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-mybatis3 -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

  如下图所示:

  MyBatis学习教程(八)-Mybatis3.x与Spring4.x整合图文详解_第1张图片

  创建好的项目如下:

  MyBatis学习教程(八)-Mybatis3.x与Spring4.x整合图文详解_第2张图片

  编辑pom.xml文件

 
 ..
 me.gacl
 spring-mybatis
 war
 .-SNAPSHOT
 spring-mybatis Maven Webapp
 http://maven.apache.org
 
 
 junit
 junit
 ..
 test
 
 
 
 spring-mybatis
 
 

  修改spring4-mybatis3 Maven Webapp部分,把"Maven Webapp"这部分包含空格的内容去掉,否则Maven在编译项目时会因为空格的原因导致一些莫名其妙的错误出现,修改成spring4-mybatis3

  另外,把以下内容删掉:


 junit
 junit
 ..
 test
 

  这部分是junit的jar包依赖信息,这个版本太低了,我们不使用这个Junit测试版本,修改过后的pom.xml内容如下:


 ..
 me.gacl
 spring-mybatis
 war
 .-SNAPSHOT
 spring-mybatis
 http://maven.apache.org
 
 
 
 spring-mybatis
 
 

1.2、将创建好的项目导入MyEclipse中

  具体操作步骤如下图所示:

  MyBatis学习教程(八)-Mybatis3.x与Spring4.x整合图文详解_第3张图片

  MyBatis学习教程(八)-Mybatis3.x与Spring4.x整合图文详解_第4张图片

  MyBatis学习教程(八)-Mybatis3.x与Spring4.x整合图文详解_第5张图片

  MyBatis学习教程(八)-Mybatis3.x与Spring4.x整合图文详解_第6张图片

  MyBatis学习教程(八)-Mybatis3.x与Spring4.x整合图文详解_第7张图片

  手动创建【src/main/java】、【src/test/resources】、【src/test/java】这三个source folder,如下图所示:

  MyBatis学习教程(八)-Mybatis3.x与Spring4.x整合图文详解_第8张图片

  到此,项目搭建的工作就算是全部完成了。

二、创建数据库和表(针对MySQL)

SQL脚本如下:

Create DATABASE spring4_mybatis3;
USE spring4_mybatis3;
DROP TABLE IF EXISTS t_user;
CREATE TABLE t_user (
 user_id char(32) NOT NULL,
 user_name varchar(30) DEFAULT NULL,
 user_birthday date DEFAULT NULL,
 user_salary double DEFAULT NULL,
 PRIMARY KEY (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  创建好的数据库和表如下:

  MyBatis学习教程(八)-Mybatis3.x与Spring4.x整合图文详解_第9张图片

三、使用generator工具生成代码

  在网上找到了一个generator工具可以根据创建好的数据库表生成MyBatis的表对应的实体类,SQL映射文件和dao,找到generator工具根目录下的generator.xml文件,这个文件是用来配置代码生成规则的,如下图所示:

  MyBatis学习教程(八)-Mybatis3.x与Spring4.x整合图文详解_第10张图片

  编辑generator.xml文件,内容如下:


 
 
 
  
 
 
  
  
  
  
   
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  

  打开命令行窗口,切换到生成工具的根目录下,执行如下命令:

java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite

  如下图所示:


  MyBatis学习教程(八)-Mybatis3.x与Spring4.x整合图文详解_第11张图片

  刚才我们在generator.xml文件中配置将生成的代码和SQL映射文件放到"C:\Users\gacl\spring4-mybatis3\src\main\java"这个目录下,这个目录就是我们的spring4-mybatis3项目所在目录,我们刷新一下src/main/java目录,就可以看到生成的代码和映射文件了,如下图所示:

  MyBatis学习教程(八)-Mybatis3.x与Spring4.x整合图文详解_第12张图片

  生成的代码和映射文件一行都不用改,可以直接应用到项目当中。下面我们看一眼由generator工具生成的代码和映射文件:

  1、生成的dao类

 package me.gacl.dao;
 import me.gacl.domain.User;
 public interface UserMapper {
 int deleteByPrimaryKey(String userId);
 int insert(User record);
 int insertSelective(User record);
 User selectByPrimaryKey(String userId);
 int updateByPrimaryKeySelective(User record);
 int updateByPrimaryKey(User record);
 }

  生成的UserMapper是一个接口,里面定义了一些操作t_user表的增删改查方法。

2、生成的实体类

package me.gacl.domain;
 import java.util.Date;
 public class User {
 private String userId;
 private String userName;
 private Date userBirthday;
 private Double userSalary;
 public String getUserId() {
  return userId;
 }
 public void setUserId(String userId) {
  this.userId = userId == null ? null : userId.trim();
 }
 public String getUserName() {
  return userName;
 }
 public void setUserName(String userName) {
  this.userName = userName == null ? null : userName.trim();
 }
 public Date getUserBirthday() {
  return userBirthday;
 }
 public void setUserBirthday(Date userBirthday) {
  this.userBirthday = userBirthday;
 }
 public Double getUserSalary() {
  return userSalary;
 }
 public void setUserSalary(Double userSalary) {
  this.userSalary = userSalary;
 }
 }

  User类是t_user表的对应的实体类,User类中定义的属性和t_user表中的字段一一对应。

  3、生成的SQL映射文件


 
 
 
 
 
 
 
 
 
 user_id, user_name, user_birthday, user_salary
 
 
 
 delete from t_user
 where user_id = #{userId,jdbcType=CHAR}
 
 
 insert into t_user (user_id, user_name, user_birthday, 
 user_salary)
 values (#{userId,jdbcType=CHAR}, #{userName,jdbcType=VARCHAR}, #{userBirthday,jdbcType=DATE}, 
 #{userSalary,jdbcType=DOUBLE})
 
 
 insert into t_user
 
 
  user_id,
 
 
  user_name,
 
 
  user_birthday,
 
 
  user_salary,
 
 
 
 
  #{userId,jdbcType=CHAR},
 
 
  #{userName,jdbcType=VARCHAR},
 
 
  #{userBirthday,jdbcType=DATE},
 
 
  #{userSalary,jdbcType=DOUBLE},
 
 
 
 
 update t_user
 
 
  user_name = #{userName,jdbcType=VARCHAR},
 
 
  user_birthday = #{userBirthday,jdbcType=DATE},
 
 
  user_salary = #{userSalary,jdbcType=DOUBLE},
 
 
 where user_id = #{userId,jdbcType=CHAR}
 
 
 update t_user
 set user_name = #{userName,jdbcType=VARCHAR},
 user_birthday = #{userBirthday,jdbcType=DATE},
 user_salary = #{userSalary,jdbcType=DOUBLE}
 where user_id = #{userId,jdbcType=CHAR}
 
 

  UserMapper.xml这个文件的内容是编写操作t_user表的SQL语句,重点说一下UserMapper.xml配置中需要注意的几个小细节问题:

  1、UserMapper.xml的标签的namespace必须是UserMapper接口的全类名,既

  2、UserMapper.xml的定义操作数据库的 select from t_user where user_id = #{userId,jdbcType=CHAR} delete from t_user where user_id = #{userId,jdbcType=CHAR} insert into t_user (user_id, user_name, user_birthday, user_salary) values (#{userId,jdbcType=CHAR}, #{userName,jdbcType=VARCHAR}, #{userBirthday,jdbcType=DATE}, #{userSalary,jdbcType=DOUBLE}) insert into t_user user_id, user_name, user_birthday, user_salary, #{userId,jdbcType=CHAR}, #{userName,jdbcType=VARCHAR}, #{userBirthday,jdbcType=DATE}, #{userSalary,jdbcType=DOUBLE}, update t_user user_name = #{userName,jdbcType=VARCHAR}, user_birthday = #{userBirthday,jdbcType=DATE}, user_salary = #{userSalary,jdbcType=DOUBLE}, where user_id = #{userId,jdbcType=CHAR} update t_user set user_name = #{userName,jdbcType=VARCHAR}, user_birthday = #{userBirthday,jdbcType=DATE}, user_salary = #{userSalary,jdbcType=DOUBLE} where user_id = #{userId,jdbcType=CHAR}

  4、在UserServiceI接口中也添加一个getAllUser()方法,如下:

package me.gacl.service;
 import java.util.List;
 import me.gacl.domain.User;
 public interface UserServiceI {
 /**
 * 添加用户
 * @param user
 */
 void addUser(User user);
 /**
 * 根据用户id获取用户
 * @param userId
 * @return
 */
 User getUserById(String userId);
 /**获取所有用户信息
 * @return List
 */
 List getAllUser();
 }

  5、在UserServiceImpl类中实现getAllUser方法,如下:

 package me.gacl.service.impl;
 import java.util.List;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import me.gacl.dao.UserMapper;
 import me.gacl.domain.User;
 import me.gacl.service.UserServiceI;
 /**
 * @author gacl
 * 使用@Service注解将UserServiceImpl类标注为一个service
 * service的id是userService
 */
 @Service("userService")
 public class UserServiceImpl implements UserServiceI {
 /**
 * 使用@Autowired注解标注userMapper变量,
 * 当需要使用UserMapper时,Spring就会自动注入UserMapper
 */
 @Autowired
 private UserMapper userMapper;//注入dao
 @Override
 public void addUser(User user) {
  userMapper.insert(user);
 }
 @Override
 public User getUserById(String userId) {
  return userMapper.selectByPrimaryKey(userId);
 }
 @Override
 public List getAllUser() {
  return userMapper.getAllUser();
 }
 }

  6、在src/main/java目录下创建一个me.gacl.web.controller包,然后在me.gacl.web.controller下创建一个UserServlet,如下:

 package me.gacl.web.controller;
 import java.io.IOException;
 import java.util.List;
 import javax.servlet.ServletException;
 import javax.servlet.annotation.WebServlet;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import org.springframework.context.ApplicationContext;
 import org.springframework.web.context.support.WebApplicationContextUtils;
 import me.gacl.domain.User;
 import me.gacl.service.UserServiceI;
 /**
 * @author gacl
 * @WebServlet是Servlet.提供的注解,目的是将一个继承了HttpServlet类的普通java类标注为一个Servlet
 * UserServlet使用了@WebServlet标注之后,就不需要在web.xml中配置了
 */
 @WebServlet("/UserServlet")
 public class UserServlet extends HttpServlet {
 //处理业务逻辑的userService
 private UserServiceI userService;
 public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
  //获取所有的用户信息
  List lstUsers = userService.getAllUser();
  request.setAttribute("lstUsers", lstUsers);
  request.getRequestDispatcher("/index.jsp").forward(request, response);
 }
 public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
  this.doGet(request, response);
 }
 public void init() throws ServletException {
  //在Servlet初始化时获取Spring上下文对象(ApplicationContext)
  ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
  //从ApplicationContext中获取userService
  userService = (UserServiceI) ac.getBean("userService");
 }
 }

  7、编辑index.jsp页面,用于展示查询到的用户信息,内容如下:

<%@ page language="java" pageEncoding="UTF-8"%>
<%--引入JSTL核心标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>


 
 显示用户信息
 
 
 
 
<%--遍历lstUsers集合中的User对象 --%>
用户ID 用户名 用户生日 工资
${user.userId} ${user.userName} ${user.userBirthday} ${user.userSalary}

  8、执行maven install命令编译项目,然后将项目部署到tomcat服务器中运行,注意,由于要使用Servlet3.0,所以必须将项目部署到tomcat7.x以上的服务器中去运行,如下所示:

  

  输入地址:http://localhost:8080/spring4-mybatis3/UserServlet访问UserServlet,访问结果如下:

  MyBatis学习教程(八)-Mybatis3.x与Spring4.x整合图文详解_第28张图片

  可以看到,t_user表中的用户信息全部查询出来显示到页面上了。这样在web服务器中的测试也正常通过了。

  以上就是Spring4.x与MyBatis3.x整合的全部内容了。编写这个整合例子花了不少时间,使用Maven编译时总是出现莫名其妙的问题,有时候成功,有时候失败,反正很莫名其妙。如果遇到执行Maven install操作不能正常编译通过的情况:可以尝试采用:Maven clean→Clean项目→Maven install这三个步骤去解决问题

你可能感兴趣的:(MyBatis学习教程(八)-Mybatis3.x与Spring4.x整合图文详解)