spring boot + jpa(一)
阿新 • • 發佈:2019-02-02
這幾天研究了一下使用spring boot 整合jpa的專案,網上有很多資料但是沒找到比較系統的,這幾天根據網上的一些資料系統的整理了一個完整的專案。
5.model----Shop,定義對映實體類,類上面引用的是資料庫表名
8.api----ShopApi 提供資料介面的處理層
專案還能整合restful,還沒開始研究,做好了在發出來。
有問題可以聯絡我。
專案使用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如果有不合適的地方請指正。
專案還能整合restful,還沒開始研究,做好了在發出來。
有問題可以聯絡我。