基于SpringBoot的Jpa查询

工作需要,用到了jpa,很久没用了,忘了,写一个简单的demo,方便日后查看。
数据库配置文件
在SpringBoot中,application.properties的配置:注意,SpringBoot会默认有数据源的配置,否则启动报错不需要,则在启动类当中加上如下注解:

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})

application.properties的配置:

spring.datasource.url=jdbc:mysql://localhost:3306/db_electric_car?
useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.max-idle=10  
spring.datasource.max-wait=10000  
spring.datasource.min-idle=5  
spring.datasource.initial-size=5 

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jackson.serialization.indent_output=true

新建一个实体类:

package com.cn.restyle.entity;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name ="tb_app_user")  // 对应数据库表名
public class AppUser {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)  // id自增
    private Integer id;

    private String mobile;
    private String pass;

    @Column(name="os")  // 此注解映射实体和数据库字段不一致的情况
    private String osString;
    private String brand;

    @Column(name="create_time")
    private Date createTime;

    @Column(name="update_time")
    private Date updateTime;
    private Integer isDelete;

    public AppUser(){}


    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getMobile() {
        return mobile;
    }
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
    public String getPass() {
        return pass;
    }
    public void setPass(String pass) {
        this.pass = pass;
    }
    public String getOsString() {
        return osString;
    }
    public void setOsString(String osString) {
        this.osString = osString;
    }
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public Date getUpdateTime() {
        return updateTime;
    }
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
    public Integer getIsDelete() {
        return isDelete;
    }
    public void setIsDelete(Integer isDelete) {
        this.isDelete = isDelete;
    }

    public AppUser(Integer id, String mobile, String pass, String osString, String brand, Date createTime,
            Date updateTime, Integer isDelete) {
        super();
        this.id = id;
        this.mobile = mobile;
        this.pass = pass;
        this.osString = osString;
        this.brand = brand;
        this.createTime = createTime;
        this.updateTime = updateTime;
        this.isDelete = isDelete;
    }

    @Override
    public String toString() {
        return "AppUser [id=" + id + ", mobile=" + mobile + ", pass=" + pass + ", osString=" + osString + ", brand="
                + brand + ", createTime=" + createTime + ", updateTime=" + updateTime + ", isDelete=" + isDelete + "]";
    }

}

本人习惯运用的工具类Result:

package com.cn.restyle.unit;

public class Result<T> {

    public static final Integer OK = 0;
    public static final Integer error = -1;

            private Integer code;
            private String msg;
            private T data;

            public Result(){
                this.code = OK;
                this.msg = "success";
            }

            public Result(Integer code, String msg) {
                super();
                this.code = code;
                this.msg = msg;
            }

            public Result(Integer code, String msg, T data) {
                this.code = code;
                this.msg = msg;
                this.data = data;
            }


            public Result(T data) {
                super();
                this.data = data;
            }

            public Integer getCode() {
                return code;
            }

            public void setCode(Integer code) {
                this.code = code;
            }

            public String getMsg() {
                return msg;
            }

            public void setMsg(String msg) {
                this.msg = msg;
            }

            public T getData() {
                return data;
            }

            public void setData(T data) {
                this.data = data;
            }

            public static Integer getOk() {
                return OK;
            }

            public static Integer getError() {
                return error;
            }

}

定义接口:

package com.cn.restyle.mapper;


import org.apache.ibatis.annotations.Param;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import com.cn.restyle.entity.AppUser;

@Repository
public interface AppUserMapper extends JpaRepository<AppUser, Long>{

    AppUser findByMobile(String mobile);

    AppUser findByMobileAndPass(String mobile,String pass);

    @Query("select u from AppUser u where u.mobile = :mobile and u.pass = :pass")
    AppUser withMobleAndPassQuery(@Param("mobile")String mobile,@Param("pass")String pass);

}

注意,我在这踩了个坑,以前 @Query(“select u from AppUser u where u.mobile = :mobile and u.pass = :pass”),我是这么写的,后来运行的时候,报错

2017-11-23 15:55:37.519  INFO 11188 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 35 ms
2017-11-23 15:55:37.600 ERROR 11188 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Name for parameter binding must not be null or empty! On JDKs < 8, you need to use @Param for named parameters, on JDK 8 or better, be sure to compile with -parameters.; nested exception is java.lang.IllegalArgumentException: Name for parameter binding must not be null or empty! On JDKs < 8, you need to use @Param for named parameters, on JDK 8 or better, be sure to compile with -parameters.] with root cause

java.lang.IllegalArgumentException: Name for parameter binding must not be null or empty! On JDKs < 8, you need to use @Param for named parameters, on JDK 8 or better, be sure to compile with -parameters.
    at org.springframework.util.Assert.hasText(Assert.java:181)
    at org.springframework.data.jpa.repository.query.StringQuery.getBindingFor(StringQuery.java:105)
    at org.springframework.data.jpa.repository.query.StringQueryParameterBinder.getBindingFor(StringQueryParameterBinder.java:75)
    at org.springframework.data.jpa.repository.query.StringQueryParameterBinder.bind(StringQueryParameterBinder.java:60)
    at org.springframework.data.jpa.repository.query.ParameterBinder.bind(ParameterBinder.java:101)
    at org.springframework.data.jpa.repository.query.SpelExpressionStringQueryParameterBinder.bind(SpelExpressionStringQueryParameterBinder.java:76)
    at org.springframework.data.jpa.repository.query.ParameterBinder.bindAndPrepare(ParameterBinder.java:161)
    at org.springframework.data.jpa.repository.query.ParameterBinder.bindAndPrepare(ParameterBinder.java:152)
    at org.springframework.data.jpa.repository.query.AbstractStringBasedJpaQuery.doCreateQuery(AbstractStringBasedJpaQuery.java:81)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.createQuery(AbstractJpaQuery.java:190)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:208)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:87)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:116)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:106)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:483)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:461)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:56)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)

不知道现在是不能这样写了么?于是我改成这样:问题解决:

@Query("select u from AppUser u where u.mobile = ?1 and u.pass = ?2")

Controller中的代码:

package com.cn.restyle.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.cn.restyle.entity.AppUser;
import com.cn.restyle.mapper.AppUserMapper;
import com.cn.restyle.unit.Result;


@RestController
@RequestMapping("/v1/spring")
public class Example {
    protected static Logger log = LoggerFactory.getLogger(Example.class);
    @Autowired
    AppUserMapper appUserMapper;

    @RequestMapping("/hell")
    String home(){
        return "Hello Word !";
    }

    @RequestMapping("/hello/{userName}")
    String index(@PathVariable String userName){   // 从路径当中获取值

        return "Hello" + userName;
    }

    @RequestMapping("/showData")
    public Result showData(){
        String mobile = "15721429352";
        AppUser appUser = appUserMapper.findByMobile(mobile);
        if (null != appUser) {
            log.info(appUser.toString());
        }else {
            log.info("数据库当中没有此电话号码");
        }
        return new Result();

    }

    @RequestMapping("/showDataMobileAndPass")
    public Result showDataMobileAndPass(){
        String mobile = "15721429352";
        String pass = "654321";
        AppUser appUser = appUserMapper.findByMobileAndPass(mobile, pass);
        if (null != appUser) {
            log.info(appUser.toString());
        }else {
            log.info("数据库当中没有此电话号码");
        }
        return new Result(appUser);

    }
    @RequestMapping("/withMobileAndPass")
    public Result withMobileAndPass(){
        String mobile = "15721429352";
        String pass = "654321";
        AppUser appUser = appUserMapper.withMobleAndPassQuery(mobile, pass);
        if (null != appUser) {
            log.info(appUser.toString());
        }else {
            log.info("数据库当中没有此电话号码");
        }
        return new Result(appUser);

    }


}

代码是测试运行过的。先下班。。。过两天有时间再完善

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot JPA是Spring Boot框架中的一个模块,它提供了对基于JPA的数据访问层的增强支持。通过使用Spring Data JPA依赖,我们可以轻松地实现基于JPA的存储库。在pom.xml文件中,我们需要添加Spring Data JPA和MySQL数据库的依赖。\[1\] Spring Data JPA使得构建使用数据访问技术的Spring驱动的应用程序更加容易。\[2\] 在测试中,我们可以使用Spring Boot的测试框架来测试JPA的功能。在示例代码中,我们可以看到一个测试类DemoJpaApplicationTests,它使用了@RunWith(SpringRunner.class)和@SpringBootTest注解来配置测试环境。在测试方法testAdd中,我们可以看到如何使用JPA进行数据的新增操作。\[3\] 总结来说,SpringBoot JPA是Spring Boot框架中的一个模块,它提供了对基于JPA的数据访问层的增强支持。通过添加相应的依赖和配置,我们可以轻松地使用JPA进行数据的操作和管理。 #### 引用[.reference_title] - *1* [springboot整合jpa,步骤详细(图文结合讲解)](https://blog.csdn.net/weixin_43442127/article/details/119953836)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SpringBoot环境下JPA的使用](https://blog.csdn.net/m0_49261516/article/details/127212417)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [什么是JPASpringBoot 中使用JPA](https://blog.csdn.net/someday____/article/details/126227331)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值