值不值 | 三分鐘搞定Jpa?值不值!
本文轉(zhuǎn)載自微信公眾號「小明菜市場」,作者+小明菜市場。轉(zhuǎn)載本文請聯(lián)系小明菜市場公眾號。
數(shù)據(jù)準(zhǔn)備
數(shù)據(jù)庫使用的數(shù)據(jù)表設(shè)計(jì)如下
建表語句如下
- SET NAMES utf8mb4;
 - SET FOREIGN_KEY_CHECKS = 0;
 - -- ----------------------------
 - -- Table structure for t_user
 - -- ----------------------------
 - DROP TABLE IF EXISTS `t_user`;
 - CREATE TABLE `t_user` (
 - `id` int(11) NOT NULL AUTO_INCREMENT,
 - `user_name` varchar(255) DEFAULT NULL,
 - `password` varchar(255) DEFAULT NULL,
 - `last_login_time` datetime DEFAULT NULL,
 - `sex` tinyint(4) DEFAULT NULL,
 - PRIMARY KEY (`id`)
 - ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=armscii8;
 - -- ----------------------------
 - -- Records of t_user
 - -- ----------------------------
 - BEGIN;
 - INSERT INTO `t_user` VALUES (1, 'json', '123', '2019-07-27 16:01:21', 1);
 - INSERT INTO `t_user` VALUES (2, 'jack jo', '123', '2019-07-24 16:01:37', 1);
 - INSERT INTO `t_user` VALUES (3, 'manistal', '123', '2019-07-24 16:01:37', 1);
 - INSERT INTO `t_user` VALUES (4, 'landengdeng', '123', '2019-07-24 16:01:37', 1);
 - INSERT INTO `t_user` VALUES (5, 'max', '123', '2019-07-24 16:01:37', 1);
 - COMMIT;
 - SET FOREIGN_KEY_CHECKS = 1;
 
新建 Spring Boot 工程
選擇 File -> New -> Project 選擇 Spring Initializr,選擇 next 填寫包名,項(xiàng)目名,選擇下一步。選擇依賴,Spring web starter 前面打鉤,sql 選項(xiàng)為 Spring Data Jpa,MySql 項(xiàng)目名任意
引入 Pom配置
- <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-webflux</artifactId>
 - </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>
 - </dependency>
 - <dependency>
 - <groupId>io.projectreactor</groupId>
 - <artifactId>reactor-test</artifactId>
 - <scope>test</scope>
 - </dependency>
 - </dependencies>
 
編寫配置文件 application.yml
- server:
 - port: 8086
 - spring:
 - #通用的數(shù)據(jù)源配置
 - datasource:
 - driverClassName: com.mysql.jdbc.Driver
 - url: jdbc:mysql://localhost:3306/demo_test?useSSL=false&useUnicode=true&characterEncoding=utf8
 - username: root
 - password: 123
 - jpa:
 - #這個(gè)參數(shù)是在建表的時(shí)候,將默認(rèn)的存儲引擎切換為 InnoDB 用的
 - database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
 - #配置在日志中打印出執(zhí)行的 SQL 語句信息。
 - show-sql: true
 - hibernate:
 - #配置指明在程序啟動(dòng)的時(shí)候要?jiǎng)h除并且創(chuàng)建實(shí)體類對應(yīng)的表
 - ddl-auto: create
 
編寫示例代碼
新建實(shí)體對象 UserDao.java
實(shí)體類,需要使用 @Entity 注解標(biāo)注 需要對實(shí)體類的屬性進(jìn)行標(biāo)注,使用 @Id 標(biāo)注組件 使用 @Column 標(biāo)注非主鍵
- /**
 - * 用戶實(shí)體類
 - * */
 - @Entity
 - @Table(name="t_user")
 - public class UserDO {
 - @Id
 - private Integer id;
 - @Column(name="user_name",length = 200)
 - private String userName;
 - @Column(name="password",length = 200)
 - private String password;
 - @Column(name="sex")
 - private Integer sex;
 - @Column(name="last_login_time")
 - private Date lastLoginTime;
 - public Integer getId() {
 - return id;
 - }
 - public void setId(Integer id) {
 - this.id = id;
 - }
 - public String getUserName() {
 - return userName;
 - }
 - public void setUserName(String userName) {
 - this.userName = userName;
 - }
 - public String getPassword() {
 - return password;
 - }
 - public void setPassword(String password) {
 - this.password = password;
 - }
 - public Integer getSex() {
 - return sex;
 - }
 - public void setSex(Integer sex) {
 - this.sex = sex;
 - }
 - public Date getLastLoginTime() {
 - return lastLoginTime;
 - }
 - public void setLastLoginTime(Date lastLoginTime) {
 - this.lastLoginTime = lastLoginTime;
 - }
 - }
 
新建倉庫接口類 UserRepository
倉庫接口類,UserRepository 是我們常用的 Dao 接口,需要注意
- 使用 @Repository 注解
 - 繼承 JPARepository
 - UserRepository 不需要編寫任何代碼,即可實(shí)現(xiàn)增刪查改
 
- @Repository
 - public interface UserRepository extends JPARepository<UserDO,Integer> {
 - }
 
編寫測試用例
在
- src/test/java/com/fishpro/jpa/
 
下,新增加
- UserRepositoryTest.java
 
使用
- @RunWith(SpringRunner.class)
 
和
- @SpringBootTest
 
注解標(biāo)注類。
- @RunWith(SpringRunner.class)
 - @SpringBootTest
 - public class UserRepositoryTest{
 - }
 
新增加用戶數(shù)據(jù)
- /**
 - * 初始化一個(gè)對象 UserDO 測試Insert過程
 - * */
 - @Before
 - public void before(){
 - UserDO userDO=new UserDO();
 - userDO.setId(1);
 - userDO.setUserName("fishpro");
 - userDO.setSex(1);
 - userDO.setLastLoginTime(new Date());
 - userDO.setPassword("passWord");
 - userRepository.save(userDO);
 - }
 
查詢單個(gè)用戶數(shù)據(jù)
- @Test
 - public void testFind(){
 - Optional<UserDO> optionalUserDO=userRepository.findById(1);
 - if(optionalUserDO.isPresent()){
 - UserDO userDO=optionalUserDO.get();
 - System.out.println("testFind user"+userDO.getUserName());
 - }
 - }
 
查詢多個(gè)數(shù)據(jù)
- @Test
 - public void testFindAll(){
 - List<UserDO> list=userRepository.findAll();
 - for (UserDO user:list
 - ) {
 - System.out.println("user_name:"+user.getUserName());
 - }
 - }
 
更新數(shù)據(jù)
- @Test
 - public void testUpdate(){
 - Optional<UserDO> optionalUserDO=userRepository.findById(1);
 - if(optionalUserDO.isPresent()){
 - UserDO userDO=optionalUserDO.get();
 - userDO.setUserName("fishpro001");
 - userRepository.save(userDO);
 - System.out.println("testFind user"+userDO.getUserName());
 - }
 - }
 
刪除數(shù)據(jù)
- @After
 - public void after(){
 - userRepository.deleteById(1);
 - userRepository.deleteById(2);
 - userRepository.deleteById(3);
 - }
 
聯(lián)合主鍵
例如定義表中userId,roleId 都是主鍵,此時(shí)這樣設(shè)置
1.定義一個(gè)主鍵類
- public class UserRoleKey implements Serializable {
 - private Integer userId;
 - private Integer roleId;
 - }
 
2.定義實(shí)體類
- @Entity
 - @Table(name="t_user_role")
 - @IdClass(UserRoleKey.class) //注意這里是引入了 定義的符合主鍵類
 - public class UserRoleDO {
 - @Id
 - private Integer userId;
 - @Id
 - private Integer roleId;
 - public Integer getUserId() {
 - return userId;
 - }
 - public void setUserId(Integer userId) {
 - this.userId = userId;
 - }
 - public Integer getRoleId() {
 - return roleId;
 - }
 - public void setRoleId(Integer roleId) {
 - this.roleId = roleId;
 - }
 - }
 
















 
 
 











 
 
 
 