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,还没开始研究,做好了在发出来。
有问题可以联系我。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值