使用Spring Boot +JPA+mybatis快速启动一个web项目
新手的练手项目,欢迎指出不足之处;本次demo使用jpa的自动建表功能,加上spring boot 的强大集成能力快速搭建一个web项目,mybatis在此中的主要作用是为了实现动态sql语句的查询
首先通过STS创建一个spring boot项目
配置文件
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!--启用不严格检查html -->
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.22</version>
</dependency>
<!-- freemarker -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
我使用的是yml配置文件:
spring:
application:
name: demo #应用名称,与application.properities中保持一致
session:
store-type: none
datasource:
url: jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8
username: root
password:
driver-class-name: com.mysql.jdbc.Driver
jpa:
database: MYSQL
show-sql: true
generateDdl: false
properties:
hibernate:
hbm2ddl:
auto: update
server:
port: 8080 #Tomcat端口
session:
timeout: 14400 #Session超时(秒)-4h
#Freemark 配置#
freemarker:
request-context-attribute: req #req访问request
suffix: .html #后缀名
settings:
number_format: '0.##' #数字格式化,无小数点
thymeleaf:
mode: LEGACYHTML5
#mybatis
mybatis:
type-aliases-package: com.example.demo.Entity
接下来我们创建一个实体类
**一个简单的Human实体类,放在Entity下面
值得注意的是,spring 会自动扫描与application.java(含有main函数的那个)同级的包,所以建包时要注意包的位置
package com.example.demo.Entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import lombok.Data;
@Data
@Entity
public class Human {
@Id
@GeneratedValue
private int id;
private String name;
private int age;
}
然后是一个测试用的controller,在里面定义了一些RequestMapping
@RequestMapping("/testSelect")
public String testSql(Model map){
map.addAttribute("Humans", testService.findAll());
map.addAttribute("one", testService.findOneById(1));
return "select";
}
下面是Repository的实现
package com.example.demo.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import com.example.demo.Entity.Human;
import com.example.demo.mapper.TestMapper;
public interface HumanRepository extends JpaRepository<Human, Long>, CrudRepository<Human, Long>,TestMapper {
@Query(value="select * from human h where id=?",nativeQuery=true)
Human findOneById(int id);
}
刚开始的时候发现使用JPA实现动态sql语句查询有点麻烦,所以加入了mybatis
package com.example.demo.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider;
import com.example.demo.Entity.Human;
import com.example.demo.mapper.provide.TestProvide;
public interface TestMapper {
@Select("select * from human")
List<Human> findAll();
@SelectProvider(type=TestProvide.class,method="findWithCase")
List<Human> findHumanByName(Human human);
@Insert("insert into human(name,age) value(#{name},#{age})")
void id(Human human);//发现方法体的名字不能随意取,不然会报错,这里我也不知道为啥,欢迎大神来解惑,所以这里我就取了一个id的方法名
}
关于selectprovider
type指定提供方法的类,method指定所用的方法
package com.example.demo.mapper.provide;
import java.util.Map;
import org.apache.ibatis.jdbc.SQL;
import org.springframework.stereotype.Component;
import com.example.demo.Entity.Human;
import lombok.extern.slf4j.Slf4j;
@Component
@Slf4j
public class TestProvide {
public static final String tableName="human";
public String findWithCase(Human human){
SQL sql=new SQL().SELECT("*").FROM(tableName).WHERE("1=1");
log.info(human.getName()+":"+human.getAge());
if(human.getName()!=null){
sql.AND().WHERE("name='"+human.getName()+"'");
}
if(human.getAge()>0){
sql.AND().WHERE("age="+human.getAge());
}
String returnsql=sql.toString();
log.info(returnsql);
return returnsql;
}
}