jpa mysql存储过程_spring data jpa 调用存储过程

网上这方面的例子不是很多,研究了一下,列出几个调用的方法.

假如我们有一个mysql的存储过程

CREATE DEFINER=`root`@`localhost` PROCEDURE `plus1inout`(IN ARG INT, OUT res INT)BEGIN

SET res = ARG + 1;END

就是传入一个int参数,返回这个参数+1.

如果我们要调用这个存储过程的话.可以这么做.

标注entity

packagecom.labofjet.entity;importjavax.persistence.Embedded;importjavax.persistence.EmbeddedId;importjavax.persistence.Entity;importjavax.persistence.NamedStoredProcedureQueries;importjavax.persistence.NamedStoredProcedureQuery;importjavax.persistence.ParameterMode;importjavax.persistence.StoredProcedureParameter;

@Entity

@NamedStoredProcedureQueries({

@NamedStoredProcedureQuery(name= "User.plus1", procedureName = "plus1inout", parameters ={

@StoredProcedureParameter(mode= ParameterMode.IN, name = "arg", type = Integer.class),

@StoredProcedureParameter(mode= ParameterMode.OUT, name = "res", type = Integer.class) }),

@NamedStoredProcedureQuery(name= "User.mytest", procedureName = "mytest") })public classA {

@EmbeddedId

APK id;

String age;

@Embedded

AComponent acomponent;publicAComponent getAcomponent() {returnacomponent;

}public voidsetAcomponent(AComponent acomponent) {this.acomponent =acomponent;

}publicString getAge() {returnage;

}public voidsetAge(String age) {this.age =age;

}publicAPK getId() {returnid;

}public voidsetId(APK id) {this.id =id;

}

@Overridepublic inthashCode() {//TODO Auto-generated method stub

System.out.println("Ahash");return super.hashCode();

}

@Overridepublic booleanequals(Object obj) {//TODO Auto-generated method stub

System.out.println("Aequals");return super.equals(obj);

}

}

随便找一个entity就可以了如果有多个存储过程,可以用@NamedStoredProcedureQueries就像我上面一样.如果只有1个存储过程,可以用@NamedStoredProcedureQuery代替@NamedStoredProcedureQueries.

@StoredProcedureParameter 是用来标注存储过程的参数的..没啥特别的.只是要注意name和数据库里的参数名字一样.

@NamedStoredProcedureQuery里面procedureName 也要与数据库中存储过程的名字一样.而name可以自己取值,与数据库没有关系

标注repository的方法

packagecom.labofjet.repository;importjava.util.List;importorg.springframework.data.jpa.repository.JpaRepository;importorg.springframework.data.jpa.repository.query.Procedure;importorg.springframework.data.repository.query.Param;importorg.springframework.stereotype.Repository;importcom.labofjet.entity.A;importcom.labofjet.entity.APK;

@Repositorypublic interface ARepository extends JpaRepository{

@Procedure

Integer plus1inout(Integer arg);

@Procedure(name="plus1")

Integer alias1(Integer arg);

@Procedure(procedureName="plus1inout")

Integer alias2(Integer arg);

@Procedure(name="User.plus1")

Integer alias3(@Param("arg")Integer argAlias);

@Procedure

Object[] mytest();

}

entity A对应的repository里有多中方法都可以找到那个存储过程

@Procedure

Integer plus1inout(Integer arg);

@Procedure(name="plus1")

Integer alias1(Integer arg);

@Procedure(procedureName="plus1inout")

Integer alias2(Integer arg);

@Procedure(name="User.plus1")

Integer alias3(@Param("arg")Integer argAlias);

上面4个方法中只有

Integer alias1(Integer arg);

这个方法不行,其他3种方法都可以..其实我觉得alias1应该也是可以的...不知道是不是bug....

@Procedure

Integer plus1inout(Integer arg);

用上面这个方法的话方法名要与存储过程名一样.

@Procedure(name="plus1")

Integer alias1(Integer arg);

用alias1这个方法的话会报错.可以考虑改成alias3那种方法.为方法的参数增加@Param注解,就不会报错了.(我觉得这是个bug)

@Procedure(procedureName="plus1inout")

Integer alias2(Integer arg);

上面这种方法的话需要将procedure设置成数据库里存储过程的名字,好处与alias3一样,就是方法名随便自己取,相比plus1inout方法名只能固定,更灵活一些.

感觉以上3种可行的方法里第一种最简单..什么注解的属性都不用写..唯一要求的就是方法的名字与存储过程名字一样.

其他

感觉spring data jpa 调用存储过程还是比较简单的.但是如果存储过程返回一个结果集的话好像不能很好的处理..(看了很多参考.都没有什么好的解决办法..后续有新发现再更新)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Data JPASpring Data项目中的一个模块,它基于JPA(Java Persistence API)规范,提供了一种简化的方式来操作数据库。使用Spring Data JPA,开发人员可以通过定义接口的方式来实现常见的数据库操作,例如插入、查询、更新和删除等。同时,Spring Data JPA还为开发人员提供了一些便捷的特性,例如动态查询、分页、排序等。 在使用Spring Data JPA时,需要先定义一个实体类,并使用JPA注解来映射数据库表结构。例如,下面是一个简单的实体类定义: ``` @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "age") private Integer age; // getters and setters } ``` 接下来,需要定义一个继承自JpaRepository的接口,来完成数据库操作。例如,下面是一个定义了常见操作的接口: ``` public interface UserRepository extends JpaRepository<User, Long> { List<User> findByName(String name); List<User> findByAgeGreaterThan(Integer age); List<User> findByNameLike(String name); } ``` 在使用该接口时,只需要注入该接口的实例即可。例如,下面是一个简单的示例,展示了如何使用该接口进行数据库操作: ``` @Service public class UserService { @Autowired private UserRepository userRepository; public List<User> findByName(String name) { return userRepository.findByName(name); } public List<User> findByAgeGreaterThan(Integer age) { return userRepository.findByAgeGreaterThan(age); } public List<User> findByNameLike(String name) { return userRepository.findByNameLike("%" + name + "%"); } } ``` 在使用MySQL数据库时,需要在项目的配置文件中配置数据源和JPA相关的配置。例如,下面是一个示例的application.yml配置文件: ``` spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver jpa: show-sql: true hibernate: ddl-auto: update properties: hibernate: dialect: org.hibernate.dialect.MySQL8Dialect ``` 其中,`spring.datasource.url`需要根据实际情况修改为对应的MySQL数据库地址和端口;`spring.datasource.username`和`spring.datasource.password`需要修改为对应的数据库用户名和密码。另外,`spring.jpa.show-sql`设置为true时,会在控制台输出JPA执行的SQL语句,方便调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值