阐述
JPA和mybatis不能在同一个dao文件里!!!
JPA:JPA 全称是Java 持久化 API ,它的目的就是帮助我们提高开发效率,它的核心是 Java持久化查询语言 (JPQL),对存储在关系数据库中的实体进行查询。在语法上类似于SQL查询,但是操作的是实体对象而不是直接对数据库表进行操作。(摘自 wiki)
使用 JPA 开发的流程如下:
1、将数据库表映射到项目实体中
2、生成对应的 Repository
3、实现 Service ,Controller 中调用 Repository
简单的逻辑用JPA很省事,但是比较复杂的逻辑用JPA就会效率比较慢并且还要掌握它的语法,所以我这里采用mybatis来处理较复杂的逻辑。下面是整合SpringBoot、mybatis和Jpa的过程。
整合过程
1、创建SpringBoot项目
·
pom文件
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.jpa</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--freemarker模板 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!--Lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<!--设置Mapper映射可在java或者resources文件夹下-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>
2、把application.properties改成yml后缀,内容如下:
server:
port: 8080 #端口
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/jpa?useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai #数据库地址
username: root #用户名
password: 123456 #密码
driver-class-name: com.mysql.cj.jdbc.Driver #驱动,注意mysql数据库版本
jpa:
database: mysql
show-sql: true
generate-ddl: true
3、创建数据库
/*
Navicat Premium Data Transfer
Source Server : lele
Source Server Type : MySQL
Source Server Version : 50718
Source Host : localhost:3306
Source Schema : jpa
Target Server Type : MySQL
Target Server Version : 50718
File Encoding : 65001
Date: 27/12/2019 15:28:44
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '1', '1');
SET FOREIGN_KEY_CHECKS = 1;
4、创建User实体类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity//指定实体类,必须指定@id
@Table(name = "user")//指定表名
@Data//编译后自动生成所有属性的get\set方法、toString方法、hashCode方法、equals方法
@AllArgsConstructor//编译后自动生成全参构造
@NoArgsConstructor//编译后自动生成无参构造
public class User {
@Id//主键
@GeneratedValue(strategy = GenerationType.IDENTITY)//自增
private int uid;
private String username;
private String password;
}
创建UserDao类,使用JPA
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserDao extends JpaRepository<User,Integer> { }
创建MyUserMapper
import com.jpa.demo.dao.User;
import org.springframework.stereotype.Component;
import java.util.List;
@Component(value = "MyUserMapper")
public interface MyUserMapper{
List<User> getMyUserList();
}
创建MyUserMapper.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.jpa.demo.mapper.MyUserMapper">
<select id="getMyUserList" resultType="com.jpa.demo.dao.User">
select * from user
</select>
</mapper>
创建MyUserController
import com.jpa.demo.dao.User;
import com.jpa.demo.dao.UserDao;
import com.jpa.demo.mapper.MyUserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.List;
@Controller
@RequestMapping("/myuser")
public class MyUserController {
@Autowired
private MyUserMapper myUserMapper;
@Autowired
private UserDao userDao;
@RequestMapping(value = "/getMyUserList",method = RequestMethod.GET)
public String getMyUserList(Model model){
List<User> userList = myUserMapper.getMyUserList();
List<User> userList1 = userDao.findAll();
model.addAttribute("userList",userList); //模板的使用
return "myuser1";
}
}
在resource/templates创建myuser1.html
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head lang="en">
<meta charset="UTF-8"/>
<title>Title</title>
</head>
<body>
<h2 th:text="${userList}">Hello World</h2>
</body>
</html>
启动后访问得到