openTSP连接sqlServer数据库&jpa调用存储过程

  openTSP框架下的模块都是连接mysql数据库,近期青汽有连接sqlServer数据库的需求,在调研后配置了sqlServer数据库,使用jpa调用存储过程,中间也踩了不少坑,总结一下,避免大家再掉进去。

  1、首先配置sqlServer的依赖

  

        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>sqljdbc4</artifactId>
            <version>4.0</version>
        </dependency>

  注意:从maven私服下载jar包失败,为了简便使用,可以先下载sqljdbc4.jar,然后用命令行切换到jar包所在路径,执行mvn install:install-file -Dfile=sqljdbc4.jar -Dpackaging=jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.0,这样就把jar包安装到了本地依赖仓库。

  2、修改数据库连接配置文件application-xxx.properties

  

spring.datasource.url=jdbc:sqlserver://ip:1433;DatabaseName=test
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.validation-query=SELECT 1;
spring.datasource.test-on-borrow=true
spring.datasource.test-while-idle=true
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver

spring.datasource.max-active=200
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10

spring.jpa.database = SQLSERVER
spring.jpa.database-platform=org.hibernate.dialect.SQLServer2005Dialect
spring.jpa.show-sql=true
spring.jta.bitronix.datasource.allow-local-transactions=true

  sqlServer的driverClass是com.microsoft.sqlserver.jdbc.SQLServerDriver

  

3、java连接sqlServer数据库

  1)创建sql文件test-dynamic.xml

  

    <sql-query name="queryTest">
        <![CDATA[
           SELECT
                jf0 ,
                jf1 ,
                jf2 ,
                jf3 ,
                jf4
            FROM
                testTable
        ]]>
    </sql-query>
    

  2)dao层调用

  

 public String getJF01(TestCommand command)
    {

        List<TestPojo> list = dao.sqlFind("queryTest",command, TestPojo.class);
        for(TestPojo pojo : list) {
            System.out.println("pojo=" + pojo);
        }
        return list.get(0).toString();
    }

  TestPojo里就是设置了jf0到jf5这几个属性以及set、get方法,不再赘述。

4、JPA调用sqlServer存储过程

  1)Entity

  采用注解的方式,要和数据库的1张表关联,随便一张表都可以。多个存储过程用NamedStoredProcedureQueries。

@Entity
@Table(name="testTable")
@NamedStoredProcedureQueries({
        @NamedStoredProcedureQuery(name = "testProc1", procedureName = "testProc1", parameters = { //name是JPA中的存储过程的名字, procedureName是数据库存储过程的名字
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "inParam1", type = String.class),
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "inParam2", type = String.class)}),
        @NamedStoredProcedureQuery(name = "testProc", procedureName = "testProc", parameters = {
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "inParam1", type = String.class),
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "inParam2", type = String.class),
                @StoredProcedureParameter(mode = ParameterMode.OUT, name = "outParam", type = String.class) })
})
public class TestEntity implements java.io.Serializable
{
    @Id
    private String name;
}

  2)Repository

  参数使用@Param,注解内容要和entity的参数名一致。

@Repository
public interface TestRepository extends JpaRepository<TestEntity, String>, JpaSpecificationExecutor<TestEntity>
{
    @Procedure(name="testProc")//和entity的jpa的存储过程名一致
    String testProc(@Param("inParam1") String inParam1,@Param("inParam2") String inParam2 );
}

  3)Service

  直接调用repository,就有单个返回值。

@Service
public class TestService extends BaseService {

    @Autowired
    private TestRepository repository;

    public String testProc(TestCommand command)
    {
        String out = repository.testProc1("chen",String.valueOf(System.currentTimeMillis()));
        System.out.println("outParam = "+ out);
        return out;
    }
}

5、多个out出参问题

注意:jpa只支持1个OUT出参的存储过程,暂时无法调用多个OUT出参的存储过程(可以接收select语句的多个出参)。我们项目里恰巧是多个OUT出参存储过程,而且还修改不了存储过程,只能1个单出参存储过程,封装多出参存储过程,并把多个出参合并成1个。

  inner多出参存储过程:

ALTER PROCEDURE [dbo].[inProc]
  @inParam1 VARCHAR(20),
  @inParam2 VARCHAR(20),
  @outParam1 VARCHAR(20) OUTPUT,
  @outParam2 VARCHAR(20) OUTPUT
AS
BEGIN
  insert into mytable values(@inParam1,@inParam2);
  set @outParam1 = ‘result123‘;
  set @outParam2 = ‘result456‘;
END

  外层封装的单出参存储过程

ALTER PROCEDURE [dbo].outProc
  @inParam1 varchar(20) ,
  @inParam2  varchar(20) ,
  @outParam1  varchar(20) output
AS
declare @out1 varchar(20)
declare @out2 varchar(20)
BEGIN
    exec inProc @inParam1,@inParam2,@out1 output,@out2 output;

    set @outParam1 = @out1 + @out2 ;
END

面对多个out出参,也可以采用我们最熟悉度jdbc方式,关键点就是获取数据库连接connection。

Session session = (org.hibernate.Session) entityManager.getDelegate();
SessionFactoryImplementor sf = (SessionFactoryImplementor) session.getSessionFactory();
try {
    Connection connection  = sf.getConnectionProvider().getConnection();//获取数据库connection连接
    CallableStatement cs =  connection.prepareCall("{call inProc(?,?,?,?)}");
    cs.setString(1,"chen");
    cs.setString(2,String.valueOf(System.currentTimeMillis()));
    cs.registerOutParameter(3, Types.VARCHAR);//注册第一个out出参
    cs.registerOutParameter(4, Types.VARCHAR);//注册第二个out出参
    cs.execute();
    String code = cs.getString(3);//获取第一个out出参
    String message = cs.getString(4);//获取第二个out出参
    System.out.println("code="+code+",message="+message);
}
catch (SQLException e)
{
    e.printStackTrace();
}
finally
{
    cs.close();
    connection.close();
}
时间: 2024-10-09 22:13:53

openTSP连接sqlServer数据库&jpa调用存储过程的相关文章

Spring Data JPA调用存储过程实例

Spring Data JPA调用存储过程实例 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs JPA连接到数据库,调用存储过程,这样的需求很常见.本文就针对这一点,讲述如何使用Spring Data JPA调用存储过程的方法. 1.存储过程 假设存储过程如下: CREATE OR REPLACE PACKAGE test_pkg AS PROCEDURE in_only_test (inParam1 IN VARC

c#连接sql数据库并调用

1.导入命名空间 using System.Data.SqlClient; //连接SQLServer 数据库专用 2.创建连接 SqlConnection lo_conn = New SqlConnection("Server=服务器名字或IP;Database=数据库名字;uid=用户名;pwd=密码"); 3.打开连接,第2步并没有真正连接数据库 lo_conn.Open(); //真正与数据库连接 4.向数据库发送SQL命令要使用SqlCommand: SqlCommand l

asp.net 连接sqlserver数据库

在asp.net中连接sqlserver数据库之前,首先得确保正常安装了sqlserver2008,同时有数据库. 在项目中添加一个类DB,用来专门负责执行对数据库的增删改查.在添加的过程中会弹出下面的一个提示 直接点是就可以了. 在这个类中,首先定义一个连接对象 private SqlConnection conn = null;然后定义下面三个函数 private void SetConnection()//初始化连接对象 { if (conn == null) { //获取配置文件中的数据

使用JPA调用存储过程,返回存储多行数据的OUT参数(游标)

前提 想要使用JPA调用存储过程,需要使用JPA2.1以上,API详情点击 此处 数据库使用 Oracle12 JPA实现为 Hibernate 用法 定义存储过程 create or replace procedure findPerson(param in string, cur_search_result out sys_refcursor) as begin open cur_search_result for select p.* from persons p where u.name

笨鸟先飞随笔:ADO.NET中VS连接Sqlserver数据库的代码

在main函数中添加的连接Sqlserver数据库的代码如下所示: 以下代码用于Sqlserver验证方式 首先需要引用命名空间 using system.System.Data.SqlClient; static void Main(string[] args) { string constring = "server=local;database=teaching;uid=sa;pwd=123456"; using (SqlConnection conn = new SqlConn

java 连接sqlserver数据库语句

import java.sql.*; /** * java 连接sqlserver数据库语句 * @author Administrator * */ public class Main {         public static void main(String [] args) throws SQLException {                                     String driverName="com.microsoft.sqlserver.jdbc.

笨鸟先飞随笔:ADO.NET中VS连接Sqlserver数据库的代码(Windows身份验证方式补充)

上一篇只写到了数据库Sqlserver连接方式下的连接代码在这里对Windows验证方式的连接做一下补充: 关于VS连接Sqlserver数据库windows验证方式的操作方式: 01.VS窗口中上方菜单依次选择数据 02.添加新数据源 03.然后选择数据库后点击下一步 如下图所示: 04.选择数据集然后点击下一步 如下图所示: 05.点击新建连接,弹出对话框 如下图所示: 06.数据源显示为Microsoft SQL server SqlClient 如果不是则需要点击更改修改为Microso

JDBC连接SqlServer数据库(非默认实例)方法

一般我们在连接数据库的时候都是用的默认实例名,今天遇到了用非默认是实例名:连接代码如下(Java): URL=jdbc:microsoft:sqlserver://192.168.1.85//DEMO;DatabaseName=PePsiEasyData 说明: 192.168.1.85是数据库地址.不指定端口 //DEMO 指定实例名为DEMO 也可以写成这样: URL=jdbc:microsoft:sqlserver://192.168.1.85;instanceName=DEMO;Data

unity3d 连接sqlserver数据库

U3d连接SQLServer首先把Unity安装目录下的System.Data.dll拷到工程的Asset/Plugins目录下,然后编写连接数据库的脚本,在以上两个步骤无误的情况下,提示这个错误,要考虑SQLServer的相关服务有没有开启,同时要在SQLServer的配置管理器中启用TCP/IP协议,步骤如下 打开开始—程序—Microsoft SQL Server 2005—配置工具—SQL Server Configuration Manager-- SQL Server 2005网络配