spring boot+spring data jpa(hibernate)完整项目
2018-03-02 08:57
761 查看
这几天研究了一下使用spring boot 整合jpa的项目,网上有很多资料但是没找到比较系统的,这几天根据网上的一些资料系统的整理了一个完整的项目。
项目使用maven创建,只是做的数据接口,没有做web,使用jpa操作数据会很方便,但是当需要进行多表查询时,就会很吃力,解决办法有好几种,本项目只提供了一种比较简便的实现。项目能使用jpa查询也能自定义查询,jpa提供了Pageable分页功能,自定义多表查询需要自己实现分页。简单介绍一下项目,话不多说上代码......
1.下面是pom文件引入的一些jar包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 添加对jsp视图解析的支持 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>9.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- 下面两个引入为了操作数据库 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- QueryDSL整合复杂查询 -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- 只需引入spring-boot-devtools 即可实现热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- Json包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.7</version>
</dependency>
<!-- 为了监控数据库 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
2.application.properties文件,包含了数据库的连接配置,和一些jpa,hibernate设置。
5.model----Shop,定义映射实体类,类上面引用的是数据库表名
6.dao----ShopDao,定义数据访问接口,这里就不把jpa的自动查询的方法名命名规则类出来了,有文档自己查一下。public interface ShopDao extends JpaRepository<Shop,Long> {
/**
* @Description: 通过id查询店铺信息
*/
Shop findById(Integer id);
/**
* @Description: 查询所有店铺信息
*/
List<Shop>findByIsCheck(Integer isCheck);
/**
* @Description: 查询店铺信息,分页展示
*/
Page<Shop> findByIsCheck(Integer isCheck, Pageable pageable);
/**
* @Description: 通过店铺名称查询店铺(使用jpa的jpql)
* 查询语句中的表名,字段名都是按照实体类的名称写
*/
@Query("select s from Shop s where s.shopName =:name" )
List<Shop> getShopName(@Param("name") String name);
/**
* @Description: 通过名称查询店铺列表(使用自定义原生sql)
*/
@Query(value="select * from shop where shop_name like %:name% ",nativeQuery = true )
List<Shop> selectShopName(@Param("name") String name);
多表连接查询不能在这个接口里写
}7.service----ShopService 处理数据的业务逻辑,多表连接查询写在这里。
8.api----ShopApi 提供数据接口的处理层
项目还能集成restapi,还没开始研究,做好了在发出来。
有问题可以联系我(qq:24314606)。
项目使用maven创建,只是做的数据接口,没有做web,使用jpa操作数据会很方便,但是当需要进行多表查询时,就会很吃力,解决办法有好几种,本项目只提供了一种比较简便的实现。项目能使用jpa查询也能自定义查询,jpa提供了Pageable分页功能,自定义多表查询需要自己实现分页。简单介绍一下项目,话不多说上代码......
1.下面是pom文件引入的一些jar包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 添加对jsp视图解析的支持 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>9.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- 下面两个引入为了操作数据库 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- QueryDSL整合复杂查询 -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- 只需引入spring-boot-devtools 即可实现热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- Json包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.7</version>
</dependency>
<!-- 为了监控数据库 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
2.application.properties文件,包含了数据库的连接配置,和一些jpa,hibernate设置。
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase spring.datasource.username=用户名 spring.datasource.password=密码 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.max-idle=10 spring.datasource.max-wait=30000 spring.datasouecr.min-idel=5 spring.datasource.initial-size=5 server.port=8012 server.session.timeout=10 server.tomcat.uri-encoding=UTF-8 #JPA Configuration: spring.jpa.database=MYSQL # Show or not log for each sql query spring.jpa.show-sql=true spring.jpa.generate-ddl=false # Hibernate ddl auto (create, create-drop, update) spring.jpa.hibernate.ddl-auto=update #spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy #spring.jpa.database=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect3.项目启动入口,添加了一些引用
@ComponentScan(basePackages={"org.mypackage"}) // 扫描该包路径下的所有spring组件 @EnableJpaRepositories("org.mypackage.dao") // JPA扫描该包路径下的Repositorie @EntityScan("org.mypackage.model") // 扫描实体类 @SpringBootApplication @EnableScheduling public class SpringbootJpaApplication { public static void main(String[] args) { SpringApplication.run(SpringbootJpaApplication.class, args); } @RequestMapping("/") public String index(){ return "hello spring boot"; } }4.接下来就是项目的各个包,api(接口),dao(相当于repository),model,service,一共就用到了这四个包。
5.model----Shop,定义映射实体类,类上面引用的是数据库表名
@Entity @Table(name = "shop") public class Shop { @Id @Column(name = "id") private Integer id; private String shopName;(数据库中字段为:shop_name) private String shopAddress; private String shopImage; private Date createDate;
private Integer isCheck; 属性就不都列出来了,别忘记了get,set方法}
6.dao----ShopDao,定义数据访问接口,这里就不把jpa的自动查询的方法名命名规则类出来了,有文档自己查一下。public interface ShopDao extends JpaRepository<Shop,Long> {
/**
* @Description: 通过id查询店铺信息
*/
Shop findById(Integer id);
/**
* @Description: 查询所有店铺信息
*/
List<Shop>findByIsCheck(Integer isCheck);
/**
* @Description: 查询店铺信息,分页展示
*/
Page<Shop> findByIsCheck(Integer isCheck, Pageable pageable);
/**
* @Description: 通过店铺名称查询店铺(使用jpa的jpql)
* 查询语句中的表名,字段名都是按照实体类的名称写
*/
@Query("select s from Shop s where s.shopName =:name" )
List<Shop> getShopName(@Param("name") String name);
/**
* @Description: 通过名称查询店铺列表(使用自定义原生sql)
*/
@Query(value="select * from shop where shop_name like %:name% ",nativeQuery = true )
List<Shop> selectShopName(@Param("name") String name);
多表连接查询不能在这个接口里写
}7.service----ShopService 处理数据的业务逻辑,多表连接查询写在这里。
@Service("ShopService") public class ShopService { @PersistenceContext private EntityManager entityManager; @Autowired private ShopDao shopDao; /** * @Description: 通过id查询店铺信息 */ public Shop findById(Integer id){ return shopDao.findById(id); } /** * @Description: 查询所有已审核的店铺信息 */ public List<Shop>findByIsCheck(Integer isCheck){ return shopDao.findByIsCheck(isCheck); } /** * @Description: 查询店铺信息,分页展示 */ public Page<Shop> findByIsCheck(Integer isCheck, Pageable pageable){ return shopDao.findByIsCheck(isCheck,pageable); } /** * @Description: 通过名称查询店铺列表(使用原生sql) */ public List<Shop> selectShopByName(String shopName){ return shopDao.selectShopName(shopName); } /** * @Description: 通过店铺名称查询店铺(使用jpa的jpql) */ public List<Shop> getShopName(String name){ return shopDao.getShopName(name); } /** * @Description: 查询店铺和预约套餐(多表连接查询) */ public List<Map<String,Object>> selectShopAndService(String shopId){ String sql = "select s.shop_name,g.* from shop s left join shop_sale_group g on s.id = g.shop_id where s.id = "+shopId; Session session = entityManager.unwrap(org.hibernate.Session.class); SQLQuery query2 = session.createSQLQuery(sql); //返回类型是List<map> query2.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); //返回数据是list<List<Object>> //query2.setResultTransformer(Transformers.TO_LIST); return query2.list(); } /** * @Description: 查询店铺和预约套餐,分页查询(多表连接查询) */ public Page<List<Map<String,Object>>> selectShopAndServicePage(String shopId,Pageable pageable){ String sql = "select s.shop_name,g.* from shop s left join shop_sale_group g on s.id = g.shop_id where s.id = "+shopId; Session session = entityManager.unwrap(org.hibernate.Session.class); SQLQuery query1 = session.createSQLQuery(sql); query1.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); //每页查询的记录 query1.setFirstResult((pageable.getPageNumber()) * pageable.getPageSize()); query1.setMaxResults(pageable.getPageSize()); //查询总条数 String countSql = "select count(*) from shop s left join shop_sale_group g on s.id = g.shop_id where s.id = "+shopId; Query countQuery = entityManager.createNativeQuery(countSql); BigInteger count = (BigInteger)countQuery.getSingleResult(); Long count1 = count.longValue(); //查询列表 Page<List<Map<String,Object>>> pageList = new PageImpl<List<Map<String,Object>>>(query1.list(), pageable, count1); return pageList; } pageable使用jpa就能创建,这里就不多说了。 }
8.api----ShopApi 提供数据接口的处理层
@RestController @RequestMapping("shopApi") public class ShopApi { @Autowired private ShopService shopService; /** * @Description: 通过id查询店铺信息 */ @ResponseBody @RequestMapping("selectShopById") public Shop selectShopById(Integer id){ return shopService.findById(id); } /** * @Description: 查询所有店铺信息 */ @ResponseBody @RequestMapping("selectShopList") public List<Shop>selectShopList(Integer isCheck){ return shopService.findByIsCheck(isCheck); } /** * @Description: 查询店铺信息,分页展示(pageable分页是从0开始) */ @ResponseBody @RequestMapping("selectShopListPage") public Page<Shop> selectShopListP(Integer isCheck, Integer page){ int size = 10; Sort sort = new Sort(Sort.Direction.ASC,"id"); Pageable pageable = new PageRequest(page,size,sort); return shopService.findByIsCheck(isCheck,pageable); } /** * @Description: 通过名称查询店铺列表(使用原生sql) */ @ResponseBody @RequestMapping("selectListByName") public List<Shop> selectShopByName(String shopName){ return shopService.selectShopByName(shopName); } /** * @Description: 通过店铺名称查询店铺(使用jpa的jpql) */ @ResponseBody @RequestMapping("getShopName") public List<Shop> getShopName(String name){ return shopService.getShopName(name); } /** * @Description: 查询店铺和预约套餐(多表连接查询) */ @ResponseBody @RequestMapping("selectShopDetail") public List<Map<String,Object>> selectShopAndService(String shopId){ return shopService.selectShopAndService(shopId); } /** * @Description: 查询店铺和预约套餐,分页查询(多表连接查询) */ @ResponseBody @RequestMapping("selectShopAndServicePage") public Page<List<Map<String,Object>>> selectShopAndServicePage(String shopId,Integer page){ int size = 10; Pageable pageable = new PageRequest(page,size); return shopService.selectShopAndServicePage(shopId,pageable); } }以上就是完整的项目代码了,项目已通过编译,功能都能正常运行。刚开始用spring boot和jpa如果有不合适的地方请指正。
项目还能集成restapi,还没开始研究,做好了在发出来。
有问题可以联系我(qq:24314606)。
相关文章推荐
- (五)spring-boot中使用spring-data-jpa(hibernate实现)
- Spring Boot + Spring Data JPA 项目整合开发记录(持续更新)
- Spring Boot + Spring Data JPA项目配置多数据源
- SpringBoot项目 使用Sprin Data Jpa 实现数据库的 增 ,删, 改, 查操作
- spring boot项目快速构建(spring mvc+jpa+hibernate+mysql+gradle)
- spring+springMVC+Hibernate+spring-data-jpa 完整干净注解版的Demo
- 创建一个SpringBoot + springmvc + hibernateJPA + MyBatis的项目
- Spring-boot+JPA+Hibernate项目修改数据库MySQL为Oracle出现的问题
- SpringBoot项目 使用Sprin Data Jpa 操作数据库
- IDEA+gradle+spring+springMVC+hibernate+JPA+SpringData的web项目
- 从头开始写项目【一】(Spring-SpringMVC-SpringDataJPA-Hibernate)
- spring data jpa boot thymeleaf hibernate manytoone 双向关联 java.lang.StackOverflowError: null
- Spring Boot整合Spring MVC、Spring、Spring Data JPA(Hibernate)
- 笔记:Spring boot+Thymeleaf+spring-data-jpa简单项目搭建
- spring-boot、spring-data-jpa、hibernate整合
- JPA/Hibernate/Spring Data概念【从零开始学Spring Boot】
- spring boot 集成spring data jpa 时报错java.lang.ClassNotFoundException: org.hibernate.OptimisticLockExcep
- springboot+spring-data-jpa
- spring data jpa hibernate 映射 postgres jsonb
- spring data Jpa hibernate实现