运用springboot +spring+springMVC+Mybatis 构建一个简单的web app 接口
spring特性IOC(inversion of content 控制反转)通过对代码的依赖注入,实体对象类自动new,降低代码间的耦合度(结合度),增大代码活性
AOP特性(aspect orient programming 面向切面编程)具象的解释就是,把代码想象成一个实体球,用刀切一刀,往切口注入碎片代码,这样增大代码的复用性
SpringMVC是小型MVC框架,也可以用structs代替,但是structs的对应的页面对象会非常的繁重
Mybatis 数据库的映射,封装了比较完善的数据库日志,事务代码,可以将注意力集中到增加sql语句的效率上
安装环境:java 1.8+ maven eclipse
框架目录结构
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 <groupId>com.shiyanlou</groupId> 6 <artifactId>springboot</artifactId> 7 <version>0.0.1-SNAPSHOT</version> 8 <packaging>jar</packaging> 9 <name>springboot</name> 10 <description>Demo project for Spring Boot</description> 11 <!--设置父模块 这样就可以继承父模块中的配置信息--> 12 <parent> 13 <groupId>org.springframework.boot</groupId> 14 <artifactId>spring-boot-starter-parent</artifactId> 15 <version>2.0.4.RELEASE</version> 16 <relativePath/> 17 </parent> 18 <properties> 19 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 20 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 21 <java.version>1.8</java.version> 22 </properties> 23 <dependencies> 24 <!--添加web依赖--> 25 <dependency> 26 <groupId>org.springframework.boot</groupId> 27 <artifactId>spring-boot-starter-web</artifactId> 28 </dependency> 29 <dependency> 30 <groupId>org.mybatis.spring.boot</groupId> 31 <artifactId>mybatis-spring-boot-starter</artifactId> 32 <version>1.3.2</version> 33 </dependency> 34 <dependency> 35 <groupId>mysql</groupId> 36 <artifactId>mysql-connector-java</artifactId> 37 </dependency> 38 </dependencies> 39 <build> 40 <plugins> 41 <!--spirng Boot maven插件--> 42 <plugin> 43 <groupId>org.springframework.boot</groupId> 44 <artifactId>spring-boot-maven-plugin</artifactId> 45 </plugin> 46 </plugins> 47 </build> 48 </project>
在entity底下新建类文件,user.java
1 package com.shiyanlou.springboot.entity; 2 import java.io.Serializable; 3 public class User implements Serializable { 4 private Integer id; 5 private String username; 6 private String password; 7 public Integer getId() { 8 return id; 9 } 10 public void setId(Integer id) { 11 this.id = id; 12 } 13 public String getUsername() { 14 return username; 15 } 16 public void setUsername(String username) { 17 this.username = username; 18 } 19 public String getPassword() { 20 return password; 21 } 22 public void setPassword(String password) { 23 this.password = password; 24 } 25 @Override 26 public String toString() { 27 return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; 28 } 29 }
dao层,新建一个basemapper.java 用于被继承
1 package com.shiyanlou.springboot.dao; 2 import java.util.List; 3 public interface BaseMapper<T> { 4 /** 5 * 保存 6 */ 7 Integer save(T t); 8 /** 9 * 删除 10 */ 11 void delete(Integer id); 12 /** 13 * 通过id查询 14 */ 15 T findById(Integer id); 16 /** 17 * 更新 18 */ 19 void update(T t); 20 /** 21 * 返回所有信息 22 */ 23 List<T> list(); 24 }
同dao层,建立一个usermapper.java 继承basemapper.java
1 package com.shiyanlou.springboot.dao; 2 import com.shiyanlou.springboot.entity.User; 3 public interface UserMapper extends BaseMapper<User> { 4 }
在resource文件中建立映射文件夹(mapper),在mapper中建立user实体的映射文件usermapper.xml,sql语句的实现
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > 3 <mapper namespace="com.shiyanlou.springboot.dao.UserMapper"> 4 <select id="list" resultType="com.shiyanlou.springboot.entity.User"> 5 select * 6 from user 7 </select> 8 <select id="findById" parameterType="int" resultType="com.shiyanlou.springboot.entity.User"> 9 select * 10 from user 11 where id = #{value} 12 </select> 13 <update id="update" parameterType="com.shiyanlou.springboot.entity.User"> 14 update user 15 <set> 16 <if test="username!=null and username!=''"> 17 username=#{username}, 18 </if> 19 <if test="password!=null and password!=''"> 20 `password`=#{password} 21 </if> 22 </set> 23 where id=#{id} 24 </update> 25 <delete id="delete" parameterType="int"> 26 delete 27 from user 28 where id = #{value} 29 </delete> 30 <insert id="save" parameterType="com.shiyanlou.springboot.entity.User" keyColumn="id" keyProperty="id" 31 useGeneratedKeys="true"> 32 insert into user (username, `password`) 33 values (#{username}, #{password}) 34 </insert> 35 </mapper>
service层,将service常用的方法抽象出来,减少重复的代码,建立接口文件 ibaseservice.java
1 package com.shiyanlou.springboot.service; 2 import java.util.List; 3 public interface IBaseService<T> { 4 /** 5 * 保存 6 */ 7 Integer save(T t); 8 /** 9 * 删除 10 */ 11 void delete(Integer id); 12 /** 13 * 通过id查询 14 */ 15 T findById(Integer id); 16 /** 17 * 更新 18 */ 19 void update(T t); 20 /** 21 * 返回所有信息 22 */ 23 List<T> list(); 24 }
在service文件夹内建立服务接口实现类的文件夹impl
在文件夹内建立类文件ibaseserviceimpl.java实现接口
1 package com.shiyanlou.springboot.service.impl; 2 import com.shiyanlou.springboot.dao.BaseMapper; 3 import com.shiyanlou.springboot.service.IBaseService; 4 import org.springframework.beans.factory.annotation.Autowired; 5 import org.springframework.transaction.annotation.Transactional; 6 import java.util.List; 7 @Transactional(rollbackFor = Exception.class) 8 public abstract class BaseServiceImpl<T> implements IBaseService<T> { 9 @Autowired 10 protected BaseMapper<T> baseMapper; 11 @Override 12 public void delete(Integer id) { 13 baseMapper.delete(id); 14 } 15 @Override 16 public Integer save(T t) { 17 return baseMapper.save(t); 18 } 19 @Override 20 public void update(T t) { 21 baseMapper.update(t); 22 } 23 @Override 24 public T findById(Integer id) { 25 return baseMapper.findById(id); 26 } 27 @Override 28 public List<T> list() { 29 return baseMapper.list(); 30 } 31 }
在service文件夹内建立接口iuserservice.java
1 package com.shiyanlou.springboot.service; 2 import com.shiyanlou.springboot.entity.User; 3 public interface IUserService extends IBaseService<User> { 4 }
在service/impl底下建立userserviceimpl.java实现user接口,如果对baseserviceimpl中的默认的方法不满意可以新增或者覆盖
1 package com.shiyanlou.springboot.service.impl; 2 import com.shiyanlou.springboot.entity.User; 3 import com.shiyanlou.springboot.service.IUserService; 4 import org.springframework.stereotype.Service; 5 @Service 6 public class UserServiceImpl extends BaseServiceImpl<User> implements IUserService { 7 }
控制层controller文件中添加usercontroller.java文件
1 package com.shiyanlou.springboot.controller; 2 import com.shiyanlou.springboot.entity.User; 3 import com.shiyanlou.springboot.service.IUserService; 4 import org.springframework.beans.factory.annotation.Autowired; 5 import org.springframework.web.bind.annotation.*; 6 import java.util.List; 7 @RestController 8 @RequestMapping("user") 9 public class UserController { 10 private final IUserService userService; 11 @Autowired 12 public UserController(IUserService userService) { 13 this.userService = userService; 14 } 15 //使用post请求新建 16 @PostMapping() 17 public String save(User user) { 18 userService.save(user); 19 return "save success"; 20 } 21 //使用put请求更新 会拦截类似/user/1这种形式的路径 22 @PutMapping("{id}") 23 public String update(User user, @PathVariable int id) { 24 //当数据不存在时,不允许更新 25 if (userService.findById(id) == null) { 26 return "Not Exist"; 27 } 28 //防止传入的id不一致,如user中id属性是2,而url路径中id为1; 29 if (user.getId() != id) { 30 return "Unmatched parameters"; 31 } 32 userService.update(user); 33 return "update success"; 34 } 35 //使用delete请求删除 36 @DeleteMapping("{id}") 37 public String delete(@PathVariable int id) { 38 userService.delete(id); 39 return "delete success"; 40 } 41 //使用get方法查询 42 @GetMapping() 43 public List<User> list() { 44 return userService.list(); 45 } 46 //使用get方法查询单个数据 47 @GetMapping("{id}") 48 public User getById(@PathVariable int id) { 49 return userService.findById(id); 50 } 51 }
配置文件application.propertise
1 spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password= spring.datasource.driver-class-name=com.mysql.jdbc.Driver #mapper xml文件位置 mybatis.mapper-locations=classpath:mapper/*.xml
springboot启动文件建立 springbootapplication.java 在springboot文件底下
1 package com.shiyanlou.springboot; 2 import org.mybatis.spring.annotation.MapperScan; 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 @SpringBootApplication //扫描mapper接口位置 6 @MapperScan(basePackages = {"com.shiyanlou.springboot.dao"}) 7 public class SpringbootApplication { 8 public static void main(String[] args) { 9 SpringApplication.run(SpringbootApplication.class, args); 10 } 11 }
这样简单的接口就简单的建成了
感谢老师 www.shiyanlou.com