目录
5、在Spring boot 项目中使用JPA-hibernate
2、在项目的resource目录中,新建一个配置文件application.properties。
1、spring data JPA 给我们提供几个常用的接口。
7、Springboot 项目中使用JdbcTemplate
1、什么是JPA?
JPA全称Java Persistence API.JPASun官方提出的Java持久化规范,通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
本文代码地址:https://download.csdn.net/download/m0_37985112/10689331
2、Hibernate?
Hibernate就是JPA的一种实现,它是一个开源的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
3、什么是Spring Data?
Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。此外,它还支持基于关系型数据库的数据服务,如Oracle RAC等。对于拥有海量数据的项目,可以用Spring Data来简化项目的开发,就如Spring Framework对JDBC、ORM的支持一样,Spring Data会让数据的访问变得更加方便。
4、什么是Spring Data JPA?
Spring Data是一个开源框架,在这个框架中Spring Data JPA只是这个框架中的一个模块,所以名称才叫Spring Data JPA。如果单独使用JPA开发,你会发现这个代码量和使用JDBC开发一样有点烦人,所以Spring Data JPA的出现就是为了简化JPA的写法,让你只需要编写一个接口继承一个类就能实现CRUD操作了。
5、在Spring boot 项目中使用JPA-hibernate
本文选用mariadb作为操作的关系行
1、在pom文件中添加依赖,
因为在上一篇博客中,我们已经配置了springboot的父工程,所有可以不需要指定下面依赖版本号。
<!-- 添加MySQL数据库驱动依赖包. --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- 添加Spring-data-jpa依赖. --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
2、在项目的resource目录中,新建一个配置文件application.properties。
配置mysql数据库的链接,并配置JPA相关配置。文件内容如下:
######################################################## ###datasource -- 指定mysql数据库连接信息. ######################################################## spring.datasource.url = jdbc:mysql://localhost:3306/test spring.datasource.username = root spring.datasource.password = 123456 spring.datasource.driverClassName = com.mysql.jdbc.Driver spring.datasource.max-active=20 spring.datasource.max-idle=8 spring.datasource.min-idle=8 spring.datasource.initial-size=10 ######################################################## ### Java Persistence Api -- Spring jpa的配置信息. ######################################################## # Specify the DBMS spring.jpa.database = MYSQL # Show or not log for each sql query spring.jpa.show-sql = true # Hibernate ddl auto (create, create-drop, update) spring.jpa.hibernate.ddl-auto = update # Naming strategy #[org.hibernate.cfg.ImprovedNamingStrategy #org.hibernate.cfg.DefaultNamingStrategy] spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy # stripped before adding them to the entity manager) spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
上面文件中大多数配置信息大家都可以看懂,其中spring.jpa.hibernate.ddl-auto = update。一下是ddl配置的几种意义。
ddl-auto:create----每次运行该程序,没有表格会新建表格,表内有数据会清空 ddl-auto:create-drop----每次程序结束的时候会清空表 ddl-auto:update----每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新 ddl-auto:validate----运行程序会校验数据与数据库的字段类型是否相同,不同会报错
3、编写数据对应的实体类
/** * 创建了一个实体类。 * * 如何持久化呢? * * 1、使用@Entity进行实体类的持久化操作,当JPA检测到我们的实体类当中有 * * @Entity 注解的时候,会在数据库中生成对应的表结构信息。 */ @Entity public class Cat { /** * 使用@Id指定主键. * * 使用代码@GeneratedValue(strategy=GenerationType.AUTO) * 指定主键的生成策略,mysql默认的是自增长。 * */ @Id @GeneratedValue(strategy=GenerationType.AUTO) private int id;//主键. private String catName;//姓名. cat_name //com.alibaba.fastjson.annotation.JSONField @JSONField(format="yyyy-MM-dd HH:mm") private Date createTime;//创建时间. private int catAge;//年龄. cat_age; /* * 我们不想返回remarks? * serialize:是否需要序列化属性. */ @JSONField(serialize=false) private String remarks;//备注信息. public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCatName() { return catName; } public void setCatName(String catName) { this.catName = catName; } public int getCatAge() { return catAge; } public void setCatAge(int catAge) { this.catAge = catAge; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public String getRemarks() { return remarks; } public void setRemarks(String remarks) { this.remarks = remarks; } }
4、编写dao层的代码
可以在项目中新建repository目录,并新建如下类,dao层就已经ok了。
/** * Integer是cat数据库的主键类型 * */ public interface CatRepository extends CrudRepository<Cat, Integer>{ }
5、编写service代码
@Service public class CatService { @Resource private CatRepository catRepository; /** * save,update ,delete 方法需要绑定事务. * * 使用@Transactional进行事务的绑定. * * @param cat */ //保存数据. @Transactional public void save(Cat cat){ catRepository.save(cat); } //删除数据》 @Transactional public void delete(int id){ catRepository.delete(id); } //查询数据. public Iterable<Cat> getAll(){ return catRepository.findAll(); } }
6、编写controller
@RestController @RequestMapping("/cat") public class CatController { @Resource private CatService catService; @RequestMapping("/getAll") public Iterable<Cat> getAll(){ return catService.getAll(); } }
到此已经准备完毕,可以先在数据库添加一条任意数据,然后使用启动类启动项目,在浏览器访问如下链接:
http://localhost:8080/cat/getAll
如果页面显示出所有的数据库中该表的数据即可。
6、简单了解 Spring Data JPA
截至到现在我们已经简单在spring boot 中简单使用了spring Data JPA ,接下来我们简单总结一下:
1、spring data JPA 给我们提供几个常用的接口。
其中最常用的就是前三个接口。
1、CrudRepository
我们刚才项目中cat的dao层已经使用过,这个接口提供了非常简单的增删查,以及一些批量处理。
2、Repository
Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法。
如果使用这个接口需要注意一下几点:
1. Repository是一个空接口,即是一个标记接口;
2. 若我们定义的接口继承了Repository,则该接口会被IOC容器识别为一个Repository Bean纳入到IOC容器中,进而可以 在该接口中定义满足一定规范的方法。
3. 实际上也可以通过@RepositoryDefinition,注解来替代继承Repository接口。
4. 查询方法以find | read | get开头;
5. 涉及查询条件时,条件的属性用条件关键字连接,要注意的是条件属性以首字母大写。
6.使用@Query注解可以自定义JPQL语句实现更灵活的查询。
3、PagingAndSortingRepository
该接口提供了分页与排序功能
--Iterable<T> findAll(Sort sort); //排序
--Page<T> findAll(Pageable pageable); //分页查询(含排序功能)
此接口的注意事项:
1、 查询方法 以 get | find | read 开头.
2、 涉及查询条件时,条件的属性用条件关键字连接,要注意的是条件属性以首字母大写。
使用实例如下:
public interface CatRepository extends PagingAndSortingRepository<Cat, Integer>{ /** * 1/ 查询方法 以 get | find | read 开头. * 2/ 涉及查询条件时,条件的属性用条件关键字连接,要注意的是条件属性以首字母大写。 */ //根据catName进行查询 : 根据catName进行查询. public Cat findByCatName(String catName); /** * 如何编写JPQL语句, * Hibernate -- HQL语句. * JPQL 语句 和HQL语句是类似的. */ @Query("from Cat where catName=:cn") public Cat findMyCatName(@Param("cn")String catName); }
4、JpaRepository
查找所有实体,排序、查找所有实体,执行缓存与数据库同步
5、JpaSpecificationExecutor
不属于Repository体系,实现一组 JPA Criteria 查询相关的方法,封装 JPA Criteria 查询条件。通常使用匿名内部类的方式来创建该接口的对象。
7、Springboot 项目中使用JdbcTemplate
1、pom中引入依赖
同样因为我们的项目的父工程是spring-boot,所以可以不设置版本号。如果已经引用JPA也可以不引用此依赖,比如我们上文已经使用到了spring-boot-starter-data-jpa。所以也可以在此不再修改pom文件。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- 如果在JPA已经加入的话,则可以不用引入以上的配置。 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
2、编写使用JdbcTemplate的dao
@Repository public class CatDao { @Resource private JdbcTemplate jdbcTemplate; public Cat selectByCatName(String catName){ /** * 1、定义一个Sql语句; * 2、定义一个RowMapper. * 3、执行查询方法. */ String sql = "select *from cat where cat_name=?"; RowMapper<Cat> rowMapper = new BeanPropertyRowMapper<>(Cat.class); Cat cat = jdbcTemplate.queryForObject(sql, new Object[]{catName}, rowMapper); return cat; } }
3、编写service
service的编写都类似,只是引入的dao层不同。如下所示:
@Service public class CatService { @Resource private CatDao catDao; //因为是查询,不需要事物 @Transactional public Cat selectByCatName(String catName){ return catDao.selectByCatName(catName); } }
4、编写controller
controller编写类似,如下所示
@RestController @RequestMapping("/cat") public class CatController { @Resource private CatService catService; @RequestMapping("/selectByCatName") public Cat selectByCatName(String catName){ return catService.selectByCatName(catName); } }
截止到现在springboot 中使用JdbcTemplate,已经完毕,依旧启动类启动项目,浏览器进行测试。