MyBatis执行动态sql及存储过程

1 利用MyBatis进行模糊查询

在利用MyBatis进行模糊查询时候,需要用到concat,注意在Oracle中concat连接的是两个参数,不是三个参数;

持久化类:

package com.web.entity;

public class Student {
	private Integer studentId;
	private String studentName;
	private Classes classes;
	public Integer getStudentId() {
		return studentId;
	}
	public void setStudentId(Integer studentId) {
		this.studentId = studentId;
	}
	public String getStudentName() {
		return studentName;
	}
	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}
	public Classes getClasses() {
		return classes;
	}
	public void setClasses(Classes classes) {
		this.classes = classes;
	}

}

dao中方法:

package com.web.dao;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.web.entity.Student;

public class StudentDao {
	private int res=-1;
	private SqlSession sqlSession=null;
	public  SqlSession getSqlSession(){

		try{
			String resource="mybatis-config.xml";
			InputStream is=Resources.getResourceAsStream(resource);
			SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
			sqlSession=sqlSessionFactory.openSession(true);

		}catch(Exception e){
			System.out.println("出错");
			e.printStackTrace();
		}
		return sqlSession;
	}

	public Student findTStudentByName(Student student){
		sqlSession=getSqlSession();
		Student s=sqlSession.selectOne("lk", student);
		return s;
	}

	/*public int getCount(Integer classesid){
		int result=-1;
		Map<String, Integer> map=new HashMap<String, Integer>();
		map.put("classesid", classesid);
		map.put("studentcount", -1);
		sqlSession=getSqlSession();
		sqlSession.selectOne("gc", map);
		result=map.get("studentcount");
		return result;
	}*/
}

映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pb.dao.StudentDao">
<!-- 	<resultMap type="Student" id="ts">
		<id property="studentId" column="studentId" />
		<result property="studentName" column="studentName" />
		<association property="classes" column="classesId"
			javaType="Classes">
			<id property="classesId" column="classesId" />
			<result property="classesName" column="classesName" />
		</association>
	</resultMap>
	<select id="selectonetoone" resultMap="ts" parameterType="Student">
		select
		s.studentid,s.studentname,c.classesname
		from
		student s
		left join classes c
		on s.classesid=c.classesid
		where s.studentid=#{studentId}
	</select> -->

	<select id="lk" resultMap="ts" parameterType="Student">
		select * from student s where s.studentname like concat(concat('%','h'),'%')
	</select>

	<!-- <select id="gc" parameterMap="gm" statementType="CALLABLE">
		call pro_student(?,?)
	</select>
	<parameterMap type="java.util.Map" id="gm">
		<parameter property="classesid" mode="IN" jdbcType="INTEGER"/>
		<parameter property="studentcount" mode="OUT" jdbcType="INTEGER"/>
	</parameterMap> -->

</mapper>

2 利用MyBatis执行存储过程:

在映射文件中定义一个parameterMap作为参数,设置statementType="CALLABLE",过程的参数放置?站位符。

在方法中也创建一个Map,放置参数,SqlSession调用方法的时候传入该Map即可。

存储过程:

create or replace procedure pro_student(
cid in number,
coun out number
)is
begin
select count(*) into coun from student s where s.classesid=cid;
end;

配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pb.dao.StudentDao">
<!-- 	<resultMap type="Student" id="ts">
		<id property="studentId" column="studentId" />
		<result property="studentName" column="studentName" />
		<association property="classes" column="classesId"
			javaType="Classes">
			<id property="classesId" column="classesId" />
			<result property="classesName" column="classesName" />
		</association>
	</resultMap>
	<select id="selectonetoone" resultMap="ts" parameterType="Student">
		select
		s.studentid,s.studentname,c.classesname
		from
		student s
		left join classes c
		on s.classesid=c.classesid
		where s.studentid=#{studentId}
	</select> -->

	<select id="lk" resultMap="ts" parameterType="Student">
		select * from student s where s.studentname like concat(concat('%','h'),'%')
	</select>

	<select id="gc" parameterMap="gm" statementType="CALLABLE">
		call pro_student(?,?)
	</select>
	<parameterMap type="java.util.Map" id="gm">
		<parameter property="classesid" mode="IN" jdbcType="INTEGER"/>
		<parameter property="studentcount" mode="OUT" jdbcType="INTEGER"/>
	</parameterMap>

</mapper>

dao中方法:

package com.web.dao;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.web.entity.Student;

public class StudentDao {
	private int res=-1;
	private SqlSession sqlSession=null;
	public  SqlSession getSqlSession(){

		try{
			String resource="mybatis-config.xml";
			InputStream is=Resources.getResourceAsStream(resource);
			SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
			sqlSession=sqlSessionFactory.openSession(true);

		}catch(Exception e){
			System.out.println("出错");
			e.printStackTrace();
		}
		return sqlSession;
	}

	public Student findTStudentByName(Student student){
		sqlSession=getSqlSession();
		Student s=sqlSession.selectOne("lk", student);
		return s;
	}

	public int getCount(Integer classesid){
		int result=-1;
		Map<String, Integer> map=new HashMap<String, Integer>();
		map.put("classesid", classesid);
		map.put("studentcount", -1);
		sqlSession=getSqlSession();
		sqlSession.selectOne("gc", map);
		result=map.get("studentcount");
		return result;
	}
}



时间: 2024-12-09 07:14:10

MyBatis执行动态sql及存储过程的相关文章

存储过程中执行动态Sql语句

存储过程中执行动态Sql语句 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能,还可以编写更安全的代码.EXEC在某些情况下会更灵活.除非您有令人信服的理由使用EXEC,否侧尽量使用sp_executesql. 1.EXEC的使用 EXEC命令有两种用法,一种是执行一个存储

Java下拼接执行动态SQL语句(转)

在实际业务中经常需要拼接动态SQL来完成复杂数据计算,网上各类技术论坛都有讨论,比如下面这些问题: http://bbs.csdn.net/topics/390876591 http://bbs.csdn.net/topics/390981627 https://www.linkedin.com/groups/SQL-Query-Help-needed-137774.S.5948812806903119877?trk=groups_items_see_more-0-b-ttl http://bb

Java下拼接执行动态SQL语句

Java拼接动态SQL的一般做法有       1.使用动态语句 很多数据库都提供了处理动态SQL的语法,如Oracle的EXECUTE IMMEDIATE语句.MSSQL的EXEC和SP_EXECUTESQL.Mysql的预处理语句等.这些功能让我们在数据库端来处理动态查询提供了极大遍历,但这种方式只适用于相对简单地动态查询,复杂的情况经常会采用下面的方式. 2.使用存储过程 对于复杂的情况,一般会在存储过程中来拼接动态SQL.使用存储过程完成相对灵活,但编码复杂度过高,有时运行效率较低. 3

使用Oracle的DBMS_SQL包执行动态SQL语句

使用Oracle的DBMS_SQL包执行动态SQL语句 引用自:http://blog.csdn.net/ggjjzhzz/archive/2005/10/17/507880.aspx 引用自:http://www.cnblogs.com/simonhaninmelbourne/archive/2013/01/23/2872438.html 在某些场合下,存储过程或触发器里的SQL语句需要动态生成.Oracle的DBMS_SQL包可以用来执行动态SQL语句.本文通过一个简单的例子来展示如何利用D

MyBatis 构造动态 SQL 语句

以前看过一个本书叫<深入浅出 MFC >,台湾 C++ 大师写的一本书.在该书中写道这样一句话,"勿在浮沙筑高台",这句话写的的确对啊.编程很多语言虽然相同,但是真正做还是需要认真的学习,如果只是想着按想像着来,真的是会走很多弯路,浪费很多时间. 无法使用 not in 在项目中需要使用到 not in ,想着不是很复杂,但是这个问题困扰了我个把小时,很是郁闷.自己拼接好了字符串,字符串的内容是 not in 中的各个 id 值.通过 not in 来进行 update 的

Mybatis系列---动态SQL

问题: 什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Mybatis的动态SQL功能正是为了解决这种问题, 其通过 if, choose, when, otherwise, trim, where, set, foreach,可组合成非常灵活的SQL语句,从而提高开发人员的效率. 下述可知道这四个操作节点中的子节点都是差不多是一样的,insert和update中多了一个selectK

Mybatis的动态sql拼接语句

Mybatis的动态sql拼接语句 1.主配置文件SqlMapConfig.xml  <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE configuration         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"         "http://mybatis.org/dtd/mybatis-3-config.dtd

【MyBatis】动态SQL示例

[MyBatis]配置文件示例 [MyBatis]映射文件示例 DAO文件 EmployeeMapperDynamicSQL.java package com.atguigu.mybatis.dao; import java.util.List; import org.apache.ibatis.annotations.Param; import com.atguigu.mybatis.bean.Employee; public interface EmployeeMapperDynamicSQ

MyBatis的动态SQL详解

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力.如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号.动态 SQL 可以彻底处理这种痛苦. 通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种