zoukankan      html  css  js  c++  java
  • springBoot_JPA和lombok

    一.JPA

    特点:JPA可以根据方法名自动匹配sql语句.

    JPA是一个标准

    Hibernate是JPA的一个实现,宗旨是尽量少写sql语句.

    使用JPA

    1.application.properties配置:

    在springBoot工程下的application.properties配置文件中的相关配置:

    #配置数据库链接
    spring.datasource.url=jdbc:mysql://数据库信息?useSSL=false&serverTimezone=Asia/Shanghai
    spring.datasource.username=test
    spring.datasource.password=******
    
    #配置数据库初始化的模式,会自动读取resources文件下面的data.sql文件(自定义)进行执行
    #还会读取schema.sql文件
    #schema.sql一般会写建表语句
    #data.sql里面会写数据库插入的语句
    spring.datasource.initialization-mode=always
    
    #关于JPA的配置
    #执行sql语句的时候,是否在控制台打印
    spring.jpa.show-sql=true
    #none 关闭根据实体类创建表的功能
    #create 如果表不存在,则根据实体类的配置创建表
    #update 如果实体类的配置更改了,与表对应不上,那么会更新表的结构
    #create-drop 工程启动的时候先删除表在创建表。
    spring.jpa.hibernate.ddl-auto=none
    

    2.创建实体类

    JPA会根据配置的实体类自动创建相应的表.

    package com.example.demo.entity;
    import lombok.Data;
    import javax.persistence.*;
    
    @Data
    @Entity 
    //上面这两个注解是lombok里面的
    //使用JPA需要配置实体类与表的对应关系
    @Table(name = "dep") //配置实体类对应的表的名字是什么
    public class Dep {
    
        //主键列需要配置ID注解
        @Id
        //配置注解自增长的方式
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long uuid;
       //name : 自定义表名
        //unique : 是否唯一
        //nullable : 是否为空.
        @Column(name = "dep_name" ,unique = true,nullable = false)
        private String name;
        //默认情况下。实体类的驼峰式的属性会自动映射到列的下划线形式
        private String depTele;
    
       //建立表的之间的关联.
        //OneToOne :一对一
        //OneToMany :一对多
        //ManyToMany : 多对对
        @ManyToMany(fetch = FetchType.EAGER)
    //创建外键 @JoinTable(name = "role_menu",joinColumns = @JoinColumn(name = "role_id"), inverseJoinColumns = @JoinColumn(name = "menu_id")) private Set<MenuEntity> menus; }

      

    3.创建接口

    创建一个接口,继承于JpaRepository<class,Long>

    该接口有很多对数据库操作的方法,不需要实现,用的时候只需要利用多态调用父接口的方法就能对数据库进行操作.

    比如:findById()方法,根据id查询所有.

    1.这里面也可以自定义一些方法,不过方法名要符合规则.

    2.可以利用@Query注解为自定义的方法配置自己的sql语句.

    3.可以定义一个方法,由实现类来重写方法,在实现类里面重写更复杂的sql

    package com.example.demo.repository;
    
    import com.example.demo.entity.Dep;
    import org.apache.ibatis.annotations.Param;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.Query;
    
    import java.util.List;
    
    public interface DepRepository extends JpaRepository<Dep,Long> {
    
       //JPA可以根据方法名自动生成SQL语句
        List<Dep> findAllByNameContaining(String name);
        //为方法配置自定义的sql
        @Query(value = "select * from dep where name like concat('%', :name,'%')",nativeQuery = true)
        List<Dep> findByname(@Param("name") String name);
    
    //定义一个方法,有实现类来重写该方法,重写sql语句, List<Dep> findAllTest(); }

    接口的实现类.

    不需要在类上写implements实现上面的接口,JPA会根据类名的命名规则自动匹配实现类.

    注入一个EntityManager对象,该对象会根据sql语句和实体类对数据操作.

    //JPA会根据类名的规则,自动将该类的作为对应接口的实现类
    @Repository
    public class DepRepositoryImpl {
    
        @Resource
        private EntityManager entityManager;
    
        public List<Dep> findAllTest(){
    
            String sql = "select * from dep";
            Query query = this.entityManager.createNativeQuery(sql, Dep.class);
            List list = query.getResultList();
    
            return list;
        }
    
    }
    

    4.直接在Service层调用接口方法对数据库进行操作.

       //注入接口对象
       @Resource
        private DepRepository depRepository;
    
       Optional<Dep> optional = this.depRepository.findById(uuid);
             //获取到的optional是一个代理对象
            //这个代理对象是与数据库绑定的
            //当改变这个代理对象的属性的值时,会自动改变数据库中的值
            if (optional.isPresent()){
                //把代理对象转为实体类对象
                Dep dep = optional.get();
                return dep;
            }
    

      

    二.lombok

    lombok主要是对创建的实体类的一些简化,

    一些常用的lombok注解:

    @Data :   给实体类配置get和set,tostring方法

    @AllgrgsConstructor  ;配置一个全参的构造方法

    @NoArgsConstrutor : 添加一个空的构造方法

    @Builder :创建建造者模式来创建对象.

    @Getter : 创建get方式

    @Setter ; 创建set方法

    @Slf4j  :创建日志对象.

    package com.example.demo.entity;
    import lombok.*;
    
    @Data  //真加getter&setter,toString,equals,hashcode
    //@Getter  //只真加getter方法  其他同理
    @AllArgsConstructor  //添加一个全参数的构造方法
    @NoArgsConstructor   //添加一个无参数的构造方法
    @Builder //真加一个建造者模式来创建对象
    public class Emp {
    
        private Long uuid;
        private String name;
        private String email;
        private String tele;
    }
    

      

  • 相关阅读:
    《Cracking the Coding Interview》——第2章:链表——题目5
    《Cracking the Coding Interview》——第2章:链表——题目4
    《Cracking the Coding Interview》——第2章:链表——题目3
    《Cracking the Coding Interview》——第2章:链表——题目2
    《Cracking the Coding Interview》——第2章:链表——题目1
    《Cracking the Coding Interview》——第1章:数组和字符串——题目8
    《Cracking the Coding Interview》——第1章:数组和字符串——题目7
    extern 用法,全局变量与头文件(重复定义)
    关于#ifdef #ifndef
    C语言中extern的用法
  • 原文地址:https://www.cnblogs.com/zhouchangyang/p/11125118.html
Copyright © 2011-2022 走看看