JAVA通过MyBatis调用MySql存储过程和函数

合集下载

存储过程调用java代码的方法

存储过程调用java代码的方法

存储过程调用java代码的方法存储过程是一组SQL语句的集合,可以被视为一种预编译的SQL 语句,可以通过存储过程调用来实现对数据库的操作。

在Java中,我们可以通过以下方法来调用存储过程:1. 使用JDBC调用存储过程使用JDBC调用存储过程需要以下步骤:1)获取数据库连接。

2)创建CallableStatement对象,使用存储过程名称作为参数创建对象。

3)设置输入参数和输出参数。

输入参数可以通过setXXX()方法设置,输出参数可以使用registerOutParameter()方法注册。

4)执行存储过程。

可以使用execute()或executeUpdate()方法执行。

5)获取输出参数。

以下是一个简单的示例:```try(Connection conn = DriverManager.getConnection(url, user, password)) {CallableStatement cs = conn.prepareCall('{call procedure_name(?, ?)}');cs.setInt(1, 1); // 设置输入参数cs.registerOutParameter(2, Types.VARCHAR); // 注册输出参数cs.execute(); // 执行存储过程String result = cs.getString(2); // 获取输出参数System.out.println(result);} catch (SQLException e) {e.printStackTrace();}```2. 使用ORM框架调用存储过程使用ORM框架调用存储过程需要根据不同的框架进行配置。

以下是使用MyBatis调用存储过程的示例:1)在Mapper XML文件中定义存储过程调用语句。

```<select id='callProcedure' statementType='CALLABLE'>{call procedure_name(#{param1, mode=IN,jdbcType=INTEGER}, #{param2, mode=OUT, jdbcType=VARCHAR})}</select>```2)在Java代码中调用Mapper方法。

Mybatis调用PostgreSQL存储过程实现数组入参传递

Mybatis调用PostgreSQL存储过程实现数组入参传递

Mybatis调⽤PostgreSQL存储过程实现数组⼊参传递前⾔项⽬中⽤到了Mybatis调⽤PostgreSQL存储过程(⾃定义函数)相关操作,由于PostgreSQL⾃带数组类型,所以有⼀个⾃定义函数的⼊参就是⼀个int数组,形如:复制代码代码如下:CREATE OR REPLACE FUNCTION "public"."func_arr_update"(ids _int4)...如上所⽰,参数是⼀个int数组,Mybatis提供了对调⽤存储过程的⽀持,那么PostgreSQL独有的数组类型作为存储过程的参数⼜将如何处理呢?其实很简单,mybatis提供了typeHandlers可以创建⼀个数组类型的类型处理器,具体做法为:实现 org.apache.ibatis.type.TypeHandler 接⼝,或继承⼀个很便利的类 org.apache.ibatis.type.BaseTypeHandler,然后可以选择性地将它映射到⼀个 JDBC 类型,先稍作了解,后⾯再做详细说明,接下来依旧结合⼀个⽰例来看看。

创建⾃定义函数如图,第⼀步⾸先是创建⼀个⽤于调⽤的⾃定义函数,功能也很简单,遍历参数数组的每⼀个元素和t_student表的stuid做⽐较,若⼀致,则修改那条记录的stuname(在其后拼接⼀段字符串),该⾃定义函数的DLL语句如下:CREATE OR REPLACE FUNCTION "public"."func_arr_update"(ids _int4)RETURNS "pg_catalog"."void" AS $BODY$DECLAREscount INTEGER;rownum integer := 1;BEGINscount:=array_length(ids,1);while rownum <= scount LOOPupdate t_student set stuname = stuname || ' has been modified. ' where stuid = ids[rownum];rownum := rownum + 1;END LOOP;RETURN;END$BODY$LANGUAGE 'plpgsql' VOLATILE COST 100;ALTER FUNCTION "public"."func_arr_update"(ids _int4) OWNER TO "postgres";很简单,获取到参数数组的长度后开始循环,匹配stuid并更新stuname,直接在数据库调⽤⼀下看看结果:如上图,可以看到成功修改了stuid为101,102和103的stuname,⾃定义函数已经没问题了,接下来就具体看⼀下如何通过mybatis调⽤。

Java中使用MyBatis Plus连接和操作MySQL数据库

Java中使用MyBatis Plus连接和操作MySQL数据库

Java中使用MyBatis Plus连接和操作MySQL数据库1. 简介近年来,Java语言以其跨平台特性和广泛的应用领域成为了全球最受欢迎的编程语言之一。

而MySQL作为一种强大的开源关系型数据库,也是Java开发者首选的数据库之一。

在Java中,我们可以使用MyBatis Plus来连接和操作MySQL数据库,提升开发效率和简化数据库操作。

2. MyBatis Plus简介MyBatis Plus是基于MyBatis的一款增强工具,旨在简化和提升MyBatis的使用体验。

它提供了一系列强大的功能,如代码生成器、分页插件、性能分析插件等,使得开发者能够更加便捷地开发和维护数据库相关的应用程序。

3. 连接MySQL数据库在使用MyBatis Plus连接MySQL数据库之前,我们需要先在项目中引入相关的依赖。

可以通过Maven或Gradle等构建工具来管理项目的依赖。

在pom.xml或build.gradle文件中添加相应的依赖项,然后进行构建操作。

在Java代码中,我们需要创建一个数据源并配置相关的数据库连接信息。

可以使用MySQL提供的JDBC驱动程序来管理数据库连接。

在MyBatis Plus中,我们可以使用com.mysql.cj.jdbc.Driver作为驱动类,指定数据库的URL、用户名和密码来建立连接。

4. 创建实体类在进行数据库操作之前,我们需要定义与数据库表对应的实体类。

在Java中,我们可以使用POJO(Plain Old Java Object)来表示实体类。

POJO是一种普通的Java对象,不继承任何特定的父类或实现任何特定的接口。

在MyBatis Plus中,实体类需要使用@Table注解来指定对应的数据库表名,使用@Column注解来指定字段名,以及指定主键等属性。

通过在实体类中定义与表对应的字段和属性,我们可以通过MyBatis Plus来进行数据库的增删改查操作。

mybatis调用存储过程获的几种写法 -回复

mybatis调用存储过程获的几种写法 -回复

mybatis调用存储过程获的几种写法-回复mybatis调用存储过程的几种写法MyBatis是一个优秀的持久层框架,它提供了多种使用方式来操作数据库。

其中一个非常重要的功能是调用存储过程。

存储过程是一段预编译的SQL 语句集合,可以用来执行特定的任务。

在本文中,我们将详细介绍使用MyBatis调用存储过程的几种写法,并逐步进行讲解。

首先,我们需要创建一个存储过程。

以MySQL为例,我们可以通过以下SQL语句创建一个简单的存储过程。

sqlCREATE PROCEDURE get_user(IN id INT, OUT name VARCHAR(20)) BEGINSELECT user_name INTO name FROM user WHERE user_id = id; END这个存储过程接受一个整数类型的参数id,返回一个字符串类型的参数name。

它会根据id查询用户表,将对应的用户名称赋值给name。

接下来,我们将通过MyBatis调用这个存储过程。

我们可以使用多种方式来完成这个任务,下面将逐一进行介绍。

方式一:使用select标签调用存储过程在映射文件中,我们可以使用select标签来调用存储过程,然后使用resultType属性指定输出参数的类型。

xml<select id="getUser" statementType="CALLABLE">{ callget_user(#{id,mode=IN},#{name,mode=OUT,jdbcType=VARCHAR}) }</select>在Java代码中,我们需要使用SqlSession的selectOne方法来调用这个查询语句。

javaUser user = sqlSession.selectOne("getUser", parameter);String name = parameter.getName();方式二:使用Select注解调用存储过程如果你更喜欢使用注解来配置MyBatis,你可以使用Select注解来调用存储过程。

mybatis调用存储过程获取返回值

mybatis调用存储过程获取返回值

mybatis调用存储过程获取返回值一、前言MyBatis是一款开源的持久层框架,它支持自定义SQL、存储过程和高级映射等功能。

在实际项目中,我们经常需要调用存储过程来完成一些特殊的业务需求。

本文将介绍如何使用MyBatis调用存储过程并获取返回值。

二、准备工作1. 安装MyBatis和数据库驱动程序首先,我们需要在项目中引入MyBatis和相应的数据库驱动程序。

可以通过Maven或手动下载jar包的方式进行引入。

2. 创建数据库和存储过程为了演示如何调用存储过程,我们需要在数据库中创建一个简单的存储过程。

以下是一个示例:```sqlCREATE PROCEDURE `get_user_count`(OUT `count` INT)BEGINSELECT COUNT(*) INTO count FROM user;END```该存储过程接受一个OUT参数count,返回user表中记录数。

三、配置MyBatis1. 配置数据源在mybatis-config.xml文件中配置数据源信息。

这里以MySQL为例:```xml<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url"value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments></configuration>```2. 配置映射文件在Mapper映射文件中配置调用存储过程的SQL语句。

mybatis中call用法

mybatis中call用法

mybatis中call用法在MyBatis中,`CALL`用于执行存储过程或函数。

通过使用`CALL`语句,你可以将存储过程或函数的执行结果返回到你的应用程序中。

以下是使用`CALL`语句的一般语法:```sqlCALL procedure_name(arguments)```其中,`procedure_name`是存储过程或函数的名称,`arguments`是传递给存储过程或函数的参数列表。

以下是一个示例,演示如何在MyBatis中使用`CALL`语句调用存储过程:```xml<select id="callProcedure" resultType="ng.String">CALL my_procedure(#{param1, mode=IN, jdbcType=VARCHAR}, #{param2, mode=OUT, jdbcType=VARCHAR})</select>```在上面的示例中,`my_procedure`是存储过程的名称,`param1`是输入参数,`param2`是输出参数。

`mode`属性指定参数是输入(`IN`)还是输出(`OUT`),`jdbcType`指定参数的类型。

你可以在Java代码中调用这个Mapper方法来执行存储过程:```javaString param1 = "someValue";CallableStatement statement = sqlSession.prepareCall("{call callProcedure(#{param1, mode=IN, jdbcType=VARCHAR}, #{param2, mode=OUT, jdbcType=VARCHAR})}");statement.setString("param1", param1);statement.registerOutParameter("param2",Types.VARCHAR);statement.execute();String result = statement.getString("param2");```在上面的代码中,我们使用`prepareCall`方法创建了一个可调用语句,并将参数绑定到语句中。

mybatis调用存储过程带inout参数

mybatis调用存储过程带inout参数

mybatis调用存储过程带inout参数MyBatis是一个开源的Java持久化框架,它提供了很多强大的特性,其中包括调用存储过程并传递in和out参数。

在本文中,我们将探讨如何在MyBatis中调用存储过程以及如何处理in和out参数。

##1.配置存储过程调用首先,要在MyBatis中使用存储过程,我们需要在配置文件中进行相应的配置。

假设我们已经有一个存储过程`get_user_info`,它接收一个输入参数`user_id`,并返回一个输出参数`user_info`。

这个存储过程的定义可能如下所示:```CREATE PROCEDURE get_user_infoIN user_id INT,OUT user_info VARCHAR(255)BEGINSELECT info INTO user_info FROM users WHERE id = user_id;END```现在,我们需要在MyBatis的配置文件中添加相应的配置。

假设我们的配置文件为`mybatis-config.xml`,那么我们应该在这个文件中添加以下内容:```xml<configuration>...<mapper resource="UserMapper.xml"/>...</configuration>```## 2. 创建Mapper接口接下来,我们需要创建一个Mapper接口,它将定义我们要执行的数据库操作。

在我们的例子中,我们将创建一个名为`UserMapper`的接口,并在其中添加一个方法`getUserInfo`来调用存储过程。

```javapublic interface UserMapper```##3.创建XML映射文件接下来,我们需要创建一个XML映射文件来指定如何执行存储过程。

在我们的例子中,我们将创建一个名为`UserMapper.xml`的文件,并在其中定义我们的存储过程调用。

JAVA通过MyBatis调用MySql存储过程和函数

JAVA通过MyBatis调用MySql存储过程和函数

JAV A通过MyBatis调用MySql存储过程和函数1.引言无论是采用SPRING MVC框架开发WEB画面,还是开发需按一定时间间隔执行的批处理,都可能要调用数据库的存储过程或函数。

其间调用参数设置不正会浪费大量调试时间初学者甚至放弃使用存储过程。

本文记录了通过MyBatis调用MySql存储过程和函数的具体参数设置内容,供参考。

2.MySql存储过程例/*全公司员工下一年度带薪休假一发赋予处理*/CREATE DEFINER=`DBuser`@`%` PROCEDURE `paid_vacation_compute `( OUT p_返回值 INT(11) ,INOUT p_员工号 CHAR(3) ,p_操作者ID VARCHAR(3))PROC_START:BEGIN/* 变量声明 */DECLARE done INT; #异常退出控制变量DECLARE empNo CHAR(3); #员工号DECLARE dateHire date; #分公司就职日DECLARE workYears INT; #集团内工作年数DECLARE lastYearRemainDays FLOAT; #昨年残日数(允许以小时为单位休假)DECLARE nowYearleaveDays FLOAT; #今年休暇日数(允许以小时为单位休假)DECLARE elapseYear INT; #入集团经过年度数/* 游标声明 */#上年带薪休假数据DECLARE staffPaidVacationDaysCur CURSOR FORSELECT a.EMP_NO, #员工号a.DATE_HIRE, #入职日期a.WORK_YEARS, #工作年限b.REMAIN_DAYS # 上年带薪休假应休但未休残日数FROM T_EMPLOYEE AS a,T_PAID_VACATION AS bWHERE a. EMP_NO = b. EMP_NO/* 程序退出规定声明 */DECLARE CONTINUE HANDLER FOR NOT FOUND SET SET done = 1;DECLARE EXIT HANDLER FOR SQLWARNING SET done = 2;DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGINSET done = 3;ROLLBACK; #SQL异常回滚END;/* 1.输入参数妥当性检查 */IF (p_操作者 IS NULL OR p_操作者 = '') THENSET p_返回值 = 9;LEAVE PROC_START;END IF;SET done = 0;START TRANSACTION;loop_label:LOOP# 读入一条记录, 代入到各个变量中FETCH staffPaidVacationDaysCurINTO empNo, #员工号dateHire, #就职日workYears, #集团内工作年数lastYearRemainDays #昨年残日数;IF done = 1 THENLEAVE loop_label;END IF;/*根据集团内工作年限+分公司就职年限计算下一年度带薪天数*/ SET elapseYear = YEAR(current_timestamp)- Year(dateHire)+ workYears;IF elapseYear = 0 THENSET nowYearLeaveDays = 10;ELSEIF elapseYear = 1 THENSET nowYearLeaveDays = 11;ELSEIF elapseYear = 2 THENSET nowYearLeaveDays = 12;ELSEIF elapseYear = 3 THENSET nowYearLeaveDays = 14;ELSEIF elapseYear = 4 THENSET nowYearLeaveDays = 16;ELSEIF elapseYear = 5 THENSET nowYearLeaveDays = 18;ELSEIF elapseYear >= 6 THENSET nowYearLeaveDays = 20;END IF;SET done = 0;SET p_员工号= empNo;UPDATE T_PAID_VACATIONSETLAST_YEAR_REMAIN_DAYS = lastYearRemainDays,THIS_YEAR_BASE_DAYS = nowYearLeaveDays,UPDATE_DATETIME = current_timestamp,UPDATE_USER_ID = 'SYS',UPDATE_TERMINAL_ID = 'MANUAL'WHERE EMP_NO = CONVERT(empNo USING binary);IF done = 3 THENSET p_返回值 = 6;LEAVE PROC_START;END IF;END LOOP;COMMIT;END3.MySql函数例CREATE DEFINER=`DBuser`@`%` FUNCTION ` paid_vacation_compute `( p_员工号 CHAR(3) ,p_操作者ID VARCHAR(3))) RETURNS int(11)BEGIN/* 变量声明 */DECLARE done INT; #异常退出控制变量DECLARE empNo CHAR(3); #员工号DECLARE dateHire date; #分公司就职日DECLARE workYears INT; #集团内工作年数DECLARE lastYearRemainDays FLOAT; #昨年残日数(允许以小时为单位休假)DECLARE nowYearleaveDays FLOAT; #今年休暇日数(允许以小时为单位休假)DECLARE elapseYear INT; #入集团经过年度数/* 游标声明 */#上年带薪休假数据DECLARE staffPaidVacationDaysCur CURSOR FORSELECT a.EMP_NO, #员工号a.DATE_HIRE, #入职日期a.WORK_YEARS, #工作年限b.REMAIN_DAYS # 上年带薪休假应休但未休残日数FROM T_EMPLOYEE AS a,T_PAID_VACATION AS bWHERE a. EMP_NO = b. EMP_NO/* 程序退出规定声明 */DECLARE CONTINUE HANDLER FOR NOT FOUND SET SET done = 1;DECLARE EXIT HANDLER FOR SQLWARNING SET done = 2;DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGINSET done = 3;ROLLBACK; #SQL异常回滚END;/* 1.输入参数妥当性检查 */IF (p_操作者 IS NULL OR p_操作者 = '') THENRETURN 9;END IF;SET done = 0;START TRANSACTION;loop_label:LOOP# 读入一条记录, 代入到各个变量中FETCH staffPaidVacationDaysCurINTO empNo, #员工号dateHire, #就职日workYears, #集团内工作年数lastYearRemainDays #昨年残日数;IF done = 1 THENLEAVE loop_label;END IF;/*根据集团内工作年限+分公司就职年限计算下一年度带薪天数*/ SET elapseYear = YEAR(current_timestamp)- Year(dateHire)+ workYears;IF elapseYear = 0 THENSET nowYearLeaveDays = 10;ELSEIF elapseYear = 1 THENSET nowYearLeaveDays = 11;ELSEIF elapseYear = 2 THENSET nowYearLeaveDays = 12;ELSEIF elapseYear = 3 THENSET nowYearLeaveDays = 14;ELSEIF elapseYear = 4 THENSET nowYearLeaveDays = 16;ELSEIF elapseYear = 5 THENSET nowYearLeaveDays = 18;ELSEIF elapseYear >= 6 THENSET nowYearLeaveDays = 20;END IF;SET done = 0;SET p_员工号= empNo;UPDATE T_PAID_VACATIONSETLAST_YEAR_REMAIN_DAYS = lastYearRemainDays,THIS_YEAR_BASE_DAYS = nowYearLeaveDays,UPDATE_DATETIME = current_timestamp,UPDATE_USER_ID = 'SYS',UPDATE_TERMINAL_ID = 'MANUAL'WHERE EMP_NO = CONVERT(empNo USING binary);IF done = 3 THENRETURN 6;END IF;END LOOP;COMMIT;END4.MySql存储过程调用时的iBatis用Mapper例BaseInfoEditMapper.xml<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapperPUBLIC"-////DTD Mapper 3.0//EN""/dtd/ibatis-3-mapper.dtd"><mapper namespace="com.xxx.web.mapper.base_info_edit"><select id="VacationProcedure"parameterType="VacationBean"statementType="CALLABLE"> { call paid_vacation_compute (#{ReturnValue,javaType=INTEGER, jdbcType=INTEGER, mode=OUT},#{StaffNumber,javaType=String, jdbcType=CHAR, mode=INOUT},#{HireDate,javaType=String, jdbcType=VARCHAR, mode=IN},#{OperateID,javaType=String, jdbcType=VARCHAR, mode=IN})}</select></mapper>5.MySql函数调用时的iBatis用Mapper例BaseInfoEditMapper.xml<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapperPUBLIC"-////DTD Mapper 3.0//EN""/dtd/ibatis-3-mapper.dtd"><mapper namespace="com.xxx.web.mapper.base_info_edit"><select id="VacationProcedure"parameterType="VacationBean"statementType="CALLABLE"> { #{ReturnValue,javaType=INTEGER, jdbcType=INTEGER, mode=OUT} =call paid_vacation_compute (#{StaffNumber,javaType=String, jdbcType=CHAR, mode=IN},#{HireDate,javaType=String, jdbcType=VARCHAR, mode=IN},#{OperateID,javaType=String, jdbcType=VARCHAR, mode=IN} )} </select></mapper>6.JAVA调用例1(MySql存储过程和函数相同)package com.XXX.impl;import java.util.ArrayList;import java.util.List;import com.XXX.web.bean.VacationCreateBean;import com.XXX.web.dao.BaseInfoEditDAO;import com.XXX.web.util.BasicSqlSupport;public class BaseInfoEditDAOImpl extends BasicSqlSupport implements BaseInfoEditDAO { public boolean addBaseInfo(BaseInfoEditBean objUserInfo) throws Exception {boolean blnFlag=false;//成功FLAG;//全公司员工下一年度带薪休假一发赋予处理VacationCreateBean objVacationCreateBean = new VacationCreateBean();objVacationCreateBean.setStaffNumber(objUserInfo.getSTAFF_NUMBER());objVacationCreateBean.setHireDate(objUserInfo.getDATE_HIRE().toString());objVacationCreateBean.setOperateID(objUserInfo.getCREATE_USER_ID());objVacationCreateBean.setDhcWorkYearsShinKi(objUserInfo.getDHC_WORK_YEARS());String returnValue = (String)this.session.selectOne("com.XXX.web.mapper.base_info_edit.VacationProcedure", objVacationCreateBean);//System.out.println("staffNumber=" + objVacationCreateBean.getStaffNumber());//System.out.println("result=" + objVacationCreateBean.getReturnValue());//System.out.println("returnValue=" + returnValue);//追加結果の判断blnFlag=true;return blnFlag;}}7.処理DAO接口package com.XXX.web.dao;import java.util.List;import com.XXX.web.bean.BaseInfoEditBean;/*** 员工基本信息画面の処理DAO*/public interface BaseInfoEditDAO {public List<BaseInfoEditBean> selectAuthoriyList() throws Exception;public String selectStaffId() throws Exception;public int selectOpetateTimeNum(String strStaffNumber) throws Exception;public boolean addBaseInfo(BaseInfoEditBean objUserInfo) throws Exception;public boolean updateBaseInfo(BaseInfoEditBean objUserInfo) throws Exception;public BaseInfoEditBean searchBaseInfo(String strStaffNumber) throws Exception; }8.共同処理package com.XXX.web.util;import org.apache.ibatis.session.SqlSession;public class BasicSqlSupport{protected SqlSession session;public SqlSession getSession() {return session;}public void setSession(SqlSession session) {this.session = session;} }9. DAO与MAP间的交互BEANpackage com.XXX.web.bean;import java.io.Serializable;public class VacationCreateBean implements Serializable{private int ReturnValue;private String StaffNumber;private String HireDate;private String OperateID;private int WorkYearsShinKi;public int getReturnValue() {return ReturnValue;}public void setReturnValue(int returnValue) {ReturnValue = returnValue;}public String getStaffNumber() {return StaffNumber;}public void setStaffNumber(String staffNumber) {StaffNumber = staffNumber;}public String getHireDate() {return HireDate;}public void setHireDate(String hireDate) {HireDate = hireDate;}public String getOperateID() {return OperateID;}public void setOperateID(String operateID) {OperateID = operateID;}public int getDhcWorkYearsShinKi() {return dhcWorkYearsShinKi;}public void setDhcWorkYearsShinKi(int dhcWorkYearsShinKi) {this.dhcWorkYearsShinKi = dhcWorkYearsShinKi;}}10.通过MAIN函数进行调用package com.ohc.pms.batch;import java.io.FileInputStream;import java.io.IOException;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.Properties;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;public class VacationCreate {/**JDBC驱动名 */static String jdbcDriver = "com.mysql.jdbc.Driver";/**DB URL */static String dbURL = "jdbc:mysql://172.999.999.35:3306/empdb";/** DB用户名 */static String user = "empuser";/**DB密码 */static String pass = "empuser123";/**日志输出 */static protected Logger log = Logger.getLogger(VacationCreate.class );public static void main(String[] args) {Connection conn = null;CallableStatement stmt = null;try{PropertyConfigurator.configure(System.getProperty("user.dir") + "\\" + "log4j.properties");("実行路径:" + System.getProperty("user.dir"));String fileName = "jdbc.properties"; // 属性文件名Properties conf = new Properties();try {conf.load(new FileInputStream(System.getProperty("user.dir") + "\\" + "jdbc.properties"));} catch (IOException e) {System.err.println("Cannot open " + fileName + ".");e.printStackTrace();System.exit(-1); // 程序終了}// 读入jdbcDriver = conf.getProperty("driver");dbURL = conf.getProperty("url");user = conf.getProperty("user");pass = conf.getProperty("password");//JDBC driver登録Class.forName("com.mysql.jdbc.Driver");("DB连接。

java连接Mysql方法和示例

java连接Mysql方法和示例

非本人资料,资料来自:/cxwen78/article/details/6863696这网址很多好的资料。

JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术。

一、JDBC基础知识JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。

JDBC为数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯Java API 编写数据库应用程序,并且可跨平台运行,并且不受数据库供应商的限制。

1、跨平台运行:这是继承了Java语言的“一次编译,到处运行”的特点;2、不受数据库供应商的限制:巧妙在于JDBC设有两种接口,一个是面向应用程序层,其作用是使得开发人员通过SQL调用数据库和处理结果,而不需要考虑数据库的提供商;另一个是驱动程序层,处理与具体驱动程序的交互,JDBC驱动程序可以利用JDBC API创建Java程序和数据源之间的桥梁。

应用程序只需要编写一次,便可以移到各种驱动程序上运行。

Sun提供了一个驱动管理器,数据库供应商——如MySQL、Oracle,提供的驱动程序满足驱动管理器的要求就可以被识别,就可以正常工作。

所以JDBC不受数据库供应商的限制。

JDBC API可以作为连接Java应用程序与各种关系数据库的纽带,在带来方便的同时也有负面影响,以下是JDBC的优、缺点。

优点如下:∙操作便捷:JDBC使得开发人员不需要再使用复杂的驱动器调用命令和函数;∙可移植性强:JDBC支持不同的关系数据库,所以可以使同一个应用程序支持多个数据库的访问,只要加载相应的驱动程序即可;∙通用性好:JDBC-ODBC桥接驱动器将JDBC函数换成ODBC;∙面向对象:可以将常用的JDBC数据库连接封装成一个类,在使用的时候直接调用即可。

mybatis func()用法

mybatis func()用法

mybatis func()用法在 MyBatis 中,`func()` 是一个常用的方法,用于调用数据库中的存储过程或函数。

使用 `func()` 方法可以简化对数据库函数的调用,并使 SQL 语句更加简洁和易于阅读。

`func()` 方法的使用语法如下:```sql<select id="selectByExample" parameterType="map"resultType="someType">SELECT FROM some_table WHERE some_column = {value}</select>```其中,`{value}` 是参数占位符,可以使用 `func()` 方法来调用数据库函数,并将其结果作为参数传递给 `{value}`。

例如:```sql<select id="selectByExample" parameterType="map"resultType="someType">SELECT FROM some_table WHERE some_column = {value} AND another_column = {anotherValue}</select>```可以将 `{anotherValue}` 替换为 `func('some_function', {anotherValue})`,其中 `'some_function'` 是数据库函数的名称。

这样,MyBatis 会将`{anotherValue}` 作为参数传递给 `some_function` 函数,并将函数的返回值作为参数传递给 SQL 语句中的 `{anotherValue}`。

注意,`func()` 方法中的第一个参数是数据库函数的名称,而第二个参数是要传递给函数的参数。

MySQL中的自定义函数与存储过程的开发与调试

MySQL中的自定义函数与存储过程的开发与调试

MySQL中的自定义函数与存储过程的开发与调试1. 引言在数据库开发中,自定义函数和存储过程是非常重要的工具。

它们可以简化复杂的业务逻辑,提高查询和处理数据的效率。

本文将通过介绍MySQL中自定义函数和存储过程的开发与调试,帮助读者深入了解和掌握这两个功能的使用方法。

2. 自定义函数的开发与调试自定义函数是MySQL中的一个强大特性,它允许开发者自己定义并使用自己的函数。

在开发过程中,我们可以使用一些内置函数,如COUNT、SUM等,但有时候我们需要实现一些特定的功能,这时自定义函数就派上用场了。

在MySQL中,自定义函数的开发主要包括以下几个步骤:2.1 创建函数在MySQL中,可以使用CREATE FUNCTION语句来创建函数。

例如,我们希望实现一个函数,计算两个整数的和,可以使用以下语句: CREATE FUNCTION addTwoIntegers(a INT, b INT) RETURNS INTBEGINDECLARE result INT;SET result = a + b;RETURN result;END;在上述代码中,我们创建了一个名为addTwoIntegers的函数,它接受两个整数类型的参数,并返回一个整数类型的值。

函数体部分采用BEGIN...END包围起来,其中使用DECLARE语句声明了一个变量result,并使用SET语句给result 赋值。

最后,使用RETURN语句返回计算结果。

2.2 调用函数完成函数的创建后,我们可以通过SELECT语句来调用这个函数。

例如,我们想计算两个整数10和20的和,可以使用以下语句:SELECT addTwoIntegers(10, 20);执行以上语句后,MySQL会返回计算结果30。

2.3 调试函数在函数开发的过程中,我们可能会遇到一些错误或逻辑问题。

为了方便调试,MySQL提供了一些调试工具和技巧。

例如,我们可以使用SELECT语句打印中间变量的值,以检查函数的执行过程。

mybatis调用存储过程获的几种写法

mybatis调用存储过程获的几种写法

mybatis调用存储过程获的几种写法MyBatis 是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。

MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。

MyBatis 可以使用简单的XML 或注解来配置和映射原生信息,将接口和Java 的POJOs(Plain Old Java Objects, 普通的Java 对象)映射成数据库中的记录。

当使用MyBatis 调用存储过程时,有几种常见的写法。

以下是一些例子:1. 使用XML 映射器调用存储过程你可以在MyBatis 的XML 映射器文件中定义一个调用存储过程的select、insert、update 或delete 元素。

例如:xml<mapper namespace="com.example.MyMapper"><select id="callStoredProc" statementType="CALLABLE">{CALL your_stored_procedure(#{param1, mode=IN, jdbcType=VARCHAR}, #{param2, mode=OUT, jdbcType=INTEGER})} </select></mapper>在这个例子中,your_stored_procedure 是存储过程的名称,param1 和param2 是存储过程的参数。

mode=IN 表示该参数是输入参数,mode=OUT 表示该参数是输出参数。

2. 使用注解调用存储过程你也可以使用MyBatis 的注解来调用存储过程,而不是使用XML 映射器。

例如:java@Mapperpublic interface MyMapper {@Select("{CALL your_stored_procedure(#{param1, mode=IN, jdbcType=VARCHAR}, #{param2, mode=OUT, jdbcType=INTEGER})}") @Options(statementType = StatementType.CALLABLE)void callStoredProc(String param1, @Param("param2") Integer param2);}在这个例子中,@Select 注解用于定义调用存储过程的SQL 语句,@Options 注解用于指定该语句的类型为CALLABLE,表示它是一个调用存储过程的语句。

使用mybatis调用存储过程(注解形式和配置文件形式)

使用mybatis调用存储过程(注解形式和配置文件形式)

DROP PROCEDURE IF EXISTS add_;DELIMITER //CREATE PROCEDURE add_(IN a INT,IN b INT,OUT c INT)BEGINSELECT a+b INTO c; END //package com.example.demo.dao;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Options;import org.apache.ibatis.annotations.Param;import org.apache.ibatis.annotations.Select;import org.apache.ibatis.mapping.StatementType;import java.util.Map;@Mapperpublic interface CallMapper {/*** 注解形式调⽤存储过程 * @param map */@Select("call add_(#{map.a,mode=IN,jdbcType=INTEGER},#{map.b,mode=IN,jdbcType=INTEGER},#{map.d,mode=OUT,jdbcType=INTEGER})") @Options(statementType=StatementType.CALLABLE)void callProcedure(@Param("map")Map map); /*** 使⽤配置⽂件形式调⽤存储过程 * @param map */// void callProcedure2(Map map);}@RunWith(SpringRunner.class)@SpringBootTestpublic class CallMapperTest { @Resourceprivate CallMapper callMapper;@Testpublic void testProcedure(){ Map<String,Object> map = new HashMap<>(); map.put("a",2);map.put("b",3); map.put("d",-1);callMapper.callProcedure(map);System.out.println(map);}/*@Test public void testProcedure2(){Map<String,Object> map = new HashMap<>(); map.put("a",2); map.put("b",3); map.put("c",-1);callMapper.callProcedure2(map);System.out.println(map); }*/}使⽤mybatis 调⽤存储过程(注解形式和配置⽂件形式)最近在看资料中涉及到mybatis ,突然想到mysql 中的视图、存储过程、函数。

mybatis调用方法

mybatis调用方法

mybatis 调用方法
MyBatis 是一个流行的 Java 持久层框架,它提供了许多方便 的方法来执行数据库操作。下面是使用 MyBatis 的常见调用方法:
1. 配置 MyBatis:首先,需要在项目中配置 MyBatis。这通常包 括创建一个 MyBatis 配置文件(例如 mybatis-config.xml ), 指定数据库连接信息和映射文件的位置。
System.out.println(obj.toString()); } } finally { session.close(); }
上述代码通过获取 SqlSession 对象,并通过 getMapper() 方 法获取数据访问接口的实现类实例,然后调用接口方法执行数据库查 询。最后,使用得到的结果进行后续处理。 请注意,上述示例仅展示了 MyBatis 的简单用法,实际情况可能涉 及更多的配置和数据操作。更多详细信息,请参考 MyBatis 官方文 档。
4. 创建 SqlSessionFactory:在代码中,需要通过读取 MyBatis 配 置 文 件 来 创 建 一 个 SqlSessionFactory 对 象 。 SqlSessionFactory 是一个单例对象,负责创建 SqlSession。
5. 创建 SqlSession:通过 SqlSessionFactory,可以创建一个 SqlSession 对象。SqlSession 提供了执行 SQL 语句的方法, 包括插入、更新、删除和查询等。
2. 创建数据访问接口:在使用 MyBatis 进行数据访问之前,需要 创建一个数据访问接口,该接口定义了要执行的数据库操作。 可以使用注解或 XML 方式来定义 SQL 查询和更新语句。
3. 创建映射文件(可选):如果使用 XML 方式定义 SQL 语句, 可以创建一个与数据访问接口对应的映射文件来存储 SQL 语 句的详细信息。映射文件通常包含 SQL 语句、参数和结果的映 射关系。

2025年软件资格考试数据库系统工程师(中级)(基础知识、应用技术)合卷试卷及答案指导

2025年软件资格考试数据库系统工程师(中级)(基础知识、应用技术)合卷试卷及答案指导

2025年软件资格考试数据库系统工程师(基础知识、应用技术)合卷(中级)模拟试卷(答案在后面)一、基础知识(客观选择题,75题,每题1分,共75分)1、数据库系统工程师在数据库设计过程中,以下哪个阶段是确定数据库中数据模型和概念模型的阶段?A、需求分析阶段B、概念结构设计阶段C、逻辑结构设计阶段D、物理结构设计阶段2、在关系数据库中,以下哪种数据类型可以存储固定长度的字符串?A、VARCHARB、CHARC、TEXTD、BLOB3、在数据库系统中,为了确保数据的一致性,在执行事务时必须遵循ACID属性。

以下哪个选项不是ACID属性的一部分?A. 原子性B. 一致性C. 隔离性D. 可用性4、下列关于关系数据库规范化理论的描述中,哪一项是不正确的?A. 第一范式要求每个属性都应该是不可再分的基本项。

B. 满足第二范式的前提是先满足第一范式,并且所有非主属性完全依赖于整个候选键。

C. 第三范式消除了传递依赖。

D. BCNF(Boyce-Codd范式)比第三范式更严格,它不允许任何属性部分依赖或传递依赖于候选键。

5、在数据库系统中,以下哪一项不是关系模型的三要素?A. 属性B. 关系C. 范式D. 约束6、在SQL语言中,用于删除表的命令是:A. DROP TABLEB. DELETE FROMC. TRUNCATE TABLED. DELETE7、在数据库系统中,什么是数据模型?请简述其作用。

8、什么是数据库规范化理论?请简述其目的。

(1)第一范式(1NF):要求每个属性都是不可分割的最小数据单位。

(2)第二范式(2NF):在满足1NF的基础上,要求非主属性完全依赖于主键。

(3)第三范式(3NF):在满足2NF的基础上,要求非主属性不传递依赖于主键。

(4)巴斯-科德范式(BCNF):在满足3NF的基础上,要求每个非平凡函数依赖都由主键决定。

通过规范化理论,可以优化数据库设计,提高数据库的质量和性能。

mybatis sqlserver存储过程返回参数

mybatis sqlserver存储过程返回参数

mybatis sqlserver存储过程返回参数在 MyBatis 中使用存储过程时,若存储过程有返回参数,需要通过特殊的 MyBatis 语法来处理。

下面是一个示例:1. 声明存储过程```sqlCREATE PROCEDURE usp_GetUserCount@gender VARCHAR(10),@count INT OUTPUTASBEGINSELECT @count = COUNT(*) FROM Users WHERE Gender = @genderEND```2. 在 Mapper XML 文件中定义调用存储过程的语句```xml<select id="getUserCount" statementType="CALLABLE" resultType="ng.Integer">{ call usp_GetUserCount(#{gender, mode=IN},#{count, mode=OUT, jdbcType=INTEGER}) }</select>```说明:- `statementType="CALLABLE"` 表示调用存储过程;- `resultType="ng.Integer"` 表示返回结果的数据类型。

3. 在 Mapper 接口中定义调用存储过程的方法```javapublic interface UserMapper {Integer getUserCount(@Param("gender") String gender,@Param("count") Integer count);}```说明:- `@Param` 注解用于指定对应的参数名称。

4. 调用存储过程并获取返回参数的值```javaInteger count = userMapper.getUserCount("male", null); System.out.println(count);```说明:- 调用 `getUserCount` 方法时,传入 `null` 值作为 `count` 参数,表示输出参数;- 执行完存储过程后,`count` 参数的值将会被存储过程赋值,可以直接获取到该值。

mybatis xml 调用自定义方法

mybatis xml 调用自定义方法

MyBatis 允许你在XML 映射文件中调用自定义的Java 方法。

这通常是通过使用<select>, <insert>, <update>, <delete>等元素中的statementType属性来实现的。

当statementType设置为CALLABLE时,你可以调用存储过程或函数。

然而,如果你想在MyBatis 中调用自定义的Java 方法,而不是存储过程或函数,那么通常的做法是将这些方法放在你的Mapper 接口中,并在XML 映射文件中引用这些方法。

下面是一个简单的例子来说明这个过程:1、Mapper 接口首先,定义一个Mapper 接口,并在其中声明你的自定义方法:javapublic interface UserMapper {List<User> customSelectUsers();}2、XML 映射文件然后,在相应的XML 映射文件中定义这个方法的SQL 查询:xml<mapper namespace="erMapper"><select id="customSelectUsers" resultType="er">SELECT * FROM users</select></mapper>在这个例子中,namespace属性应该与你的Mapper 接口的全限定名相匹配,而id属性则应该与Mapper 接口中声明的方法名相匹配。

3、使用Mapper最后,在你的服务层或控制器中,你可以注入这个Mapper 并调用你的自定义方法:java@Servicepublic class UserService {private final UserMapper userMapper;@Autowiredpublic UserService(UserMapper userMapper) {erMapper = userMapper;}public List<User> getUsers() {return userMapper.customSelectUsers();}}这样,当你调用getUsers()方法时,MyBatis 会自动执行在XML 映射文件中定义的SQL 查询,并返回结果。

mybatis连接数据库的原理

mybatis连接数据库的原理

mybatis连接数据库的原理MyBatis是一款十分流行的基于Java的开源持久层框架。

它的主要作用就是将Java对象和关系型数据库表之间的映射关系定义清楚,并提供了许多便捷的API和配置方式,使得Java开发者可以更加方便地进行关系型数据库数据的CRUD操作。

MyBatis连接数据库的原理是基于JDBC的。

具体来说,MyBatis的底层通过Java的JDBC API来连接和执行SQL语句。

在MyBatis使用时,我们需要首先在配置文件中配置连接数据库的相关信息,包括数据库的URL、用户名、密码等。

同时,我们也需要定义SQL语句以及相关参数,MyBatis会将这些信息封装成一个JDBC的PreparedStatement对象执行。

在实际的应用中,我们可以使用MyBatis提供的SqlSessionFactory 类来创建一个SqlSession对象,通过SqlSession的API来执行SQL 语句并获取结果。

SqlSessionFactory是MyBatis用于创建SqlSession对象的工厂类,它负责访问和管理数据库连接和事务。

在使用SqlSession对象时,MyBatis会将用户提交的SQL语句和参数封装成一个对象,然后交由SqlSession负责执行。

值得注意的是,MyBatis除了基于JDBC的连接方式外,还可以通过其他连接池框架(如C3P0、Druid等)来连接数据库,从而提高系统性能和并发能力。

总之,MyBatis作为一款高效且灵活的Java持久层框架,其连接数据库的基本原理是基于JDBC的。

我们只需要在配置文件中设置相关参数和SQL语句,MyBatis便可以根据这些信息创建JDBC连接并执行相应的操作。

对于Java开发者来说,MyBatis能够大大简化开发过程,提高数据库操作效率,是值得推荐的框架之一。

mybatis 调用入参实体中的方法

mybatis 调用入参实体中的方法

MyBatis 是一个用于Java 应用程序的持久层框架,它允许你将SQL 查询与Java 对象之间的映射进行配置,以便于数据库操作。

如果你想要在MyBatis 中调用入参实体中的方法,你可以通过XML 配置文件或注解的方式来实现。

以下是一些示例,演示了如何在MyBatis 中调用入参实体中的方法:1. 使用XML 配置文件:假设你有一个名为User 的Java 实体类,其中包含一个方法getUserId(),你可以在MyBatis 的XML 配置文件中这样使用它:<!--在映射文件中配置SQL 查询--><select id="getUserById" resultType="er">SELECT * FROM users WHERE id = #{user.getUserId()}</select>然后,在你的Java 代码中,传递一个带有getUserId() 方法的User 对象作为参数:User user = new User();user.setUserId(123);User resultUser = sqlSession.selectOne("getUserById", user);在这个示例中,MyBatis 会调用user.getUserId() 方法来获取参数值。

2. 使用注解:你也可以在接口的方法参数上使用@Param 注解来指定参数名称,然后在SQL 语句中使用该参数名称调用方法。

例如:public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{erId}")User getUserById(@Param("user") User user);}在这个示例中,@Param("user") 注解指定了参数名称为"user",然后在SQL 查询中可以使用#{erId} 来调用User 对象的getUserId() 方法。

Mybatis调用存储过程,使用Map进行输入输出参数的传递

Mybatis调用存储过程,使用Map进行输入输出参数的传递

Mybatis调⽤存储过程,使⽤Map进⾏输⼊输出参数的传递做个记录,以备后⽤java代码:public String texuChange() throws Exception {try {Map<String, Object> map = new HashMap<String, Object>();if(texu != null){SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Map<String, Object> parameterMap = new HashMap<String, Object>();if(texu.getFlag() == 0){parameterMap.put("v_tz_flg", 0);}else if(texu.getFlag() == 1){parameterMap.put("v_tz_flg", 1);}else{parameterMap.put("v_tz_flg", 2);};if(texu.getStart() != null&&texu.getEnd() != null){parameterMap.put("v_tz_qujian_start", formatter.format(texu.getStart()));parameterMap.put("v_tz_qujian_end", formatter.format(texu.getEnd()));}else{parameterMap.put("v_tz_qujian_start", null);parameterMap.put("v_tz_qujian_end", null);}parameterMap.put("v_baoliu_p", texu.getBaoliup());parameterMap.put("v_max_p", texu.getPingxianbl());parameterMap.put("v_stop_run", texu.getStoprun());//调⽤存储过程pingbiService.texuChange(parameterMap);map.put("p_result", parameterMap.get("p_result"));}responseSuccessJson(map, "", "common.list.success");} catch(ServiceException ex) {log.warn("input fail.", ex);responseServiceErrorJson(getCommonInputErrorInfo(null, ex.getErrorCode()));} catch(Exception e) {log.error("input error.", e);responseSystemErrorJson(getCommonErrorInfo());}return null;} public String texuChange(Map<String, Object> parameterMap) {return pingbiDao.texuChange(parameterMap); }配置⽂件mapper<parameterMap type="java.util.Map" id="texuChangeMap"><parameter property="v_tz_flg" jdbcType="INTEGER" mode="IN"/><parameter property="v_tz_qujian_start" jdbcType="DATE" mode="IN"/><parameter property="v_tz_qujian_end" jdbcType="DATE" mode="IN"/><parameter property="v_baoliu_p" jdbcType="INTEGER" mode="IN"/><parameter property="v_max_p" jdbcType="INTEGER" mode="IN"/><parameter property="v_stop_run" jdbcType="INTEGER" mode="IN"/><parameter property="p_result" jdbcType="VARCHAR" mode="OUT"/></parameterMap><select id="texuChange" parameterMap="texuChangeMap" statementType="CALLABLE" resultType="String"> {call pl_texu(,,,,,,)}</select>。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JAV A通过MyBatis调用MySql存储过程和函数1.引言无论是采用SPRING MVC框架开发WEB画面,还是开发需按一定时间间隔执行的批处理,都可能要调用数据库的存储过程或函数。

其间调用参数设置不正会浪费大量调试时间初学者甚至放弃使用存储过程。

本文记录了通过MyBatis调用MySql存储过程和函数的具体参数设置内容,供参考。

2.MySql存储过程例/*全公司员工下一年度带薪休假一发赋予处理*/CREATE DEFINER=`DBuser`@`%` PROCEDURE `paid_vacation_compute `( OUT p_返回值 INT(11) ,INOUT p_员工号 CHAR(3) ,p_操作者ID VARCHAR(3))PROC_START:BEGIN/* 变量声明 */DECLARE done INT; #异常退出控制变量DECLARE empNo CHAR(3); #员工号DECLARE dateHire date; #分公司就职日DECLARE workYears INT; #集团内工作年数DECLARE lastYearRemainDays FLOAT; #昨年残日数(允许以小时为单位休假)DECLARE nowYearleaveDays FLOAT; #今年休暇日数(允许以小时为单位休假)DECLARE elapseYear INT; #入集团经过年度数/* 游标声明 */#上年带薪休假数据DECLARE staffPaidVacationDaysCur CURSOR FORSELECT a.EMP_NO, #员工号a.DATE_HIRE, #入职日期a.WORK_YEARS, #工作年限b.REMAIN_DAYS # 上年带薪休假应休但未休残日数FROM T_EMPLOYEE AS a,T_PAID_VACATION AS bWHERE a. EMP_NO = b. EMP_NO/* 程序退出规定声明 */DECLARE CONTINUE HANDLER FOR NOT FOUND SET SET done = 1;DECLARE EXIT HANDLER FOR SQLWARNING SET done = 2;DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGINSET done = 3;ROLLBACK; #SQL异常回滚END;/* 1.输入参数妥当性检查 */IF (p_操作者 IS NULL OR p_操作者 = '') THENSET p_返回值 = 9;LEAVE PROC_START;END IF;SET done = 0;START TRANSACTION;loop_label:LOOP# 读入一条记录, 代入到各个变量中FETCH staffPaidVacationDaysCurINTO empNo, #员工号dateHire, #就职日workYears, #集团内工作年数lastYearRemainDays #昨年残日数;IF done = 1 THENLEAVE loop_label;END IF;/*根据集团内工作年限+分公司就职年限计算下一年度带薪天数*/ SET elapseYear = YEAR(current_timestamp)- Year(dateHire)+ workYears;IF elapseYear = 0 THENSET nowYearLeaveDays = 10;ELSEIF elapseYear = 1 THENSET nowYearLeaveDays = 11;ELSEIF elapseYear = 2 THENSET nowYearLeaveDays = 12;ELSEIF elapseYear = 3 THENSET nowYearLeaveDays = 14;ELSEIF elapseYear = 4 THENSET nowYearLeaveDays = 16;ELSEIF elapseYear = 5 THENSET nowYearLeaveDays = 18;ELSEIF elapseYear >= 6 THENSET nowYearLeaveDays = 20;END IF;SET done = 0;SET p_员工号= empNo;UPDATE T_PAID_VACATIONSETLAST_YEAR_REMAIN_DAYS = lastYearRemainDays,THIS_YEAR_BASE_DAYS = nowYearLeaveDays,UPDATE_DATETIME = current_timestamp,UPDATE_USER_ID = 'SYS',UPDATE_TERMINAL_ID = 'MANUAL'WHERE EMP_NO = CONVERT(empNo USING binary);IF done = 3 THENSET p_返回值 = 6;LEAVE PROC_START;END IF;END LOOP;COMMIT;END3.MySql函数例CREATE DEFINER=`DBuser`@`%` FUNCTION ` paid_vacation_compute `( p_员工号 CHAR(3) ,p_操作者ID VARCHAR(3))) RETURNS int(11)BEGIN/* 变量声明 */DECLARE done INT; #异常退出控制变量DECLARE empNo CHAR(3); #员工号DECLARE dateHire date; #分公司就职日DECLARE workYears INT; #集团内工作年数DECLARE lastYearRemainDays FLOAT; #昨年残日数(允许以小时为单位休假)DECLARE nowYearleaveDays FLOAT; #今年休暇日数(允许以小时为单位休假)DECLARE elapseYear INT; #入集团经过年度数/* 游标声明 */#上年带薪休假数据DECLARE staffPaidVacationDaysCur CURSOR FORSELECT a.EMP_NO, #员工号a.DATE_HIRE, #入职日期a.WORK_YEARS, #工作年限b.REMAIN_DAYS # 上年带薪休假应休但未休残日数FROM T_EMPLOYEE AS a,T_PAID_VACATION AS bWHERE a. EMP_NO = b. EMP_NO/* 程序退出规定声明 */DECLARE CONTINUE HANDLER FOR NOT FOUND SET SET done = 1;DECLARE EXIT HANDLER FOR SQLWARNING SET done = 2;DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGINSET done = 3;ROLLBACK; #SQL异常回滚END;/* 1.输入参数妥当性检查 */IF (p_操作者 IS NULL OR p_操作者 = '') THENRETURN 9;END IF;SET done = 0;START TRANSACTION;loop_label:LOOP# 读入一条记录, 代入到各个变量中FETCH staffPaidVacationDaysCurINTO empNo, #员工号dateHire, #就职日workYears, #集团内工作年数lastYearRemainDays #昨年残日数;IF done = 1 THENLEAVE loop_label;END IF;/*根据集团内工作年限+分公司就职年限计算下一年度带薪天数*/ SET elapseYear = YEAR(current_timestamp)- Year(dateHire)+ workYears;IF elapseYear = 0 THENSET nowYearLeaveDays = 10;ELSEIF elapseYear = 1 THENSET nowYearLeaveDays = 11;ELSEIF elapseYear = 2 THENSET nowYearLeaveDays = 12;ELSEIF elapseYear = 3 THENSET nowYearLeaveDays = 14;ELSEIF elapseYear = 4 THENSET nowYearLeaveDays = 16;ELSEIF elapseYear = 5 THENSET nowYearLeaveDays = 18;ELSEIF elapseYear >= 6 THENSET nowYearLeaveDays = 20;END IF;SET done = 0;SET p_员工号= empNo;UPDATE T_PAID_VACATIONSETLAST_YEAR_REMAIN_DAYS = lastYearRemainDays,THIS_YEAR_BASE_DAYS = nowYearLeaveDays,UPDATE_DATETIME = current_timestamp,UPDATE_USER_ID = 'SYS',UPDATE_TERMINAL_ID = 'MANUAL'WHERE EMP_NO = CONVERT(empNo USING binary);IF done = 3 THENRETURN 6;END IF;END LOOP;COMMIT;END4.MySql存储过程调用时的iBatis用Mapper例BaseInfoEditMapper.xml<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapperPUBLIC"-////DTD Mapper 3.0//EN""/dtd/ibatis-3-mapper.dtd"><mapper namespace="com.xxx.web.mapper.base_info_edit"><select id="VacationProcedure"parameterType="VacationBean"statementType="CALLABLE"> { call paid_vacation_compute (#{ReturnValue,javaType=INTEGER, jdbcType=INTEGER, mode=OUT},#{StaffNumber,javaType=String, jdbcType=CHAR, mode=INOUT},#{HireDate,javaType=String, jdbcType=VARCHAR, mode=IN},#{OperateID,javaType=String, jdbcType=VARCHAR, mode=IN})}</select></mapper>5.MySql函数调用时的iBatis用Mapper例BaseInfoEditMapper.xml<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapperPUBLIC"-////DTD Mapper 3.0//EN""/dtd/ibatis-3-mapper.dtd"><mapper namespace="com.xxx.web.mapper.base_info_edit"><select id="VacationProcedure"parameterType="VacationBean"statementType="CALLABLE"> { #{ReturnValue,javaType=INTEGER, jdbcType=INTEGER, mode=OUT} =call paid_vacation_compute (#{StaffNumber,javaType=String, jdbcType=CHAR, mode=IN},#{HireDate,javaType=String, jdbcType=VARCHAR, mode=IN},#{OperateID,javaType=String, jdbcType=VARCHAR, mode=IN} )} </select></mapper>6.JAVA调用例1(MySql存储过程和函数相同)package com.XXX.impl;import java.util.ArrayList;import java.util.List;import com.XXX.web.bean.VacationCreateBean;import com.XXX.web.dao.BaseInfoEditDAO;import com.XXX.web.util.BasicSqlSupport;public class BaseInfoEditDAOImpl extends BasicSqlSupport implements BaseInfoEditDAO { public boolean addBaseInfo(BaseInfoEditBean objUserInfo) throws Exception {boolean blnFlag=false;//成功FLAG;//全公司员工下一年度带薪休假一发赋予处理VacationCreateBean objVacationCreateBean = new VacationCreateBean();objVacationCreateBean.setStaffNumber(objUserInfo.getSTAFF_NUMBER());objVacationCreateBean.setHireDate(objUserInfo.getDATE_HIRE().toString());objVacationCreateBean.setOperateID(objUserInfo.getCREATE_USER_ID());objVacationCreateBean.setDhcWorkYearsShinKi(objUserInfo.getDHC_WORK_YEARS());String returnValue = (String)this.session.selectOne("com.XXX.web.mapper.base_info_edit.VacationProcedure", objVacationCreateBean);//System.out.println("staffNumber=" + objVacationCreateBean.getStaffNumber());//System.out.println("result=" + objVacationCreateBean.getReturnValue());//System.out.println("returnValue=" + returnValue);//追加結果の判断blnFlag=true;return blnFlag;}}7.処理DAO接口package com.XXX.web.dao;import java.util.List;import com.XXX.web.bean.BaseInfoEditBean;/*** 员工基本信息画面の処理DAO*/public interface BaseInfoEditDAO {public List<BaseInfoEditBean> selectAuthoriyList() throws Exception;public String selectStaffId() throws Exception;public int selectOpetateTimeNum(String strStaffNumber) throws Exception;public boolean addBaseInfo(BaseInfoEditBean objUserInfo) throws Exception;public boolean updateBaseInfo(BaseInfoEditBean objUserInfo) throws Exception;public BaseInfoEditBean searchBaseInfo(String strStaffNumber) throws Exception; }8.共同処理package com.XXX.web.util;import org.apache.ibatis.session.SqlSession;public class BasicSqlSupport{protected SqlSession session;public SqlSession getSession() {return session;}public void setSession(SqlSession session) {this.session = session;} }9. DAO与MAP间的交互BEANpackage com.XXX.web.bean;import java.io.Serializable;public class VacationCreateBean implements Serializable{private int ReturnValue;private String StaffNumber;private String HireDate;private String OperateID;private int WorkYearsShinKi;public int getReturnValue() {return ReturnValue;}public void setReturnValue(int returnValue) {ReturnValue = returnValue;}public String getStaffNumber() {return StaffNumber;}public void setStaffNumber(String staffNumber) {StaffNumber = staffNumber;}public String getHireDate() {return HireDate;}public void setHireDate(String hireDate) {HireDate = hireDate;}public String getOperateID() {return OperateID;}public void setOperateID(String operateID) {OperateID = operateID;}public int getDhcWorkYearsShinKi() {return dhcWorkYearsShinKi;}public void setDhcWorkYearsShinKi(int dhcWorkYearsShinKi) {this.dhcWorkYearsShinKi = dhcWorkYearsShinKi;}}10.通过MAIN函数进行调用package com.ohc.pms.batch;import java.io.FileInputStream;import java.io.IOException;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.Properties;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;public class VacationCreate {/**JDBC驱动名 */static String jdbcDriver = "com.mysql.jdbc.Driver";/**DB URL */static String dbURL = "jdbc:mysql://172.999.999.35:3306/empdb";/** DB用户名 */static String user = "empuser";/**DB密码 */static String pass = "empuser123";/**日志输出 */static protected Logger log = Logger.getLogger(VacationCreate.class );public static void main(String[] args) {Connection conn = null;CallableStatement stmt = null;try{PropertyConfigurator.configure(System.getProperty("user.dir") + "\\" + "log4j.properties");("実行路径:" + System.getProperty("user.dir"));String fileName = "jdbc.properties"; // 属性文件名Properties conf = new Properties();try {conf.load(new FileInputStream(System.getProperty("user.dir") + "\\" + "jdbc.properties"));} catch (IOException e) {System.err.println("Cannot open " + fileName + ".");e.printStackTrace();System.exit(-1); // 程序終了}// 读入jdbcDriver = conf.getProperty("driver");dbURL = conf.getProperty("url");user = conf.getProperty("user");pass = conf.getProperty("password");//JDBC driver登録Class.forName("com.mysql.jdbc.Driver");("DB连接。

相关文档
最新文档