第一章:准备工作

  • 导入所需要 jar 包的 Maven 坐标
  1. <!--引入pageHelper分页插件 -->
  2. <dependency>
  3. <groupId>com.github.pagehelper</groupId>
  4. <artifactId>pagehelper</artifactId>
  5. <version>5.0.0</version>
  6. </dependency>
  7. <!-- MBG -->
  8. <dependency>
  9. <groupId>org.mybatis.generator</groupId>
  10. <artifactId>mybatis-generator-core</artifactId>
  11. <version>1.3.5</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.springframework</groupId>
  15. <artifactId>spring-webmvc</artifactId>
  16. <version>4.3.7.RELEASE</version>
  17. </dependency>
  18. <!-- 返回json字符串的支持 -->
  19. <dependency>
  20. <groupId>com.fasterxml.jackson.core</groupId>
  21. <artifactId>jackson-databind</artifactId>
  22. <version>2.8.8</version>
  23. </dependency>
  24. <!--JSR303数据校验支持;tomcat7及以上的服务器,
  25. tomcat7以下的服务器:el表达式。额外给服务器的lib包中替换新的标准的el
  26. -->
  27. <dependency>
  28. <groupId>org.hibernate</groupId>
  29. <artifactId>hibernate-validator</artifactId>
  30. <version>5.4.1.Final</version>
  31. </dependency>
  32. <!-- Spring-Jdbc -->
  33. <dependency>
  34. <groupId>org.springframework</groupId>
  35. <artifactId>spring-jdbc</artifactId>
  36. <version>4.3.7.RELEASE</version>
  37. </dependency>
  38. <!--Spring-test -->
  39. <dependency>
  40. <groupId>org.springframework</groupId>
  41. <artifactId>spring-test</artifactId>
  42. <version>4.3.7.RELEASE</version>
  43. </dependency>
  44. <!-- Spring面向切面编程 -->
  45. <dependency>
  46. <groupId>org.springframework</groupId>
  47. <artifactId>spring-aspects</artifactId>
  48. <version>4.3.7.RELEASE</version>
  49. </dependency>
  50. <!--MyBatis -->
  51. <dependency>
  52. <groupId>org.mybatis</groupId>
  53. <artifactId>mybatis</artifactId>
  54. <version>3.4.2</version>
  55. </dependency>
  56. <!-- MyBatis整合Spring的适配包 -->
  57. <dependency>
  58. <groupId>org.mybatis</groupId>
  59. <artifactId>mybatis-spring</artifactId>
  60. <version>1.3.1</version>
  61. </dependency>
  62. <!-- 数据库连接池、驱动 -->
  63. <dependency>
  64. <groupId>c3p0</groupId>
  65. <artifactId>c3p0</artifactId>
  66. <version>0.9.1</version>
  67. </dependency>
  68. <dependency>
  69. <groupId>mysql</groupId>
  70. <artifactId>mysql-connector-java</artifactId>
  71. <version>8.0.21</version>
  72. </dependency>
  73. <!-- (jstl,servlet-api,junit) -->
  74. <dependency>
  75. <groupId>jstl</groupId>
  76. <artifactId>jstl</artifactId>
  77. <version>1.2</version>
  78. </dependency>
  79. <dependency>
  80. <groupId>javax.servlet</groupId>
  81. <artifactId>javax.servlet-api</artifactId>
  82. <version>3.0.1</version>
  83. <scope>provided</scope>
  84. </dependency>
  85. <!-- junit -->
  86. <dependency>
  87. <groupId>junit</groupId>
  88. <artifactId>junit</artifactId>
  89. <version>4.12</version>
  90. </dependency>
  • sql 脚本:
  1. SET NAMES utf8mb4;
  2. SET FOREIGN_KEY_CHECKS = 0;
  3. -- ----------------------------
  4. -- Table structure for employee
  5. -- ----------------------------
  6. DROP TABLE IF EXISTS `employee`;
  7. CREATE TABLE `employee` (
  8. `id` int(11) NOT NULL AUTO_INCREMENT,
  9. `last_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  10. `gender` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  11. `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  12. PRIMARY KEY (`id`) USING BTREE
  13. ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  14. -- ----------------------------
  15. -- Records of employee
  16. -- ----------------------------
  17. INSERT INTO `employee` VALUES (1, 'jerry', '男', 'jerry@qq.com');
  18. INSERT INTO `employee` VALUES (2, 'aa', '男', 'aa@11.com');
  19. INSERT INTO `employee` VALUES (3, 'bb', '男', 'bb@11.com');
  20. INSERT INTO `employee` VALUES (4, 'aa', '男', 'aa@11.com');
  21. INSERT INTO `employee` VALUES (5, 'bb', '男', 'bb@11.com');
  22. SET FOREIGN_KEY_CHECKS = 1;
  • db.properties
  1. jdbc.url=jdbc:mysql://192.168.134.100:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&allowMultiQueries=true
  2. jdbc.driverClass=com.mysql.cj.jdbc.Driver
  3. jdbc.username=root
  4. jdbc.password=123456
  • log4j.xml
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
  3. <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  4. <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
  5. <param name="Encoding" value="UTF-8" />
  6. <layout class="org.apache.log4j.PatternLayout">
  7. <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
  8. </layout>
  9. </appender>
  10. <logger name="java.sql">
  11. <level value="debug" />
  12. </logger>
  13. <logger name="org.apache.ibatis">
  14. <level value="info" />
  15. </logger>
  16. <root>
  17. <level value="debug" />
  18. <appender-ref ref="STDOUT" />
  19. </root>
  20. </log4j:configuration>
  • Employee.java
  1. package com.sunxiaping.domain;
  2. import org.apache.ibatis.type.Alias;
  3. import java.io.Serializable;
  4. @Alias("emp")
  5. public class Employee implements Serializable {
  6. private Integer id;
  7. private String lastName;
  8. private String email;
  9. private String gender;
  10. public Integer getId() {
  11. return id;
  12. }
  13. public void setId(Integer id) {
  14. this.id = id;
  15. }
  16. public String getLastName() {
  17. return lastName;
  18. }
  19. public void setLastName(String lastName) {
  20. this.lastName = lastName;
  21. }
  22. public String getEmail() {
  23. return email;
  24. }
  25. public void setEmail(String email) {
  26. this.email = email;
  27. }
  28. public String getGender() {
  29. return gender;
  30. }
  31. public void setGender(String gender) {
  32. this.gender = gender;
  33. }
  34. @Override
  35. public String toString() {
  36. return "Employee{" +
  37. "id=" + id +
  38. ", lastName='" + lastName + '\'' +
  39. ", email='" + email + '\'' +
  40. ", gender='" + gender + '\'' +
  41. '}';
  42. }
  43. }

第二章:配置

  • 新建 mybatis-config.xml 文件
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <settings>
  7. <!-- 开启自动驼峰命名规则映射 -->
  8. <setting name="mapUnderscoreToCamelCase" value="true"/>
  9. <!-- 开启对jdbcType的NULL的支持 -->
  10. <setting name="jdbcTypeForNull" value="NULL"/>
  11. <!-- 开启延迟加载 -->
  12. <setting name="lazyLoadingEnabled" value="true"/>
  13. <!-- 开启按需加载 -->
  14. <setting name="aggressiveLazyLoading" value="false"/>
  15. <!-- 开启二级缓存 -->
  16. <setting name="cacheEnabled" value="true"/>
  17. </settings>
  18. <databaseIdProvider type="DB_VENDOR">
  19. <!--
  20. 为不同的数据库厂商起别名
  21. -->
  22. <property name="MySQL" value="mysql"/>
  23. <property name="Oracle" value="oracle"/>
  24. <property name="SQL Server" value="sqlserver"/>
  25. </databaseIdProvider>
  26. </configuration>
  • 新建 applicationContext.xml
  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:tx="http://www.springframework.org/schema/tx"
  4. xmlns:jdbc="http://www.springframework.org/schema/jdbc"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
  7. xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
  8. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
  10. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
  11. http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
  12. <!-- 引入数据库配置文件 -->
  13. <context:property-placeholder location="classpath*:db.properties"/>
  14. <!-- 开启组件扫描 -->
  15. <context:component-scan base-package="com.sunxiaping">
  16. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  17. </context:component-scan>
  18. <!-- 配置数据库连接池 -->
  19. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  20. <property name="jdbcUrl" value="${jdbc.url}"/>
  21. <property name="password" value="${jdbc.password}"/>
  22. <property name="driverClass" value="${jdbc.driverClass}"/>
  23. <property name="user" value="${jdbc.username}"/>
  24. </bean>
  25. <!-- 整合Mybatis -->
  26. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  27. <property name="dataSource" ref="dataSource"/>
  28. <!-- 指定Mybatis的全局配置文件的位置 -->
  29. <property name="configLocation" value="classpath:mybatis-config.xml"/>
  30. <!-- 指定Mapper映射文件 -->
  31. <property name="mapperLocations" value="classpath:com/sunxiaping/mapper/*.xml"/>
  32. </bean>
  33. <!-- 扫描所有的Mapper接口,让所有的Mapper自动注入 -->
  34. <mybatis:scan base-package="com.sunxiaping.mapper"></mybatis:scan>
  35. <!-- 配置事务管理器 -->
  36. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  37. <property name="dataSource" ref="dataSource"/>
  38. </bean>
  39. <!-- 开启事务注解驱动 -->
  40. <tx:annotation-driven transaction-manager="transactionManager"/>
  41. </beans>
  • 新建 springmvc.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
  7. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
  9. <!--SpringMVC只是控制网站跳转逻辑 -->
  10. <!-- 只扫描控制器 -->
  11. <context:component-scan base-package="com.sunxiaping" use-default-filters="false">
  12. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  13. </context:component-scan>
  14. <!-- 视图解析器 -->
  15. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  16. <property name="prefix" value="/WEB-INF/pages/"></property>
  17. <property name="suffix" value=".jsp"></property>
  18. </bean>
  19. <mvc:annotation-driven/>
  20. <mvc:default-servlet-handler/>
  21. </beans>
  • 在 web.xml 中配置启动 Spring 的容器以及前端控制器…
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5. id="WebApp_ID" version="2.5">
  6. <!--1、启动Spring的容器 -->
  7. <context-param>
  8. <param-name>contextConfigLocation</param-name>
  9. <param-value>classpath:applicationContext.xml</param-value>
  10. </context-param>
  11. <listener>
  12. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  13. </listener>
  14. <!--2、springmvc的前端控制器,拦截所有请求 -->
  15. <servlet>
  16. <servlet-name>dispatcherServlet</servlet-name>
  17. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  18. <init-param>
  19. <param-name>contextConfigLocation</param-name>
  20. <param-value>classpath*:springmvc.xml</param-value>
  21. </init-param>
  22. <load-on-startup>1</load-on-startup>
  23. </servlet>
  24. <servlet-mapping>
  25. <servlet-name>dispatcherServlet</servlet-name>
  26. <url-pattern>/</url-pattern>
  27. </servlet-mapping>
  28. <!-- 3、字符编码过滤器,一定要放在所有过滤器之前 -->
  29. <filter>
  30. <filter-name>CharacterEncodingFilter</filter-name>
  31. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  32. <init-param>
  33. <param-name>encoding</param-name>
  34. <param-value>utf-8</param-value>
  35. </init-param>
  36. <init-param>
  37. <param-name>forceRequestEncoding</param-name>
  38. <param-value>true</param-value>
  39. </init-param>
  40. <init-param>
  41. <param-name>forceResponseEncoding</param-name>
  42. <param-value>true</param-value>
  43. </init-param>
  44. </filter>
  45. <filter-mapping>
  46. <filter-name>CharacterEncodingFilter</filter-name>
  47. <url-pattern>/*</url-pattern>
  48. </filter-mapping>
  49. <!-- 4、使用Rest风格的URI,将页面普通的post请求转为指定的delete或者put请求 -->
  50. <filter>
  51. <filter-name>HiddenHttpMethodFilter</filter-name>
  52. <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  53. </filter>
  54. <filter-mapping>
  55. <filter-name>HiddenHttpMethodFilter</filter-name>
  56. <url-pattern>/*</url-pattern>
  57. </filter-mapping>
  58. <filter>
  59. <filter-name>HttpPutFormContentFilter</filter-name>
  60. <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
  61. </filter>
  62. <filter-mapping>
  63. <filter-name>HttpPutFormContentFilter</filter-name>
  64. <url-pattern>/*</url-pattern>
  65. </filter-mapping>
  66. </web-app>

第三章:编码

  • 新建 EmployeeMapper.java
  1. package com.sunxiaping.mapper;
  2. import com.sunxiaping.domain.Employee;
  3. import org.apache.ibatis.annotations.Mapper;
  4. @Mapper
  5. public interface EmployeeMapper {
  6. Employee findById(Integer id);
  7. }
  • 新建 EmployeeMapper.xml
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.sunxiaping.mapper.EmployeeMapper">
  6. <select id="findById" resultType="com.sunxiaping.domain.Employee">
  7. SELECT id as id,last_name as lastName,gender as gender,email as email
  8. FROM employee
  9. WHERE id = #{id,jdbcType=INTEGER}
  10. </select>
  11. </mapper>
  • 新建 EmployeeService.java
  1. package com.sunxiaping.service;
  2. import com.sunxiaping.domain.Employee;
  3. public interface EmployeeService {
  4. Employee findById(Integer id);
  5. }
  • 新建 EmployeeServiceImpl.java
  1. package com.sunxiaping.service.impl;
  2. import com.sunxiaping.domain.Employee;
  3. import com.sunxiaping.mapper.EmployeeMapper;
  4. import com.sunxiaping.service.EmployeeService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. import org.springframework.transaction.annotation.Transactional;
  8. @Service
  9. @Transactional
  10. public class EmployeeServiceImpl implements EmployeeService {
  11. @Autowired
  12. private EmployeeMapper employeeMapper;
  13. @Override
  14. public Employee findById(Integer id) {
  15. return employeeMapper.findById(id);
  16. }
  17. }
  • 新建 EmployeeController.java
  1. package com.sunxiaping.web;
  2. import com.sunxiaping.domain.Employee;
  3. import com.sunxiaping.service.EmployeeService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.PathVariable;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. @RestController
  10. @RequestMapping(value = "/emp")
  11. public class EmployeeController {
  12. @Autowired
  13. private EmployeeService employeeService;
  14. @GetMapping(value = "/findById/{id}")
  15. public Employee findById(@PathVariable("id") Integer id){
  16. Employee employee = employeeService.findById(id);
  17. return employee;
  18. }
  19. }
  • 新建测试类:
  1. package com.sunxiaping;
  2. import com.sunxiaping.domain.Employee;
  3. import com.sunxiaping.service.EmployeeService;
  4. import com.sunxiaping.web.EmployeeController;
  5. import org.junit.Test;
  6. import org.junit.runner.RunWith;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.test.context.ContextConfiguration;
  9. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  10. @RunWith(SpringJUnit4ClassRunner.class)
  11. @ContextConfiguration(locations={"classpath:applicationContext.xml","classpath:springmvc.xml"})
  12. public class EmployeeTest {
  13. @Autowired
  14. private EmployeeService employeeService;
  15. @Autowired
  16. private EmployeeController employeeController;
  17. @Test
  18. public void test(){
  19. Employee employee = employeeService.findById(1);
  20. System.out.println("employee = " + employee);
  21. Employee employee1 = employeeController.findById(1);
  22. System.out.println("employee1 = " + employee1);
  23. }
  24. }