iBatis 非查询操作
来源:互联网 发布:java租车系统流程图 编辑:程序博客网 时间:2024/05/17 22:27
iBatis sqlMap文件中非查询语句的元素:
1.<insert>
属性:id,parameterMap,parameterClass
插入数据,对应SqlMapClient的insert方法。
2.<update>
属性:id,parameterMap,parameterClass
更新数据,对应SqlMapClient的update方法。
3.<delete>
属性:id,parameterMap,parameterClass
删除,对应SqlMapClient的delete方法。
4.<procedure>
属性:id,parameterMap,parameterClass,resultClass,resultMap,xmlResultName
调用存储过程,可以用SqlMapClient任意方法执行。
一.插入数据:
1.通过内联参数映射:
xml:
<insert id="insertStu" parameterClass="StudentBean"> insert into student ( Sno, Sname, Ssex, Sage, Sdept ) values ( #sno:CHAR#, #sname:VARCHAR#, #ssex:CHAR#, #sage:NUMBER#, #sdept:CHAR# ) </insert>Java:
StudentBean stuBean = new StudentBean();stuBean.setSage("99");stuBean.setSdept("CS");stuBean.setSname("测试");stuBean.setSsex("男");stuBean.setSno("2001");sqlMapClient.insert("insertStu", stuBean);
在某列被设置为允许为空时,#里面字段名后面加冒号和类型才是必须的,其他时候可以忽略,原因在下面提到。
2.通过外部参数映射:parameterMap
xml:
<sqlMap><typeAlias alias="StudentBean" type="com.bean.StudentBean"/><parameterMap id="StudentMap" class="StudentBean"> <parameter property="sno" jdbcType="CHAR" /> <parameter property="sname" jdbcType="VARCHAR" /> <parameter property="ssex" jdbcType="CHAR" /> <parameter property="sage" jdbcType="NUMBER" /> <parameter property="sdept" jdbcType="CHAR" /></parameterMap> <insert id="insertStu" parameterMap="StudentMap"> insert into student ( Sno, Sname, Ssex, Sage, Sdept ) values ( ?, ?, ?, ?, ? ) </insert></sqlMap>Java代码不变。注意xml中parameterMap的property顺序要和insert中的一致。通常只有当某列被设置为允许为空时,jdbcType属性才是必须的。原因是:JDBC使用如下方法把空值发送到数据库:setNull(int, int),如果没有明确高度iBatis使用何种数据类型,iBatis将默认使用java.sql.Types.OTHER作为第二个参数传入,一些数据库驱动不允许这样,会导致错误。
内联参数只是创建参数映射的一个简化操作,iBatis会在sql语句第一次执行时自动创建参数映射。
<update>,<delete>使用方法和insert类似。
二.数据的批量更新
调用SqlMapClient的startBatch()方法。
Java代码:
StudentBean stuBean = new StudentBean();sqlMapClient.startBatch();for (int i = 9000; i < 9005; i++) {stuBean.setSage("99");stuBean.setSdept("CS");stuBean.setSname("测试");stuBean.setSsex("男");stuBean.setSno(""+i);sqlMapClient.insert("insertStu", stuBean);}sqlMapClient.executeBatch();要注意的是,在调用executeBatch后,以上的所有插入操作才会成功,不调用这句话,sql并没有被真正执行。多个更新操作可以放在batch块中以提高性能。
三.执行存储过程
1.IN
定义存储过程时,IN 表示传递给存储过程的参数。
下面MYSQL存储过程接受2个参数,返回较大的一个。
CREATE PROCEDURE cyh.max_num(IN a INT, IN b INT)BEGIN DECLARE c int; IF a > b THEN SET c=a; ELSE SET c=b; END IF; SELECT c;ENDsqlMap.xml:
<parameterMap id="proc_map" class="hashmap"> <parameter property="a" /> <parameter property="b" /> </parameterMap> <procedure id="proc" parameterMap="proc_map" resultClass="int"> {call max_num(?,?)} </procedure>Java:
Map map = new HashMap();map.put("a", 10);map.put("b", 120);Integer max = (Integer) sqlMapClient.queryForObject("proc", map);System.out.println(max);输出:
120
2.OUT
OUT表示从存储过程传出的参数
改动一下上面的存储过程:
这次存储过程不返回较大值,而是把比较后的大数放在OUT参数中,
CREATE PROCEDURE cyh.max_num(IN a INT, IN b INT, OUT c INT)BEGIN IF a > b THEN SET c=a; ELSE SET c=b; END IF;ENDsqlMap.xml:
<parameterMap id="proc_map" class="hashmap"> <parameter property="a" mode="IN"/> <parameter property="b" mode="IN"/> <parameter property="c" mode="OUT"/> </parameterMap> <procedure id="proc" parameterMap="proc_map"> {call max_num(?,?,?)} </procedure>Java:
Map map = new HashMap();map.put("a", 10);map.put("b", 120);sqlMapClient.queryForObject("proc", map);System.out.println(map.get("c"));
3.INOUT
INOUT是传递给存储过程,并且可以被其修改的参数,有点像C语言的函数传址调用。
MYSQL存储过程:交换2个参数的值
CREATE PROCEDURE cyh.swap(INOUT a INT, INOUT b INT)BEGIN DECLARE tmp INT; SET tmp = a; SET a = b; SET b = tmp;END
sqlMap.xml:
<parameterMap id="proc_map" class="hashmap"> <parameter property="a" mode="INOUT"/> <parameter property="b" mode="INOUT"/> </parameterMap> <procedure id="proc" parameterMap="proc_map"> {call swap(?,?)} </procedure>
Java:
Map map = new HashMap();map.put("a", 10);map.put("b", 120);sqlMapClient.queryForObject("proc", map);System.out.println(map.get("a"));System.out.println(map.get("b"));输出:
120
10
可以看到,a和b的值被交换了。
- iBatis 非查询操作
- ibatis 执行非查询语句
- iBATIS In Action:执行非查询语句(一)
- iBATIS In Action:执行非查询语句(二)
- ibatis 非查询标签(只有输入,没有输出。)
- IBATIS 查询操作 查询条件包含多个元素
- iBatis 查询
- iBatis 操作数据库【设置查询条件】,简单例子之三
- Ibatis对复杂类型的保存或查询操作
- 关于iBATIS的联表查询的操作
- iBatis开发详解(7)-------------执行非查询语句(CRUD,函数和过程
- MongoDB简单查询操作符(非聚合操作)
- ibatis动态查询条件
- ibatis动态查询条件
- iBatis中的动态查询
- iBatis的模糊查询
- (转)ibatis 动态查询
- ibatis动态字段查询
- c++11 笔记,c++ 笔记
- android上不错的开源库
- 会话跟踪(Cookie,Session)
- 修改计算机名或IP后Oracle10g无法启动服务的解决办法
- 等待单个进程信号的正确方法 sigprocmask
- iBatis 非查询操作
- 题目1087:约数的个数
- 由12306动态验证码想到的ASP.NET实现动态GIF验证码(附源码)
- 中文分词概述
- 【c++】纯虚函数和抽象类
- 根据输入自动匹配搜索展示的 combo实例
- OpenOffice API 开发 (五)--调试小技巧
- [OpenGL]用OpenGL制作动画
- android开发之你不知道的API-moveTaskToBack()