SpringBoot整合JPA-Hibernate(二)

项目结构

在这里插入图片描述

1.为项目添加依赖

上一篇中已经建好了项目,接下来我们为项目添加依赖
pom.xml

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--jpa-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        
        <!--jackson  解决使用jackson将对象json化的时候出现的错误 -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9</version>
        </dependency>

2.修改application.properties,配置相关信息

application.properties

# db
spring.datasource.url=jdbc:mysql://localhost:3306/user
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# jpa 让控制器输出json字符串格式
spring.jackson.serialization.indent-output=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect

3.创建实体类

User.java

package com.wd.demo.entity;

import lombok.Data;
import javax.persistence.*;

@Data  //自动生成get set方法
@Entity  //自动生成相应的表,表名默认与实体类名相同   (JPA)
@Table(name = "user")
//@JsonIgnoreProperties(value = {"handler","hibernateLazyInitializer","fieldHandler"})
public class User {

    @Id  //设置主键
    @GeneratedValue(strategy = GenerationType.IDENTITY) //自动增长
    private Integer userId;

    // @Column 指定在表中的名字,默认与属性名相同
    private String userName;
    private String userPassword;
    private Integer userAge;
    private String userPhone;
}

4.创建Dao

IUserDao.java

package com.wd.demo.dao;

import com.wd.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

//Jpa提供了增删改查的功能
public interface IUserDao extends JpaRepository<User, Integer>{  //第一个泛型为实体类,第二个为实体类的主键类型
}

在这里看看JpaRepository的源代码

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.data.jpa.repository;

import java.util.List;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;

@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
    List<T> findAll();

    List<T> findAll(Sort var1);

    List<T> findAllById(Iterable<ID> var1);

    <S extends T> List<S> saveAll(Iterable<S> var1);

    void flush();

    <S extends T> S saveAndFlush(S var1);

    void deleteInBatch(Iterable<T> var1);

    void deleteAllInBatch();

    T getOne(ID var1);

    <S extends T> List<S> findAll(Example<S> var1);

    <S extends T> List<S> findAll(Example<S> var1, Sort var2);
}

5.创建Service

创建接口IUserService.java

package com.wd.demo.service;

import com.wd.demo.entity.User;

public interface IUserService {

    /**
     * 添加新用户
     * @param user
     */
    void addUser(User user);

    /**
     * 根据ID查找用户信息
     * @param id
     * @return
     */
    User findUserById(Integer id);

    /**
     * 根据ID删除用户信息
     * @param id
     */
    void deleteUserById(Integer id);
}

创建实现类UserServiceImpl.java

package com.wd.demo.service.impl;

import com.wd.demo.dao.IUserDao;
import com.wd.demo.entity.User;
import com.wd.demo.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements IUserService {

    @Autowired
    IUserDao userDao;

    /**
     * 添加新用户
     * @param user
     */
    @Override
    public void addUser(User user) {
        userDao.save(user);
    }

    /**
     * 根据ID查找用户信息
     * @param id
     * @return
     */
    @Override
    public User findUserById(Integer id) {
        return userDao.getOne(id);
    }


    /**
     * 根据ID删除用户信息
     * @param id
     */
    @Override
    public void deleteUserById(Integer id) {
        userDao.deleteById(id);
    }

}

6.创建Controller

创建UserController.java

package com.wd.demo.controller;

import com.wd.demo.entity.User;
import com.wd.demo.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {

    @Autowired
    private IUserService userService;

    /**
     * 添加新用户
     * @return
     */
    @ResponseBody
    @RequestMapping("/save")
    public String saveUser(){
        User user = new User();
        user.setUserName("yyy");
        user.setUserPassword("12223");
        user.setUserAge(23);
        user.setUserPhone("1266658910");

        userService.addUser(user);
        return "success";
    }

    /**
     * 根据ID查找用户信息
     * @param id
     * @return
     */
    @ResponseBody
    @RequestMapping("/find/{id}")
    public User findUserById(@PathVariable("id") Integer id){
        return userService.findUserById(id);
    }

    /**
     * 根据ID删除用户
     * @param id
     * @return
     */
    @ResponseBody
    @RequestMapping("/delete/{id}")
    public String deleteUserById(@PathVariable Integer id){
        userService.deleteUserById(id);
        return "delete ok";
    }
}

7.解决使用jackson将对象json化的时候出现的错误(json化没问题则不需要这一步)

问题如下:

org.springframework.http.converter.HttpMessageNotWritableException: Could not write 
content: Noserializer found for class com.google.common.cache.CacheStats and no properties
discovered to createBeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

方法一:

在实体类上面加上注解:
@JsonIgnoreProperties(value = {"handler","hibernateLazyInitializer","fieldHandler"})

方法二:

注册一个objectMapper覆盖掉默认的,这样就不用在每个类上面使用@JsonIgnoreProperties:

@Bean
public ObjectMapper objectMapper() {
     return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
}

在这里我使用方法二

1.添加jackson依赖

 <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-databind</artifactId>
         <version>2.9.9</version>
 </dependency>

2.创建WebConfig.java

package com.wd.demo.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebConfig {
    /**
     * 解决使用jackson将对象json化的时候出现的错误
     * @return
     */
    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    }
}

8.运行结果

只展示查找结果
在这里插入图片描述

9.源代码

源代码链接

https://github.com/Qreply/springbootDemo.git

发布了49 篇原创文章 · 获赞 3 · 访问量 2336

猜你喜欢

转载自blog.csdn.net/xiao_count/article/details/101430529