spring boot + jpa(一)

        這幾天研究了一下使用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如果有不合適的地方請指正。
項目還能集成restful,還沒開始研究,做好了在發出來。
有問題可以聯繫我。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章