前期配置
pom.xml坐标信息
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lidadaibiao</groupId>
<artifactId>22-spring-boot-datajpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
</parent>
<!-- 修改jdk版本 -->
<properties>
<java.version>1.7</java.version>
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.0.4</thymeleaf-layout-dialect.version>
</properties>
<dependencies>
<!-- springBoot的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- thymeleaf启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- spring-data-jpa启动器 -->需要添加的东西
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 测试工具启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- mysql 数据库驱动 --> 需要添加的东西
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- druid 数据库连接池 --> 需要添加的东西
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
</dependencies>
</project>
在项目中添加application.properties配置信息
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource//连接池类型
spring.jpa.hibernate.ddl-auto=update//开启正向工程
spring-jpa.show-sql=true //显示查询语句
创建实体类
package com.lidadaibiao.pojo;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity//该注解表明这是一个实体类
@Table(name="s_users")//表明和数据库那个表对应,或者没有表创建的表名
public class Users {
@Id //表明这个属性是数据库中的一个主键
@GeneratedValue(strategy=GenerationType.IDENTITY)//主键生成的策略 递增
@Column(name="id")//对应的列名
private Integer id;
@Column(name="name")
private String name;
@Column(name="age")
private Integer age;
@Column(name="address")
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Users [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
}
}
编写dao接口
package com.lidadaibiao.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import com.lidadaibiao.pojo.Users;
/**
*
* @author ASUS
*JpaRepository<Users, Integer>
* 参数1:当前需要映射的实体
* 参数2:当前映射的实体中主键(OID)的类型
*/
public interface UsersDao extends JpaRepository<Users, Integer>{
}
测试代码
@Test
public void test1(){
Users users = new Users();
users.setAddress("安阳峨眉大街");
users.setName("小小");
users.setAge(24);
this.usersDao.save(users);
}
Repository 接口讲解
1)基于方法名称命名规则查询 命名规则 2)基于@Query 注解查询JPQL SQL
package com.lidadaibiao.dao;
import java.util.List;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;
import com.lidadaibiao.pojo.Users;
/**
* 1Repository 接口讲解
* 2基于@Query 注解的查询
* JPQL
* @author ASUS
*
*/
public interface UsersRepository extends Repository<Users, Integer>{
//规则:findBy(关键字)+属性名称(属性名称的首字母大写)+查询条件(首字母大写)
List<Users> findByName(String name);
List<Users> findByNameLike(String name);
List<Users> findByNameAndAge(String name,Integer age);
//@Query
/**
* JPQL
* @param name
* @return
*/
@Query("from Users where name = ?")
List<Users> queryfindByName(String name);
@Query("from Users where name like ?")
List<Users> queryfindNameLike(String str);
@Query("from Users where name = ? And age = ?")
List<Users> queryfindNameAndAge(String name,Integer age);
/**
* SQL
* nativeQuery:默认的是 false.表示不开启 sql 查询。是否对 value 中的语句做转义。
*/
@Query(value="select * from s_users where name = ?",nativeQuery=true)
List<Users> sqlfindByName(String name);
@Query(value="select * from s_users where name like ?",nativeQuery=true)
List<Users> sqlfindLikeName(String name);
@Query(value="select * from s_users where name = ? and age = ?",nativeQuery=true)
List<Users> sqlfindNameAndAge(String name,Integer age);
@Query(value="update Users set name = ? where id = ?")
@Modifying// //@Modifying 当前语句是一个更新语句
void update(String name,Integer id);
}
测试类
/**
* Repository 接口测试
*/
@Test
public void test2(){
List<Users> users = this.usersRepository.findByName("李大大");
for (Users users2 : users) {
System.out.println(users2);
}
}
@Test
public void test3(){
List<Users> users = this.usersRepository.findByNameLike("%大");
for (Users users2 : users) {
System.out.println(users2);
}
}
@Test
public void test4(){
List<Users> users = this.usersRepository.findByNameAndAge("小小", 24);
for (Users users2 : users) {
System.out.println(users2);
}
}
/**
* 基于@Query 注解的查询测试
*/
/**
* JPQL
*/
@Test
public void test5(){
List<Users> queryfindByName = this.usersRepository.queryfindByName("李大大");
for (Users users : queryfindByName) {
System.out.println(users+"query");
}
}
@Test
public void test6(){
List<Users> queryfindByName = this.usersRepository.queryfindNameLike("李%");
for (Users users : queryfindByName) {
System.out.println(users+"querylike");
}
}
@Test
public void test7(){
List<Users> users = this.usersRepository.queryfindNameAndAge("小小", 24);
for (Users users2 : users) {
System.err.println("like"+" "+users2);
}
}
/**
* SQL
*/
@Test
public void test8(){
List<Users> sqlfindByName = this.usersRepository.sqlfindByName("李大大");
for (Users users : sqlfindByName) {
System.out.println(users+"sql");
}
}
@Test
public void test9(){
List<Users> sqlfindLikeName = this.usersRepository.sqlfindLikeName("李%");
for (Users users : sqlfindLikeName) {
System.err.println("sql"+users);
}
}
@Test
public void test10(){
List<Users> sqlfindNameAndAge = this.usersRepository.sqlfindNameAndAge("小小", 24);
for (Users users : sqlfindNameAndAge) {
System.out.println(users+"sql1");
}
}
@Test
@Transactional
@Rollback(false)
public void test11(){
this.usersRepository.update("大栋啊", 1);
}
CrudRepository接口讲解
ackage com.lidadaibiao.dao;
import org.springframework.data.repository.CrudRepository;
import com.lidadaibiao.pojo.Users;
/**
* CrudRepository接口测试
* @author ASUS
*
*/
public interface UsersCurdRepository extends CrudRepository<Users, Integer>{
}
测试
/**
* CrudRepository接口测试
*/
@Test
public void test12(){
//查询全部
List<Users> findAll = (List<Users>)this.usersCurdRepository.findAll();
for (Users users : findAll) {
System.out.println(users);
}
}
/**
*
*/
@Test
public void test13(){
//增加数据
Users users = new Users();
users.setAddress("天安门");
users.setAge(23);
users.setName("李雪儿");
this.usersCurdRepository.save(users);
}
@Test
public void test14(){
//根据id查询
Users findOne = this.usersCurdRepository.findOne(2);
System.out.println(findOne);
}
@Test
public void test15(){
//更新操作
Users users = new Users();
users.setId(3);
users.setAddress("十里铺");
users.setAge(222);
users.setName("小王二");
this.usersCurdRepository.save(users);
}
PagingAndSortingRepository接口讲解
package com.lidadaibiao.dao;
import org.springframework.data.repository.PagingAndSortingRepository;
import com.lidadaibiao.pojo.Users;
/**
* PagingAndSortingRepository测试
* @author ASUS
*
*/
public interface UsersPagingAndSortingRepository extends PagingAndSortingRepository<Users, Integer>{
}
测试
**
* PagingAndSortingRepository测试
*/
@Test
public void test16(){
/**
* 分页操作
* Pageable:封装了分页的参数。当前页,每页显示的条数。注意他的当前页是从0开始的
* PageRequest(0, 2); :0当前页,2每页显示的条数
*/
Pageable pageable = new PageRequest(0, 2);
Page<Users> page = this.usersPagingAndSortingRepository.findAll(pageable);
System.out.println("总条数:"+page.getTotalElements());
System.out.println("总页数"+page.getTotalPages());
//查询到的数据的结果集
List<Users> content = page.getContent();
for (Users users : content) {
System.out.println(users);
}
}
@Test
public void test17(){
/**
* 排序
*/
/**
* Order定义排序规则
* Sort封装排序规则对象
* 参数一排序规则,参数二对那个属性规则
* Order order = new Order(Direction.DESC,"id");
* Sort sort= new Sort(order);
*/
/**
* 参数一排序规则,参数二对那个属性规则
* Sort sort = new Sort(Direction.DESC,"id");
*/
Sort sort = new Sort(Direction.DESC,"id");
List<Users> findAll = (List<Users>)this.usersPagingAndSortingRepository.findAll(sort);
for (Users users : findAll) {
System.out.println(users);
}
}
/**
* 排序加分页
*/
@Test
public void test18(){
/*方式1
* Sort sort = new Sort(Direction.DESC, "id");
* Pageable pageable = new PageRequest(1, 3, sort);*/
Pageable pageable =new PageRequest(1, 3, Direction.DESC, "id");
Page<Users> page = this.usersPagingAndSortingRepository.findAll(pageable);
System.out.println("总条数:"+page.getTotalElements());
System.out.println("总页数:"+page.getTotalPages());
//查询到的结果集
List<Users> content = page.getContent();
for (Users users : content) {
System.out.println(users);
}
}
JpaRepository接口讲解
package com.lidadaibiao.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import com.lidadaibiao.pojo.Users;
/**
* JapRepository测试
* @author ASUS
*
*/
public interface UsersJpaRepository extends JpaRepository<Users, Integer>{
}
测试
/**
* JpaRepository接口测试
*/
@Test
public void test19(){
Pageable pageable = new PageRequest(0, 2, Direction.DESC, "id");
Page<Users> findAll = this.usersJpaRepository.findAll(pageable);
System.out.println("总条数:"+findAll.getTotalElements());
System.out.println("总页数:"+findAll.getTotalPages());
for (Users users : findAll) {
System.out.println(users);
}
}
UsersJpaSpecificationExecutor接口讲解
package com.lidadaibiao.dao;
/**
* JpaSpecificationExecutor 测试
* @author ASUS
*
*/
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import com.lidadaibiao.pojo.Users;
public interface UsersJpaSpecificationExecutor extends JpaRepository<Users, Integer>,JpaSpecificationExecutor<Users>{
}
测试
/**
* UsersJpaSpecificationExecutor接口测试
*/
@Test
public void test20(){
/**
* Specification<Users>:用于封装查询条件
*/
Specification<Users> spec = new Specification<Users>() {
/**
* Predicate:封装单个查询条件
* @param root 查询对象属性封装, ,
* @param query 封装了我们查询中的各个部分信息,select from order by
* @param cb 查询构造器 定义不同的查询条件
* @return 封装单个查询条件
*/
@Override
public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
/**
* 参数一:查询的对象属性
* 参数二: 条件的值
*/
Predicate pre = cb.equal(root.get("name"),"小小");
return pre;
}
};
List<Users> findAll = this.usersJpaSpecificationExecutor.findAll(spec);
for (Users users : findAll) {
System.out.println(users);
}
}
@Test
public void test21(){
/**
* 多条件查询
* 方式一
*/
Specification<Users> spec = new Specification<Users>() {
@Override
public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
/*方式一
* // TODO Auto-generated method stub
List<Predicate> list = new ArrayList<Predicate>();
list.add(cb.equal(root.get("name"),"小小"));
list.add(cb.equal(root.get("age"),22));
Predicate[] arr = new Predicate[list.size()];
//list.toArray(T[] a);返回T[]
return cb.and(list.toArray(arr));*/
//方式二
//return cb.and(cb.equal(root.get("name"),"小小"),cb.equal(root.get("age"),22));
//or
//return cb.or(cb.equal(root.get("name"),"小小"),cb.equal(root.get("age"),22));
//or and
return cb.or(cb.equal(root.get("name"),"大栋啊"),cb.and(cb.equal(root.get("name"),"小小"),cb.equal(root.get("age"),22)));
}
};
//添加排序
Sort sort = new Sort(Direction.DESC, "id");
List<Users> findAll = this.usersJpaSpecificationExecutor.findAll(spec,sort);
for (Users users : findAll) {
System.out.println(users);
}
}
}
OneToMany 一对多关联映射
需求 角色和用户的一对多的关系
创建实体
package com.lidadaibiao.pojo;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
@Entity//该注解表明这是一个实体类
@Table(name="s_users")//表明和数据库那个表对应,或者没有表创建的表名
public class Users {
@Id //表明这个属性是数据库中的一个主键
@GeneratedValue(strategy=GenerationType.IDENTITY)//主键生成的策略 递增
@Column(name="id")//对应的列名
private Integer id;
@Column(name="name")
private String name;
@Column(name="age")
private Integer age;
@Column(name="address")
private String address;
@ManyToOne(cascade=CascadeType.PERSIST) //开启级联操作//用户对角色是 多对一
@JoinColumn(name="roles_id")//维护主键
private Roles roles = new Roles();
public Roles getRoles() {
return roles;
}
public void setRoles(Roles roles) {
this.roles = roles;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Users [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
}
}
package com.lidadaibiao.pojo;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity //表名这是一个实体类
@Table(name="s_roles")
public class Roles {
@Id //表明这是一个主键
@GeneratedValue(strategy=GenerationType.IDENTITY)//主键生成的策略 递增
@Column(name="rolesid")
private Integer rolesid;
@Column(name="rolesname")
private String rolesname;
//角色对用户 是一对多
@OneToMany(mappedBy="roles") //未来要像set集合放users 告诉是当前users里的roles所相同的
private Set<Users> users = new HashSet<>();
public Integer getRolesid() {
return rolesid;
}
public void setRolesid(Integer rolesid) {
this.rolesid = rolesid;
}
public String getRolesname() {
return rolesname;
}
public void setRolesname(String rolesname) {
this.rolesname = rolesname;
}
public Set<Users> getUsers() {
return users;
}
public void setUsers(Set<Users> users) {
this.users = users;
}
}
接口
ackage com.lidadaibiao.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import com.lidadaibiao.pojo.Users;
/**
* JapRepository测试
* @author ASUS
*
*/
public interface UsersJpaRepository extends JpaRepository<Users, Integer>{
}
测试
package com.lidadaibiao.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.lidadaibiao.App;
import com.lidadaibiao.dao.UsersJpaRepository;
import com.lidadaibiao.pojo.Roles;
import com.lidadaibiao.pojo.Users;
@RunWith(SpringJUnit4ClassRunner.class)//用RunWith启动器去启动junit和spring的一个整合
@SpringBootTest(classes={App.class})
public class OneToManyTest {
@Autowired
private UsersJpaRepository usersJpaRepository;
/**
* 级联添加
*/
@Test
public void test1(){
//创建一个用户
Users users = new Users();
users.setAddress("北京王府井");
users.setAge(22);
users.setName("小仔");
//创建一个角色
Roles roles = new Roles();
roles.setRolesname("管理员");
//关联
roles.getUsers().add(users);
users.setRoles(roles);
//操作
this.usersJpaRepository.save(users);
}
/**
* 查询
*/
@Test
public void test2(){
Users findOne = this.usersJpaRepository.findOne(7);
System.out.println(findOne);
System.out.println(findOne.getRoles().getRolesname());
}
}
级联操作多对多的实现。
需求 工作者和部门多对多
实体表
package com.lidadaibiao.pojo;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity//表名实体类
@Table(name="s_worker")
public class Worker {
@Id//主键
@GeneratedValue(strategy=GenerationType.IDENTITY)//生成主键的策略
@Column(name="workerid")
private Integer workerid;
@Column(name="workername")
private String workername;
//,fetch=FetchType.EAGER 默认的延迟加载 改成立即加载
//cascade=CascadeType.PERSIST开启级联操作
@ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.EAGER)
//@JoinTable 为一个映射中间表 joinColumns 为该表的Worker外键 inverseJoinColumns则是det表的外键名
@JoinTable(name="s_worker_det",joinColumns=@JoinColumn(name="worker_id"),inverseJoinColumns=@JoinColumn(name="det_id"))
private Set<Det> det = new HashSet<>();
@Override
public String toString() {
return "Worker [workerid=" + workerid + ", workername=" + workername + "]";
}
public Integer getWorkerid() {
return workerid;
}
public void setWorkerid(Integer workerid) {
this.workerid = workerid;
}
public String getWorkername() {
return workername;
}
public void setWorkername(String workername) {
this.workername = workername;
}
public Set<Det> getDet() {
return det;
}
public void setDet(Set<Det> det) {
this.det = det;
}
}
package com.lidadaibiao.pojo;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="s_det")
public class Det {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="detid")
private Integer detid;
@Column(name="detname")
private String detname;
@Column(name="fatherid")
private Integer fatherid;
//未来要向set集合放worker 告诉是当前worker里的det所相同的
@ManyToMany(mappedBy="det")
private Set<Worker> worker = new HashSet<>();
@Override
public String toString() {
return "Det [detid=" + detid + ", detname=" + detname + ", fatherid=" + fatherid + "]";
}
public Integer getDetid() {
return detid;
}
public void setDetid(Integer detid) {
this.detid = detid;
}
public String getDetname() {
return detname;
}
public void setDetname(String detname) {
this.detname = detname;
}
public Integer getFatherid() {
return fatherid;
}
public void setFatherid(Integer fatherid) {
this.fatherid = fatherid;
}
public Set<Worker> getWorker() {
return worker;
}
public void setWorker(Set<Worker> worker) {
this.worker = worker;
}
}
接口
package com.lidadaibiao.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import com.lidadaibiao.pojo.Roles;
import com.lidadaibiao.pojo.Worker;
public interface MtMJpaRepository extends JpaRepository<Worker,Integer>{
}
测试
package com.lidadaibiao.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.management.relation.Role;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.lidadaibiao.App;
import com.lidadaibiao.dao.MtMJpaRepository;
import com.lidadaibiao.pojo.Det;
import com.lidadaibiao.pojo.Menus;
import com.lidadaibiao.pojo.Roles;
import com.lidadaibiao.pojo.Worker;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes={App.class})
public class ManyToManyTest {
@Autowired
private MtMJpaRepository mtMJpaRepository;
@Test
public void test1(){
//多对多的增加
//创建工作者
Worker worker = new Worker();
worker.setWorkername("小王");
//创建部门
Det det1 = new Det();
det1.setDetname("董事长");
det1.setFatherid(0);
Det det2 = new Det();
det2.setDetname("经理");
det2.setFatherid(1);
//关联
det1.getWorker().add(worker);
det2.getWorker().add(worker);
worker.getDet().add(det1);
worker.getDet().add(det2);
//操作
this.mtMJpaRepository.save(worker);
}
@Test
public void test2(){
/**
* 查找
*/
Worker findOne = this.mtMJpaRepository.findOne(3);
System.out.println(findOne);
Set<Det> det = findOne.getDet();
for (Det det2 : det) {
System.out.println(det2);
}
}
}