版权声明:[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: 通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
**/