用惯了SSM,会发现配置文件是真的烦,既然有了化繁为简的工具Springboot,今天我们就来实践一下,体会一下Springboot搭建一个SSM的应用有多么方便。
配置环境如下:
jdk:1.7及以上,
maven:3.5.2
mybatis:3.4.5
mysql:5.5
首先搭建一个maven项目(下载maven3,然后配置环境变量,更改eclipse中的userSetting以及maven所在目录),
新建maven项目之后,会生成pom.xml。要使用mybatis,我们的配置文件可以按照这样来配置:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sgx</groupId>
<artifactId>SpringBoot</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>SpringBoot Maven Webapp</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- <dependency>
<groupId>org.activiti</groupId>
<artifactId>spring-boot-starter-basic</artifactId>
<version>5.17.0</version>
</dependency> -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency> -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>
主要是引入parent的依赖以及mysql的依赖和starter的依赖即可。下面是数据库的简单配置,
我们先下载Mysql的安装文件,本地安装了Mysql之后,
然后我们在resources下面新建一个application.properties,这个文件用来存放所有配置信息。
使用SSM需要的配置如下:
#Spring datasource && jpa
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mysql?charset=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.show-sql=true
mybatis.mapper-locations: classpath:mapper/*.xml
mybatis.type-aliases-package: com.sgx.model
主要是连接数据库以及mybatis编写XML文件的地方还有表结构映射的Java实体类存放的地方;
在Web应用中操作数据库的方法其实还是挺多的,Springboot官方推荐的是JPA
(使用hibernate来自动映射,不用手动建表)简化配置,这也是Springboot的初衷,
当然用惯了SSM的同学或者还不习惯HQL的同学可能会跟我一样选择mybatis而不是hibernate。
使用JPA自动建表需要引入我上面注释的那个JPA的依赖。
一、JDBCTemplate操作数据库
Spring官方传送门,这种方法好用是好用,但是把太多的SQL代码会写到实现类里面,
这样的话一旦业务逻辑复杂,代码里面会遍布SQL语句。
二、SSM
经过上面的配置,我们应该会得到类似下面的目录结构:
这是个标准的SSM开发的结构,现在我们启动Springboot应用,运行Application.class,
然后写一个测试类MyController:
package com.sgx.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.sgx.model.Customer;
import com.sgx.service.TestService;
@ResponseBody
@Controller
public class MyController {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private TestService testService;
@RequestMapping("/hello")
public String hello(){
System.out.println("hello,world!");
return "index";
}
@RequestMapping("/query/{name}")
public Customer query(@PathVariable String name){
String sql = "INSERT INTO CUSTOMER(NAME,GENDER,ADDRESS,PHONE) "
+ "VALUES('shigx','male','shanghai,putuo','110')";
jdbcTemplate.execute(sql);
System.out.println("INSERT INTO TABLE CUSTOMER SUCCESS");
return testService.query(name);
}
}
这个query方法里面,我先使用JDBCTemplate插入一条记录,然后调用TestService中的query方法,
package com.sgx.service;
import org.springframework.stereotype.Service;
import com.sgx.model.Customer;
@Service
public interface TestService {
public Customer query(String name);
}
package com.sgx.service.Impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.sgx.dao.CustomerMapper;
import com.sgx.model.Customer;
import com.sgx.service.TestService;
@Component
public class TestServiceImpl implements TestService{
@Autowired
private CustomerMapper customerMapper;
@Override
public Customer query(String name) {
return customerMapper.query(name);
}
}
这里调用了customerMapper中的query方法,这个mapper class要加注解,标注它是一个mapper,
或者在启动Application的时候,注解mapperScan扫描这个包也可以;
package com.sgx.dao;
import org.apache.ibatis.annotations.Mapper;
import com.sgx.model.Customer;
@Mapper
public interface CustomerMapper {
public Customer query(String name);
}
然后是我们的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.sgx.dao.CustomerMapper">
<resultMap id="CustomerMap" type="Customer" >
<result property="name" column="name" javaType="java.lang.String"/>
<result property="gender" column="gender" javaType="java.lang.String"/>
<result property="address" column="address" javaType="java.lang.String"/>
<result property="phone" column="phone" javaType="java.lang.String"/>
</resultMap>
<insert id="addCustomer" parameterType="Customer" useGeneratedKeys="true">
insert into customer(name,gender,address,phone) values
(#{name},#{gender},#{address},#{phone})
</insert>
<select id="query" resultMap="CustomerMap" parameterType="String">
select * from customer where name=#{name}
</select>
</mapper>
这样一来,controller中的方法最终其实就是这个XML中的query语句,结果就是去数据库查出这个对象
返回一个Customer对象,然后结果显示到页面。
测试:浏览器输入http://localhost:8080/query/shigx
返回结果会自动转成JSON:
OK,至此,测试成功,后面就是写业务代码了!