spring mvc (resultful 方式)+ spring + mybatis 整合

第1步 pom 依赖(明白每个jar包属于哪个框架,作用是什么就行了,不用自己写)

<!-- spring 依赖, 已经间接依赖的 spring-context -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.9.RELEASE</version>
</dependency>
<!-- 已经间接依赖了 spring-tx -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.9.RELEASE</version>
</dependency>
<!-- json 转换 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.5</version>
</dependency>
<!-- 连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.17</version>
</dependency>
<!-- mybatis 整合 spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.0</version>
</dependency>
<!-- mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.48</version>
</dependency>
<!-- servlet -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
<!-- JDK高于8需要加入 高版本 jdk 需要它@PostConstruct @PreDestroy -->
    <!--      
    <dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>javax.annotation-api</artifactId>
        <version>1.3.2</version>
    </dependency>
   -->
​
<!-- tomcat 插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>8080</port>
                    <path>/</path>
                    <uriEncoding>utf-8</uriEncoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

第2步 编写 applicationContext.xml(spring.xml) 配置文件

  • 配置数据源 (连接池)(dataSource)

  • mybatis (sqlSessionFactory, 扫描 mapper)

  • service 的扫描

  • 事务管理(transacationManager, 事务注解驱动)

    #连接数据库的信息,内部信息根据自己数据库信息更改
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql:///db1?useSSL=false&amp;useServerPrepStmts=true
    jdbc.username=root
    jdbc.password=1234

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    
    <!-- 让spring 每次执行sql脚本,将sql环境设置为初始状态
        注意:只用于测试环境
    -->
    <!--
    <jdbc:initialize-database>
        <jdbc:scriptlocation="classpath:db.sql"/>
    </jdbc:initialize-database>
    -->
    
    <!-- 1.数据源配置 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    
    <!-- destroy-method="close"销毁方法,建议配置 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
​
    <!-- 2. mybatis -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
    </bean>
<!-- 扫描mapper -->
    <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.whguanggu.mapper"/>
    </bean>
​
    <!--    3. 扫描 service-->
    <context:component-scan base-package="com.whguanggu.service"/>
​
    <!-- 4. 配置事务 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
<!-- 注意尾  /tx -->
    <tx:annotation-driven/>
</beans>

第3步 编写 springmvc.xml 配置文件

  • controller 的扫描

  • mvc 的注解驱动

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
​
    <!-- 1. 扫描 controller -->
    <context:component-scan base-package="com.itheima.controller"/>
​
    <!-- 2. mvc 注解驱动 -->
    <mvc:annotation-driven/>
​
    <!-- 3. 如果是 jsp 开发,需要配置视图解析器 -->
    <!--<mvc:view-resolvers>
        <mvc:jsp prefix="前缀" suffix=".jsp"/>
    </mvc:view-resolvers>-->
​
    <!-- 4. 拦截器 -->
    <!--<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/拦截路径"/>
            <ref bean="拦截器 bean id"/>
        </mvc:interceptor>
    </mvc:interceptors>-->
</beans>

第4步 编写 web.xml 配置文件

  • DispatcherServlet 创建 springmvc 容器

  • ContextLoaderListener 创建 applicationContext(spring)容器

  • 字符编码过滤器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
​
    <!-- 1. 配置 springmvc 容器 -->
    <servlet>
        <servlet-name>mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>mvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
​
    <!-- 2. 配置监听器,作用创建 applicationContext spring 容器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 用来指定 spring 配置文件的路径 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
​
    <!-- 3. 字符编码过滤器 -->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

第5步编写代码

顺序:domain -> mapper -> service -> controller

domain

public class Role {
    private Integer id;
    private String name;
    private Date createTime;
    private Date updateTime;
    // ...
}

mapper 接口(增删改查)

public interface RoleMapper {
​
    // 查询所有角色
    public List<Role> findAll();
​
    // 新增角色
    public void save(Role role);
}

mapper xml

<?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.itheima.mapper.RoleMapper">
​
    <!-- 查询方法 -->
    <select id="findAll" resultMap="RoleMap">
        select * from spring_role
    </select>
​
    <resultMap id="RoleMap" type="com.itheima.domain.Role">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
    </resultMap>
​
    <!-- useGeneratedKeys 是否使用数据库自动生成的主键
         keyProperty 说主键属性是哪个?
    -->
    <insert id="save" parameterType="com.itheima.domain.Role" useGeneratedKeys="true" keyProperty="id">
        insert into spring_role values(null, #{name}, #{createTime}, #{updateTime})
    </insert>
</mapper>

service

@Service
public class RoleService {
​
    @Autowired
    private RoleMapper roleMapper;
​
    public List<Role> findAll() {
        return roleMapper.findAll();
    }
​
    @Transactional
    public void save(Role role) {
        roleMapper.save(role);
    }
}

controller

@RestController
public class RoleController {
​
    @Autowired
    private RoleService roleService;
​
    @GetMapping("/roles")
    public Result findAll() {
        List<Role> list = roleService.findAll();
        Result result = new Result();
        result.setData(list);
        result.setMsg("查询所有角色成功");
        int i = 1 / 0;
        return result;
    }
​
    @PostMapping("/roles")
    public Result save(@RequestBody Role role) { // json
        Date now = new Date();
        role.setCreateTime(now);
        role.setUpdateTime(now);
        roleService.save(role);
​
        Result result = new Result();
        result.setMsg("添加角色成功");
        return result;
    }
​
}

统一结果

public class Result {
​
    private String msg; // 信息
    private int code; // 错误码
    private Object data; // 数据
    // ...
    
}

统一异常处理

@RestControllerAdvice//  @ControllerAdvice + @ResponseBody
public class GlobalExceptionHandler {
​
    @ExceptionHandler
    public Result handle(Exception e) {
        e.printStackTrace();
​
        Result result = new Result();
        result.setCode(999);
        result.setMsg(e.getMessage());
        return result;
    }
}

maven 继承(*)

属性继承

<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
</properties>

强制依赖继承

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

可选依赖继承

父模块

<!-- 可选依赖继承(意义在于用父模块统一管理了版本) -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.9.RELEASE</version>
        </dependency>
    </dependencies>
</dependencyManagement>

子模块

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
</dependencies>

排除依赖

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.7.1</version>
    <!-- 用来排除一些间接依赖 -->
    <exclusions>
        <exclusion>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
        </exclusion>
    </exclusions>
</dependency>

插件

测试插件

跳过测试

  1. 方法1: 点击 idea 中 maven 闪电按钮(底层加了 -DskipTests=true)

  2. 方法2:通过插件配置

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.4</version>
            <configuration>
                <!--<includes>**/TestM*.java</includes>  包含的测试类--> 
                <excludes>**/TestM*.java</excludes> <!-- 排除的测试类 -->
            </configuration>
        </plugin>
    </plugins>
</build>

资源插件

作用1:

<properties>
    <!-- 拷贝资源时的字符编码 -->
    <project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
</properties>

作用2:做占位符的替换

<properties>
    <host>www.baidu.com</host>
</properties>
​
<build>
​
    <resources>
        <resource>
            <!-- 表示 src/main/resources 下所有资源时,执行 ${} 占位符的替换操作 -->
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

用自定义标签的值,替换掉 ${host} 占位符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄辛华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值