您的位置:首页 > 编程语言 > Java开发

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设置。
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.MySQL5Dialect
3.项目启动入口,添加了一些引用
@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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息