spring boot+ jpa方法大全--jpa关系指定

版权声明:[ws - 兮的博客] - 空间专属,未经声明不得私自转载 https://blog.csdn.net/qq_41463655/article/details/83548878

dao层
继承 JpaRepository实现增删改查
继承 JpaSpecificationExecutor 实现分页

替换所有的 Dep

@Component
public interface DepDao extends JpaRepository<Dep, Long>, JpaSpecificationExecutor<Dep> {
}

service方法层
一键替换所有的 Dep

public  interface DepService {

    // 1============查询所有===============
    public List<Dep> listAll(String properties);

    // 2============ id 查询===============
    public Dep findId(Long id) ;

    // 3============ 多id 查询==============
    public List findIds(List ids);

    // 4============ 分页查询===============
    public Page<Dep> pageAll(Integer page, Integer size, String properties);

    // 5============ 动态条件查询 ===========
    public List<Dep> findquery(Dep query);

    // 6============ 添加、修改数据==========
    public void save(Dep query);

    // 7============ 添加多条数据============
    public void saveAll(List<Dep> query);

    // 8============ id 删除数据=============
    public void deleteId(Long id);

    // 9============ 多 id 删除数据==========
    public void deleteIds(List ids);

    // 10============ 删除所有数据 ===========
    public void deleteAll();
}

serviceImpl方法实现层
一键替换所有的 Dep 和 dep 使用

@Service
public class DepServiceImpl implements DepService {

    @Autowired
    private DepDao depDao;


    //============查询所有===============
    public List<Dep> listAll(String properties) {
        // 排序(倒序)
        Sort sort = new Sort(Sort.Direction.ASC, properties);
        return depDao.findAll(sort);
    }

    //============ id 查询===============
    public Dep findId(Long id) {
        Dep dep = depDao.findById(Long.valueOf(id)).get();
        return dep;
    }

    //============ 多id 查询===============
    public List findIds(List ids) {
        List deps = depDao.findAllById(ids);
        return deps;
    }

    //============ 分页查询===============
    public Page<Dep> pageAll(Integer page, Integer size, String properties) {
        // 页数 / 每页数量 / 排序规则 / 根据 dep_id 字段排序
        Pageable pageable = new PageRequest(page, size, Sort.Direction.ASC, properties);
        Page<Dep> pageDep = depDao.findAll(pageable);
        System.out.print(pageDep.getTotalElements() + "-->总数据数" + "--> " +
                pageDep.getTotalPages() + "-->总页数" + "--> " +
                pageDep.getNumber() + "-->当前页" + "--> " +
                pageDep.getSize() + "-->每页条数" + "--> " +
                pageDep.getNumberOfElements() + "-->本页条数" + "--> " +
                "--> " + "查询到的数据:" + pageDep.getContent().toString()
        );
        return pageDep;
    }

    //============ 动态条件查询 (根据需求自定义)===============
    /*
     *  depname = 666 and  password = 666
     *  depname = 666 or   password = 666
     **/
    public List<Dep> findquery(Dep query) {
        //生成条件
        Specification specification = new Specification() {
            @Override
            public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {
                // and 条件
                List<Predicate> ands = new ArrayList<>();
              /*  if (dep.getDepname() != null && !"".equals(dep.getDepname())) {
                    ands.add(criteriaBuilder.equal(root.<String>get("depname"), dep.getDepname()));
                }
                if (dep.getDepname() != null && !"".equals(dep.getDepname())) {
                    ands.add(criteriaBuilder.equal(root.<String>get("password"), dep.getPassword()));
                }*/
                // or 条件
                List<Predicate> ors = new ArrayList<>();
                ors.add(criteriaBuilder.like(root.<String>get("depname"), "%" + "9" + "%")); //模糊查询 like
                ors.add(criteriaBuilder.like(root.<String>get("password"), "%" + "9" + "%")); //模糊查询 like

                Predicate and = criteriaBuilder.and(ands.toArray(new Predicate[ands.size()])); //and 连接的条件集
                Predicate or = criteriaBuilder.or(ors.toArray(new Predicate[ors.size()]));     //or 连接的条件集

                List<Predicate> predicate = new ArrayList<>(); //条件集集合
                predicate.add(and); //添加 and 的条件集
                predicate.add(or);  //添加 or 的条件集

                //return criteriaBuilder.and(predicate.toArray(new Predicate[predicate.size()]));// and 连接条件集
                return criteriaBuilder.or(predicate.toArray(new Predicate[predicate.size()]));  // or  连接条件集
            }
        };
        List depDaoAll = depDao.findAll(specification);
        return depDaoAll;
    }


    //============ 添加、修改数据===============
    public void save(Dep query) {
        depDao.save(query);
    }


    //============ 添加多条数据===============
    public void saveAll(List<Dep> querys) {
       /* List<Dep> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Dep dep = new Dep("mm" + i, "123456");
            list.add(deps);
        }*/
        //保存实体集合
        depDao.saveAll(querys);
    }

    //============ id 删除数据===============
    public void deleteId(Long id) {
        depDao.deleteById(id);
    }

    //============ 多 id 删除数据===============
    public void deleteIds(List ids) {
        depDao.deleteAll(ids);
    }

    //============ 删除所有数据 ===============
    public void deleteAll() {
        depDao.deleteAll();
    }
}

controller

一键替换所有的 Dep 和 dep 使用
@ResponseBody :定义在方法上返回 json 字符串
多删除和多添加方法自定义

/**
 * Created by Administrator on 2018/10/2/002.
 */
@RequestMapping("/dep")
@Controller           //返回值页面跳转 url
//@RestController     //所有方法返回值 json 数据
public class DepController {
    //带 Flush 的方法为sql 立即生效

    @Autowired
    private DepService depService;

    // 1============查询所有===============
    @GetMapping("/listAll")
    public String listAll(Model model) {
        List<Dep> deps = depService.listAll("depId");
        model.addAttribute("deps",deps);
        return  "dep/main";
    }
    // 2============ 分页查询===============
    @GetMapping("/pageAll")
    public String pageAll(Model model, Integer page, Integer size) {
        page = 0;  //页数(0开始)
        size = 5;  //记录数
        Page<Dep> pages = depService.pageAll(page, size, "userId");
        model.addAttribute("deps", pages.getContent());
        model.addAttribute("page", pages);
        return "dep/main";
    }
    // 3============ 添加、修改数据===============
    @PostMapping("/save")
    public String save(Dep dep) {
        depService.save(dep);
        return "redirect:/dep/listAll";
    }
    // 4============ 跳修改页 id 查询===============
    @GetMapping("/updateId")
    public String updateId(Model model,Long id) {
        Dep dep = depService.findId(id);
        model.addAttribute("dep",dep);
        return "dep/update";
    }
    // 5============ id 删除数据===============
    @GetMapping("/deleteId")
    public String deleteId(Long id) {
        depService.deleteId(id);
        return "redirect:/dep/listAll";
    }
    // 6============ 动态条件查询 ===============
    @GetMapping("/findquery")
    public String findquery(Model model,Dep dep) {
        List deps = depService.findquery(dep);
        model.addAttribute("deps",deps);
        return "dep/main";
    }
}

netity 实体数据类

主要体现了 jpa 的关系指定

@Table(name = "ws_user")   //生成数据库的表名
@Entity  // 该注解声明一个实体类,与数据库中的表对应
public class User {

    @Id               //  表明主键id
    @GeneratedValue   //  主键的生成策略(看最下方注释具体说明)
    private Long userId;

    private String username;

    private String password;


    //======================= 用户 - [ 一对一 ] - 用户详情 ================


    //@PrimaryKeyJoinColumn                 //主键关联
    @JoinColumn(name = "detail_id")        //外键关联
    @OneToOne(cascade=CascadeType.ALL)   //ALL 级联/添加/更新/删除(看最下方注释具体说明)
    private UserDetail detail;


    //======================= 用户 - [ 一对多 ] - 收获地址 ===============

    //外键关联,指定一的一端的id 做外键
    @JoinColumn(name = "user_id")
    @OneToMany(cascade=CascadeType.ALL)   //ALL 级联/添加/更新/删除
    private List<Address> addresses;


    //======================= 用户 - [ 多对一 ] - 部门  ================

    //外键关联,指定一的一端的id 做外键
    @JoinColumn(name = "dep_id")
    @ManyToOne(cascade=CascadeType.MERGE)  // 只级联更新
    private Dep dep;


    //======== 用户 - [ 多对多 ] - 角色 ===================

    //name指中间表的表名,joinColumns指当前实体在中间表的字段,inverserJoinCloumns指关联的另外一个实体在中间表的字段名
    @JoinTable(name="ws_user_role",joinColumns=@JoinColumn(name="user_id"),inverseJoinColumns=@JoinColumn(name="role_id"))
    @ManyToMany(cascade=CascadeType.MERGE) // 只级联更新
    private List<Role> roles;

    
    //======== 用户 - [ 一对一 ] - qq 登陆信息 ===================
   
    @JoinColumn(name = "qquser_id")      //外键关联
    @OneToOne(cascade=CascadeType.MERGE)
    private QQUserInfo qqUserInfo;


更多说明

// ================================= 表关系注解说明  ================================
/*
      @OneToOne      一对一
      @OneToMany     一对多
      @ManyToOne     多对一
      @ManyToMany    多对多  */

/*     上诉关系指定后添加的属性(级联比较重要,要了解使用)
       cascade:表示默认的级联操作策略,可以指定为ALL(全部),默认为无级联操作
            PERSIST(级联保存),
            MERGE  (级联更新),
            REFRESH(级联刷新)
            REMOVE (级联删除)
       fetch:表示抓取策略,默认为FetchType.EAGER ,
            EAGER(急记载,立即记载)
            LAZY(懒加载)
       optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true
       */

// ================================= 属性注解 @Column 说明  ================================

      

/*     @Transient 注解,表明为成员变量,不和数据库字段做映射(定义数据接收使用)
 *     @JsonIgnore   //将不需要返回的属性上添加忽略(指定关系后数据循环套qian做属性排除使用)
 *    
 *     @Column: 指定生成的表字段名和长度,不指定默认255长度且表字段名同属性名一致
 *
 *     指定字段 tradeNo 长度为50,且值不能为null
 *         @Column(name = "tradeNo", length = 50, nullable = false)
 *
 *     指定字段 tradeNo 长度为50,且值可以为null
 *         @Column(name = "tradeNo", length = 50, nullable = true)
 *
 *     指定字段totalAmount(长度)为10,小数点位数为2位,且值不能为null
 *         @Column(name = "totalAmount", precision = 10, scale = 2, nullable = false)
 *
 **/
// =============================== 主键策略 @GeneratedValue 说明  ============================

   /**   @GeneratedValue  主键id  -->  生成策略注解说明
     *   @GeneratedValue(strategy=GenerationType.AUTO)  //示范
     *   –IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle 不支持这种方式; 
     *   –AUTO:    JPA自动选择合适的策略,是默认选项; 
     *   –SEQUENCE:通过序列产生主键,通过@SequenceGenerator 注解指定序列名,MySql不支持这种方式 
     *   –TABLE:   通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
     **/

猜你喜欢

转载自blog.csdn.net/qq_41463655/article/details/83548878