使用idea搭建SpringBoot+Spring Data jpa项目(实现获取数据库数据显示在页面中)_idea里面怎么写获取信息页面-程序员宅基地

技术标签: SpringBoot  

搭建SpringBoot准备

  • javaweb基础
  • idea使用基础
  • maven使用基础

开始搭建SpringBoot项目

  1. 创建springboot
    在这里插入图片描述
  2. 设置Group、Artifact、Packaging
    在这里插入图片描述
  3. 选择web及SpringBoot版本
    在这里插入图片描述
  4. 配置application.properites
    SpringBoot默认情况下没有项目名和端口号需要我们在application.properites文件内配置项目和端口号
    再加上mysql配置
server.servlet.path=/evaluate
server.port=8081

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql:///evaluate?characterEncoding=utf-8&useSSL=false
spring.jpa.show-sql=true

Spring Boot 有两种类型的配置文件,application 和 bootstrap 文件
Spring Boot会自动加载classpath目前下的这两个文件,文件格式为 properties 或 yml 格式

*.properties 文件是 key=value 的形式
*.yml 是 key: value 的形式
*.yml 加载的属性是有顺序的,但不支持 @PropertySource 注解来导入配置,一般推荐用yml文件,看下来更加形象

bootstrap 配置文件是系统级别的,用来加载外部配置,如配置中心的配置信息,也可以用来定义系统不会变化的属性.bootstatp 文件的加载先于application文件
application 配置文件是应用级别的,是当前应用的配置文件

  1. 编写实体类类
    因为要使用jpa,所以实体类中属性命名方式要和数据中的表按照规则对应

jpa简介:

JPA是Java Persistence API的简称,中文名Java持久层API,是一种规范,我们可以使用hibernate来实现这规范。
JPQL查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
如:from Student s where s.name = ?
语法和SQL差别不大。
String Data jpa是对hibernate实现的jpa规范进行了轻量级封装。

String Data Jpa识别实体类

@Entity 识别为实体类
@id 识别为主键
@GeneratedValue(strategy = GenerationType.IDENTITY) 识别为自增
规则如下:
1.命名相同
2.如果数据中有下划线,下划线后面字母大写
即:实体类:danYuan < ----- >数据库表字段:dan_yuan
3.如果不使用它的自动对应配置,可以直接配置
@Table(name = “表名”)
@Column(name=“字段名”)

@Entity
@Table(name = "danyuan")
public class Danyuan {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="danyuan_id")
    private Integer danyuanId;
    @Column(name="name")
    private String name;
    @Column(name="dizhi")
    private String dizhi;
    @Column(name="code")
    private String code;
    @Column(name="parent_code")
    private String parentCode;
    //get、set方法省略
    }

如果不匹配的话会报错
在这里插入图片描述
6. DanyuanRepository接口
需要继承JpaRepository(简单增删改查)
JpaRepository<实体类,主键类型>

public interface DanyuanRepository extends JpaRepository<Danyuan,Integer> {

    List<Danyuan> findByParentCode(String code);

}

  1. service层
public interface DanyuanService {
    List<Danyuan> findByParentCode(String code);
}

继承JPaSpecificationExecutor复杂操作(这里不需要)
JPaSpecificationExecutor<实体类>
接口约定命名规则
在这里插入图片描述
在这里插入图片描述

@Service
public class DanyuanServiceImpl implements DanyuanService {

   @Autowired
   private DanyuanRepository danyuanRepository;

    @Override
    public List<Danyuan> findByParentCode(String code) {
        return danyuanRepository.findByParentCode(code);
    }
}
  1. Controller
@Controller
@RequestMapping("/danyuan")
public class DanyuanController {

    @Autowired
    private DanyuanService danyuanService;

    @RequestMapping("/findByParentCode")
    @ResponseBody
    public List<Danyuan> findByParentCode(@RequestParam("parentCode") String parentCode){
        return danyuanService.findByParentCode(parentCode);
    }
}
  1. 已经简单实现获取数据库数据显示在页面中
    10.效果展示
    在这里插入图片描述
junit测试
@RunWith(SpringRunner.class)
@SpringBootTest(class= 启动类.class)
public class test01{
	@Test
	public void test(){
	}
}

补充:

spring data jpa 中的dao层实现原理是通过jdk动态代理找到SimpleJapRepository动态代理对象,SimpleJapRepository实现了JapRepository接口,调用SimpleJapRepository中方法来实现我们写的dao实现类,其中SimpleJapRepository是使用jpa规范中EntityManager方法。jpa规范通过hibernate来实现jpa语法,hibernate通过封装的jdbc生成sql来在数据库中执行SQL语句。
找到一个图很好的写出来了,该图是描述的ssm项目,原理一致
在这里插入图片描述

spring data jpa 使用jpql语句(nativeQuery参数为false)

在自定义方法中加@Query注解

@Query(value="from Danyuan where title =  ?1",nativeQuery=false)
public Danyuan findJpql(String title)
spring data jpa 使用sql语句(nativeQuery参数为true)
@Query(value="select * from danyuan where title =  ?1",nativeQuery=true)
public Danyuan findJpql(String title)

自定义SQL高效更新(一般是全表更新,效率不如单字段更新)

@Modifying
@Transactional(readOnly = false) //@odifying需要写事务支持
@Query(value="UPDATE Danyuan SET name=:name WHERE id=:id”,nativeQuery=true)
public Danyuan updateName(@Param("name") String name,@Param("id") String id)
返回map集

在JPA 2.0 中我们可以使用entityManager.createNativeQuery()来执行原生的SQL语句。 但当我们查询结果没有对应实体类时,query.getResultList()返回的是一个List<Object[]>。也就是说每行的数据被作为一个对象数组返回。
JPA的API中并没有提供返回map集。其实很多JPA的底层实现都是支持返回Map对象的如:
Hibernate的.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
综上所述:

Query query = entityManager.createNativeQuery(sql);
query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List<Map<String, Object>> resutl = query.getResultList();

这里需要注意的是, 用Map肯定要比用Object数组来的效率低。所以你要看性能下降是否在可接受范围内。

JpaSpecificationExecutor使用 specifications实现类动态查询

源码

public interface JpaSpecificationExecutor<T> {

	/**
	 *  查询单个对象
	 */
	T findOne(Specification<T> spec);

	/**
	 * 查询列表 
	 */
	List<T> findAll(Specification<T> spec);
	/**
	 * 分页  pageable分页参数
	 */
	Page<T> findAll(Specification<T> spec, Pageable pageable);

	/**
	 * 查询列表 ,sort排序 new Sort(Sort.Direction.DESC,"num");
	 */
	List<T> findAll(Specification<T> spec, Sort sort);

	/**
	 * 统计
	 */
	long count(Specification<T> spec);
}

specification:查询条件
自定义specification实现类
Predicate toPredicate(Root root, CriteriaQuery<?> query, CriteriaBuilder cb);封装条件
root:查询的根对象(查询的任何属性都可以从根对象中获取)
CriteriaQuery:顶层查询对象,自定义查询方式(一般不用)
CriterriaBuilder: 查询的构造器,封装了很多的查询条件
如下:
匿名内部类使用。如果不是自己再封装,需要指定泛型对象。

Specification<T> sp = new Specification<T>() {
			@Override
			public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
				try {
					Path<Object> createTimePath = root.get("createTime");
//					query.orderBy(cb.desc(createTimePath));
				} catch (Exception e) {
					System.out.println("实体不存在createTime属性");
				}
				if (StringUtils.isNotBlank(sortField)) {
					query.orderBy(cb.asc(root.get(sortField)));
					if (StringUtils.isNotBlank(order)) {
						if (order.equals("desc")) {
							query.orderBy(cb.desc(root.get(sortField)));
						}
					}
				}
				Predicate pred = fsp.toPredicate(root, query, cb);
				try {
					//获取属性
					Path<String> namePath = root.get("name");
					if (Util.isNotEmpty(name)) {
						//构造查询条件可以cb.equal,cb.like等
						pred = cb.and(pred, cb.like(namePath, "%"+name+"%"));//and与形式拼接多个查询条件
					}
				} catch (Exception e) {
					System.out.println("实体不存在name属性");
				}
				return pred;
			}
		};

分页参数
pageable

//默认当前页
		if(Util.isEmpty(pageNum) || pageNum == 0){
			pageNum = 1;
		}
		//默认每页条数
		if(Util.isEmpty(pageSize)){
			pageSize = 10;
		}
PageRequest pageable = new PageRequest(pageNum-1, pageSize,sort)
一对多关系

一方

//1、声明关系 对方字节码对象
//@OneToMany(targetEntity = People.class)
//放弃外键  对象导航查询加载方式fetch 中EAGER 立即加载,LAZY延迟加载
@OneToMany(mappedBy="department",cascade=Cascade.ALL,fetch=FetchType.eager)
//2、配置外键(中间表)name外键名,referenceColumName主表主键
//@JoinColumn(name ="department_id",referenceColumName="id")
private Set<People> peoples = new HashSet<>();

多方

//1、声明关系 对方字节码对象
@ManyToOne(targetEntity = Department.class)
//2、配置外键(中间表)name外键名,referenceColumName主表主键
@JoinColumn(name ="id",referenceColumName="department_id")
private Department department;

都在多的一方维护外键

一的一方维护的话多一条update执行效果,先两条insert,在一条update更新外键

级联

删除主表数据,会把外键字段设置为null,然后删除主表数据,如果配置了放弃维护关联关系的权利,则不能上传,如果还想删除,使用级联删除引用,如果没有从表数据,可以删除。
操作:
1、需要区分操作主体
2、需要在操作主体的实体类上。添加级联属性
3、cascade 配置级联

@OneToMany(mappedBy="department",cascade="CascadeType.ALL")

添加

Department department = new Department();
department.setName("2121");
People p = new People();
p.setName("5565");
department.getPoples.add(p);
departmentDao.save(department);

删除就直接删除一方就可以了

多对多关系

多方

//1、声明关系 对方字节码对象
@ManyToMany(targetEntity = Department.class)
//2、配置外键(中间表)name外键名,referenceColumName主表主键
@JoinTable(name ="department_role)",
//当前对象在中间表中的外键
joinColumns={@joinColumn((name ="id",referenceColumName="department_id")})
// 对方对象在中间表的外键
inverseColumns={@joinColumn((name ="id",referenceColumName="role_id")})
private Set<Department> departments = newHashSet<>();

另一个多方

//1、声明关系 对方字节码对象
@ManyToMany(mappedBy = "role")

private Set<Role> roles= newHashSet<>();

被动的一方放弃维护权

对象导航查询

就是通过配置了多表映射,通过get对象得到关系对象信息

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/IManiy/article/details/83057665

智能推荐

Linux学习之网络相关命令_nc -u 172.0.0.1 12345-程序员宅基地

文章浏览阅读965次。strace、traceroute、tracert、sar、ifconfig、ip、nc、lsof、stat、netstat、ps、pstree、ss、telnet、top、Htop、iotop、powertop、iftop、dstat、nethogs、Nmon、vnstat、host、dig、route、tcpdump_nc -u 172.0.0.1 12345

/etc/hosts.conf_/etc/host.conf-程序员宅基地

文章浏览阅读2.6k次。作用指定如何解析主机域名,可设置网络安全。默认文件内容默认情况,/etc/hosts.conf 文件有如下内容 order hosts,bind multi on12参数说明order是解析顺序的参数,order hosts,bind,nis ,说明先查询解析/etc/hosts文件,然后DNS,再是NIS。multi表示是否运行/etc/hosts文件允许主机指定多个多个地址 ,multi on表示运行。nospoof是否允许服务器对ip地址进行其欺骗,nospoof on表_/etc/host.conf

工业机器人四大家族(ABB、库卡、安川)全套资料,欢迎下载!_abb机器人 panbaidu com-程序员宅基地

文章浏览阅读7.1k次,点赞7次,收藏10次。自1954年世界上第一台机器人诞生以来,世界工业发达国家已经建立起完善的工业机器人产业体系。日本、德国的工业机器人水平全球领先,“四大家族”(ABB、库卡、发那科、安川)为全球主要的工业机器人供应商,占据全球约50%的市场份额,这主要因为他们具备先发优势和技术沉淀。 图表1:全球工业机器人“四大家族”介绍随着我国工业自动化、智能化的发展加速,工业机器人的应用普及也带来了市场的急剧增长。既然在中国机..._abb机器人 panbaidu com

Linux基础命令(常用基本操作命令 管道 重定向 grep)_输入重定向命令,首先输入grep ipv6 /etc/*,观察结果,然后将此命令的输出信息-程序员宅基地

文章浏览阅读410次。终端命令格式command [-option] [parameter]command :命令option : 选项parameter:参数查阅命令帮助信息command –help : 帮助信息man command: Linux手册中函数的具体使用通配符* :任意个数字符? :至少一个字符[] :字符组 [abc][a-f]自动补全..._输入重定向命令,首先输入grep ipv6 /etc/*,观察结果,然后将此命令的输出信息

ultraedit高亮显示verilog文件_verilog.uew-程序员宅基地

文章浏览阅读9.5k次,点赞4次,收藏14次。1、下载文件到官网下载Verilog的语法高亮文件,链接如下:http://www.ultraedit.com/index.php?name=Content&pa=showpageπd=40#wordfiles2、文件配置将下载到的“verilog.uew”放到ulteaedit安装路径下的wordfiles文件夹内,以及C:\Documents and Setti_verilog.uew

黑马程序员---IO流二_记录一个程序运行的次数,当满足指定次数,改程序就不可以再继续运行了-程序员宅基地

文章浏览阅读941次。1. 字符流----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------3.1 概念:计算机不区分二进制文件与文本文件。所有的文件都是以二进制形式存储的,因此,从本质上说,所以的文件都是二进制文件。所以字符流是建立在字节流之上,它能够提供字符层次的编码和解码。在写入一个字符时,Java虚拟机会将字符_记录一个程序运行的次数,当满足指定次数,改程序就不可以再继续运行了

随便推点

什么是低音炮,低音炮的原理与音效-程序员宅基地

文章浏览阅读1.2k次。什么是低音炮,低音炮的原理与音效2011-06-15 15:16 低音炮是大家的一个俗称或者简称,严格讲应该是:同轴喇叭,高音仔,超高音,超重低音。就人耳可闻的音频分析而言,由超重低音、低音、低中音、中音、中高音、高音、超高音等组成。 ..._音效是控制低音炮的原理

TypeSDK总体设计思路和架构-程序员宅基地

文章浏览阅读2.1k次。引言:本文旨在提供读者制作一个自己的聚合SDK的思路,抛砖引玉,让更多的读者对聚合SDK有好的理解。 这是最好的时代,这是最坏的时代,这是智慧的时代,这是愚蠢的时代;这是信仰的时期,这是怀疑的时期;这是光明的季节,这是黑暗的季节;这是希望之春,这是失望之冬;人们面前有着各样事物,人们面前一无所有;人们正在直登天堂;人们正在直下地狱。——《双城记》 双城记的开头,正是_typesdk

keras第一个例程mnist_mlp.py解读-程序员宅基地

文章浏览阅读6.4k次。装好keras后,马上运行了例程minst_mlp.py,哇好牛逼,准确率98.4%,但是并不知道自己干了啥。好吧,啃代码。 1. 开头就懵了,数据集在哪呐。 好,从这句入手,找到mnist.py, 从网上下载了minst.pkl.gz,自己顺手下了下来,解压,打开,,,然而并看不懂。肿么办? 不怕,看这里:机器学习–读取mnist数据集 对于这个数据集的详情也可以参考这里:THE_mnist_mlp.py

Solidity 从入门到实战(三)_remix 转账-程序员宅基地

文章浏览阅读1.7k次,点赞3次,收藏8次。Solidity 从入门到实战(三)注意:本专栏主要来自于https://www.bilibili.com/video/BV1St411a7Pk?p=11&spm_id_from=pageDriver的学习笔记以及https://blog.csdn.net/weixin_45067603/article/details/105751748以太坊中的地址1.以太坊中的地址以40位的16进制表示,储存以uint160进行存储2.地址之间支持大小比较、3.可以分为外部账户地址和合约地址_remix 转账

工具:VMware虚拟机各种后缀文件总结_.vmem-程序员宅基地

文章浏览阅读5.6k次,点赞7次,收藏20次。一、文件介绍.log日志文件。这个文件记录了VMwareWorkstation对虚拟机调节运行的情况,记录虚拟机操作,可用了故障诊断。.vmdk这是一个虚拟磁盘文件,它储存了虚拟机硬盘驱动器里的内容。一台虚拟机可以由一个或几个虚拟磁盘文件组成。如果你已经特别指定了虚拟磁盘每2GB为一单独文件的话,虚拟磁盘的大小就决定了虚拟磁盘文件的数量。随着数据写入虚拟磁盘,虚拟磁盘文件将变大,直到这些文件为2GB。(如果你在创建虚拟磁盘时已经把所有的空间都分配了,那么这些文件将在初始时就具..._.vmem

C语言——死亡游戏_今天她玩了一个新游戏,发现每次死亡后角色的金币都会掉落,假设角色开局有g个金币,-程序员宅基地

文章浏览阅读1.3k次,点赞5次,收藏18次。问题描述:据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus和他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。请你编写一个函数,计算一下Josephus 和他的朋友应该安排在什么位置,才能免于一死(最后剩下他们两人)。【要求人的总数与报数均由键_今天她玩了一个新游戏,发现每次死亡后角色的金币都会掉落,假设角色开局有g个金币,

推荐文章

热门文章

相关标签