@
目录
ORM
JDBC
Spring对ORM的解决方案主要体现在以下方面:
Spring
Spring Data JPA
Mybatis
在IntelliJ IDEA中创建新项目
IntelliJ IDEA
通过地址<https://start.spring.io/>初始化项目;
<https://start.spring.io/>
指定项目通用信息:
选择项目依赖Starter:
Starter
生成的项目结构:
DROP DATABASE IF EXISTS user_info; CREATE DATABASE user_info DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; use user_info; SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1;
<!--Mysql依赖包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> <scope>runtime</scope> </dependency> <!-- 数据库连接池:druid数据源驱动 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency>
###数据源配置 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource username: root password: root driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy url: jdbc:log4jdbc:mysql://localhost:3306/user_info?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
<!--pom.xml--> <!--Spring Data JPA--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency>
/** * 用户类--映射表user * * @author zhuhuix */ @Entity @Table(name="user_info") public class User implements Serializable { // 用户id @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 用户名 @NotBlank(message = "用户名称不能为空") @Column(name="name") private String name; // 邮箱 @Column(name="email") @Pattern(message ="邮箱格式不符", regexp = "^[A-Za-z0-9\\u4e00-\\u9fa5]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$") private String email; public User(Long id, String name, String email) { this.id = id; this.name = name; this.email = email; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
CrudRepository
/** * 基于SpringMVC框架开发web应用--数据操作层 */ public interface UserRepository extends CrudRepository<User,Long> { }
public interface CrudRepository<T, ID> extends Repository<T, ID> { <S extends T> S save(S var1); <S extends T> Iterable<S> saveAll(Iterable<S> var1); Optional<T> findById(ID var1); boolean existsById(ID var1); Iterable<T> findAll(); Iterable<T> findAllById(Iterable<ID> var1); long count(); void deleteById(ID var1); void delete(T var1); void deleteAll(Iterable<? extends T> var1); void deleteAll(); }
MyBatis
/** * mybatis数据层接口 * */ @Repository public interface UserMapper { // 自定义添加通过用户名称模糊查找用户信息 List<User> findByName(String name); }
<?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.example.demo.mybatis.UserMapper"> <!-- 自定义模糊查找 SQL --> <select id="findByName" resultType="com.example.demo.register.User"> select * from user where name like concat('%',#{name},'%') </select> </mapper>
application.yml
mapper
#MyBatis扫描mapper文件配置 mybatis: mapper-locations: classpath:mapper/*Mapper.xml
@SpringBootApplication @MapperScan(basePackages = "com.example.demo.register") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
/** * 调用Spring Data JPA和Mybatis接口进行业务处理 */ @Service public class UserService { // Spring Data JPA @Autowired private UserRepository userRepository; // Mybatis @Autowired private UserMapper userMapper; // 返回所有的用户 public List<User> listUsers() { return (List<User>) userRepository.findAll(); } // 保存用户 public User saveUser(User user) { return userRepository.save(user); } // 删除用户 public void deleteUser(Long id) { userRepository.deleteById(id); } // 查找用户 public User findUser(Long id) { return userRepository.findById(id).get(); } // 根据名称查找用户--Mybatis public List<User> searchUser(String name) { return userMapper.findByName(name); } }
控制器的主要职责是处理HTTP请求传递给视图以便于渲染浏览器展现。
HTTP
SpirngMVC的请求注解
SpirngMVC
/** * 用户控制器 */ @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; // 保存用户并返回到用户列表页面 @PostMapping public ModelAndView saveUser(@Valid User user, Errors errors, Model model) { if (errors.hasErrors()) { model.addAttribute("user", user); if (errors.getFieldError("name") != null) { model.addAttribute("nameError", errors.getFieldError("name").getDefaultMessage()); } if (errors.getFieldError("email") != null) { model.addAttribute("emailError", errors.getFieldError("email").getDefaultMessage()); } return new ModelAndView("register", "userModel", model); } userService.saveUser(user); //重定向到list页面 return new ModelAndView("redirect:/user"); } // 获取用户操作表单页面 @GetMapping("/form") public ModelAndView createForm(Model model, @RequestParam(defaultValue = "0") Long id) { if (id > 0) { model.addAttribute("user", userService.findUser(id)); } else { model.addAttribute("user", new User()); } return new ModelAndView("register", "userModel", model); } // 获取用户列表显示页面 @GetMapping public ModelAndView list(Model model) { model.addAttribute("userList", userService.listUsers()); return new ModelAndView("userlist", "userModel", model); } // 模糊查找输入页面 @GetMapping("/index") public ModelAndView index(Model model) { model.addAttribute("user", new User()); return new ModelAndView("index", "userModel", model); } // 查找提交并跳转用户列表 @PostMapping("/search") public ModelAndView search(@ModelAttribute User user, Model model) { model.addAttribute("userList", userService.searchUser(user.getName())); return new ModelAndView("userlist", "userModel", model); } // 删除用户 @RequestMapping(path = "/del") public ModelAndView del(@RequestParam(name = "id") Long id) { userService.deleteUser(id); return new ModelAndView("redirect:/user"); } }
Thymeleaf
th:each
HTML
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultrag.net.nz/thymeleaf/layout" > <head> <meta charset="UTF-8"> </head> <body> <h3>用户列表</h3> <div> <a th:href="@{/user/form}">创建用户</a> <a th:href="@{/user/index}">查找用户</a> </div> <table border="1"> <thead> <tr> <td>ID</td> <td>邮箱</td> <td>名称</td> <td>操作</td> </tr> </thead> <tbody> <tr th:if="${userModel.userList.size()} eq 0"> <td colspan="3">没有用户信息!</td> </tr> <tr th:each="user:${userModel.userList}"> <td th:text="${user.id}"></td> <td th:text="${user.email}"></td> <td th:text="${user.name}"></td> <td><a th:href="@{/user/form(id=${user.id})}"> 修改 </a> <a th:href="@{/user/del(id=${user.id})}"> 删除 </a></td> </tr> </tbody> </table> </body> </html>
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultrag.net.nz/thymeleaf/layout" > <head> <meta charset="UTF-8"> </head> <body> <h3>登记用户</h3> <form action="/users" th:action="@{/user}" method="POST" th:object="${userModel.user}"> <input type="hidden" name="id" th:value="*{id}"> 名称:<br> <input type="text" name="name" th:value="*{name}"> <br> 邮箱:<br> <input type="text" name="email" th:value="*{email}"> <input type="submit" value="提交" > </form> </body> </html>
<!-- index.html--> <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org" > <head> <meta charset="UTF-8"/> <title>Title</title> </head> <body> <h3>查找用户</h3> <form action="/users" th:action="@{/user/search}" method="POST" th:object="${userModel.user}"> 名称:<br> <input type="text" name="name" th:value="*{name}" > <br> <input type="submit" value="查询" > </form> </body> </html>
该web应用一切运行正常。
原文链接:https://www.cnblogs.com/zhuhuix/p/13475758.html