EMPLOYEE表:
CREATE TABLE EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20)default NULL, last_name VARCHAR(20)default NULL, salary INT default NULL, PRIMARY KEY (id));
MySQL数据库中创建存储过程:
DELIMITER $$ DROP PROCEDURE IF EXISTS `testdb`.`getEmp` $$ CREATE PROCEDURE `testdb`.`getEmp`(IN empid INT)BEGIN SELECT * FROM EMPLOYEE WHERE ID = empid;END $$ DELIMITER;
此表有如下两条记录:
mysql>select*from EMPLOYEE; +----+| id | first_name | last_name | salary | +----+|1|Zara|Ali|5000||2|Roma|Ali|3000|
Employee POJO 类:
使用iBATIS的结果映射,需要修改Employee.java文件。因此,让我们保持它,因为它已经在前一章中使用过。
public class Employee{ privateint id; private String first_name; privateString last_name; privateint salary; /* Define constructors for the Employee class. */ publicEmployee(){} publicEmployee(String fname,String lname,int salary){ this.first_name = fname;this.last_name = lname;this.salary = salary; } /* Here are the required method definitions */ publicint getId(){return id;} publicvoid setId(int id){this.id = id;} publicString getFirstName(){return first_name;} publicvoid setFirstName(String fname){this.first_name = fname;} publicString getLastName(){return last_name;} publicvoid setlastName(String lname){this.last_name = lname;} publicint getSalary(){return salary;} publicvoid setSalary(int salary){this.salary = salary;} }/* End of Employee */
Employee.xml 文件:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlMap namespace="Employee"> parameterClass:可以采取一个值作为字符串,整型,浮点型,double或根据要求任何类的对象。 此例中,我们通过Employee对象作为参数而调用SqlMap类的insert方法。 如果数据库表使用IDENTITY,AUTO_INCREMENT或串行列或已定义的SEQUENCE/GENERATOR, 可使用<selectKey>元素在<insert>语句中使用或返回数据库生成的值,此处为使用序列作为插入数据的id值 <!-- Perform Insert Operation --> <insertid="insert"parameterClass="Employee"> INSERT INTO EMPLOYEE(first_name, last_name, salary) values (#first_name#, #last_name#, #salary#) <selectKeyresultClass="int"keyProperty="id"> select last_insert_id() as id </selectKey> </insert> <!-- Perform Delete Operation --> <deleteid="delete"parameterClass="int"> DELETE FROM EMPLOYEE WHERE id = #id# </delete> <!-- Perform Update Operation --> <updateid="update"parameterClass="Employee"> UPDATE EMPLOYEE SET first_name = #first_name# WHERE id = #id# </update> <!-- Perform Read Operation 查询结果用Employee类封装--> <selectid="getAll"resultClass="Employee"> SELECT * FROM EMPLOYEE </select> <!-- Using ResultMap 查询结果用ResultMap封装--> resultMap的元素是在iBATIS的最重要和最强大的元素。您可以通过使用iBATIS的结果映射减少高达90%的JDBC编码, 在某些情况下,可以让你做JDBC不支持的事情 <resultMapid="result"class="Employee"> <resultproperty="id"column="id"/> <resultproperty="first_name"column="first_name"/> <resultproperty="last_name"column="last_name"/> <resultproperty="salary"column="salary"/> </resultMap> <selectid="useResultMap"resultMap="result"> SELECT * FROM EMPLOYEE WHERE id=#id# </select> 使用存储过程查询: <!-- To call stored procedure. 调用数据库中创建的存储过程SQL语句--> <parameterMapid="getEmpInfoCall"class="map"> <parameterproperty="acctID"jdbcType="INT"javaType="java.lang.Integer"mode="IN"/> </parameterMap> <procedureid="getEmpInfo" parameterMap="getEmpInfoCall"resultClass="Employee"> { call getEmp( #acctID# ) } </procedure> 动态SQL查询: 动态查询是iBatis一个非常强大的功能。有时你已经改变WHERE子句条件的基础上你的参数对象的状态。 在这种情况下的iBATIS提供了一组可以映射语句中使用,以提高SQL语句的重用性和灵活性的动态SQL标签。 所有的逻辑是使用一些额外的标签放在:XML文件。下面是一个例子,其中的SELECT语句将努力在两个方面: 如果想传递一个ID,然后它会返回所有与该ID的记录,否则,将返回所有雇员ID为NULL的记录。 <selectid="findByID"resultClass="Employee"> SELECT * FROM EMPLOYEE <dynamicprepend="WHERE "> <isNullproperty="id">id IS NULL</isNull> <isNotNullproperty="id">id = #id#</isNotNull> </dynamic> </select> 可以使用<isNotEmpty>标签如下检查条件。在此条件下将增加,只有当通过属性不为空。 <select id="findByID" resultClass="Employee"> SELECT * FROM EMPLOYEE <dynamic prepend="WHERE "> <isNotEmpty property="id">id =#id#</isNotEmpty> </dynamic> </select> 如果想查询对id和/或雇员的名字选取。SELECT语句如下: <select id="findByID" resultClass="Employee"> SELECT * FROM EMPLOYEE <dynamic prepend="WHERE "> <isNotEmpty prepend="AND"property="id">id =#id#</isNotEmpty> <isNotEmpty prepend="OR"property="first_name">first_name =#first_name#</isNotEmpty> </dynamic> </select> iBATIS OGNL 表达式:iBATIS的提供了强大的基于OGNL的表达式来消除其他元素。
if 语句
choose, when, otherwise 语句
where 语句
foreach 语句
if 语句:最常见的事情在动态SQL是有条件地包括一个where子句的一部分。例如:
这条语句会提供功能的可选的文本搜索类型。如果没有传递title,那么所有激活的博客将被退回。但是,如果传递一个标题,它会寻找标题以like 给定的条件。
<selectid="findActiveBlogWithTitleLike"parameterType="Blog"resultType="Blog">
SELECT * FROM BLOG
WHERE state = 'ACTIVE.
<if test="title != null">AND title like #{title}</if>
<iftest="author != null">AND author like #{author}</if>
</select>
choose, when, otherwise 语句:iBATIS提供了一个选择的元素,它类似于Java的switch语句。这有助于选择很多种情况。
<selectid="findActiveBlogWithTitleLike"parameterType="Blog"resultType="Blog">
SELECT * FROM BLOG
WHERE state = 'ACTIVE.
<choose>
<when test="title != null">AND title like #{title}</when>
<whentest="author != null and author.name != null">AND author like #{author}</when>
<otherwise>AND featured = 1</otherwise>
</choose>
</select>
where 语句 :
where元素知道只有插入WHERE ,如果有一个由含标签返回的任何内容。此外,如果该内容开头AND或OR,它知道剥离其关闭
<selectid="findActiveBlogLike"parameterType="Blog"resultType="Blog">
SELECT * FROM BLOG
<where>
<iftest="state != null">state = #{state}</if>
<iftest="title != null">AND title like #{title}</if>
<iftest="author != null>AND author like #{author}</if>
</where>
</select>
foreach 语句:
foreach元素是非常强大的,并允许你指定一个集合,声明可以在元素的体内可用于项目和索引变量。
它也允许你指定打开和关闭的字符串,并添加一个分隔符放置在迭代之间。可以建立一个IN条件如下:
<selectid="selectPostIn"resultType="domain.blog.Post">
SELECT * FROM POST P
WHERE ID in
<foreachitem="item"index="index"collection="list"
open="("separator=","close=")"> #{item}
</foreach>
</select>
</sqlMap>
IbatisResultMap.java 文件:
文件将应用程序级别的逻辑,从使用结果映射Employee表中读取记录:
import com.ibatis.common.resources.Resources; import com.ibatis.sqlmap.client.SqlMapClient; import com.ibatis.sqlmap.client.SqlMapClientBuilder; import java.io.*; import java.sql.SQLException; import java.util.*; public class IbatisResultMap{ publicstaticvoid main(String[] args)throwsIOException,SQLException{ //调用工具类Resources加载Ibatis配置文件SqlMapConfig.xml(包含employee.xml文件) Reader rd =Resources.getResourceAsReader("SqlMapConfig.xml"); //调用Ibatis的接口获取SQL数据操作实例对象SqlMapClient SqlMapClient smc =SqlMapClientBuilder.buildSqlMapClient(rd); 增: Employee em =newEmployee("Zara","Ali",5000); smc.insert("Employee.insert", em); 删: int id =1; smc.delete("Employee.delete", id ); 改: Employee rec =newEmployee(); rec.setId(1); rec.setFirstName("Roma"); smc.update("Employee.update", rec ); 查: List<Employee> ems =(List<Employee>)smc.queryForList("Employee.getAll",null); int id =1; Employee e =(Employee)smc.queryForObject("Employee.useResultMap", id); //调用存储过程查询 Employee e =(Employee)smc.queryForObject("Employee.getEmpInfo", id); //动态查询 Employee rec =newEmployee(); rec.setId(1);List<Employee> ems =(List<Employee>)smc.queryForList("Employee.findByID", rec); } }
动态的对条件语句的拼接:
<!-- 动态条件查询语句组合开始 --> <sql id="sql_delete"> delete </sql> <sql id="sql_count"> select count(*) </sql> <sql id="sql_select"> select * </sql> <sql id="sql_where"> from DeviceInfo <dynamic prepend="where"> <!-- 不为空就执行 如果传过来的参数中不带有id这个参数那么将不会执行此条,会往下执行--> <isNotEmpty prepend="and" property="id"> id = #id# </isNotEmpty> <isNotEmpty prepend="and" property="deviceId"> deviceId = #deviceId# </isNotEmpty> <isNotEmpty prepend="and" property="displayModeId"> displayModeId = #displayModeId# </isNotEmpty> <isNotEmpty prepend="and" property="statuId"> statuId = #statuId# </isNotEmpty> <isNotEmpty prepend="and" property="manageId"> manageId = #manageId# </isNotEmpty> <isNotEmpty prepend="and" property="projectId"> projectId = #projectId# </isNotEmpty> <isNotEmpty prepend="and" property="creater"> creater = #creater# </isNotEmpty> <isNotEmpty prepend="and" property="createTime"> createTime = #createTime# </isNotEmpty> <isNotEmpty prepend="and" property="updater"> updater = #updater# </isNotEmpty> <isNotEmpty prepend="and" property="updateTime"> updateTime = #updateTime# </isNotEmpty> </dynamic> </sql> <!-- end --> <select id="selectDeviceByWhere" resultClass="DeviceInfo" parameterClass="Map"> <!-- 拼接SQL语句 最后组合SQL语句--> <include refid="sql_select"/> <include refid="sql_where"/> </select> <delete id="deleteByWhere" parameterClass="Map"> <include refid="sql_delete"/> <include refid="sql_where"/> </delete>
上面的代码中如果parameterClass传递过来的Map参数中,没有某一项条件所需要的参数那么久会生成不同的SQL语句。
如:
public void deleteById(int id) { if (id != 0) { map.put("id", id); getSqlMapClientTemplate().delete("deleteByWhere", map); } else { System.out.println("delete error"); } }
其他属性:
1、二元条件元素的属性:
prepend - 可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选)
property - 被比较的属性(必选)
compareProperty - 另一个用于和前者比较的属性(必选或选择 compareValue)
compareValue - 用于比较的值(必选或选择 compareProperty)
<isEqual> 比较属性值和静态值或另一个属性值是否相等。
<isNotEqual> 比较属性值和静态值或另一个属性值是否不相等。
<isGreaterThan> 比较属性值是否大于静态值或另一个属性值。
<isGreaterEqual> 比较属性值是否大于等于静态值或另一个属性值。
<isLessThan> 比较属性值是否小于静态值或另一个属性值。
<isLessEqual> 比较属性值是否小于等于静态值或另一个属性值。
2、一元条件元素的属性:
prepend - 可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选)
property - 被比较的属性(必选)
<isPropertyAvailable> 检查是否存在该属性(存在 parameter bean 的属性) 。
<isNotPropertyAvailable> 检查是否不存在该属性(不存在 parameter bean 的属性) 。
<isNull> 检查属性是否为 null。
<isNotNull> 检查属性是否不为 null。
<isEmpty> 检查 Collection.size()的值,属性的 String 或 String.valueOf()值,
是否为 null或空( “”或size() < 1) 。
<isNotEmpty> 检查 Collection.size()的值,属性的 String 或 String.valueOf()值,
是否不为 null 或不为空( “”或 size() > 0)。
3、Iterate:这属性遍历整个集合,并为 List 集合中的元素重复元素体的内容。
Iterate 的属性:
prepend - 可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选)
property - 类型为 java.util.List 的用于遍历的元素(必选)
open - 整个遍历内容体开始的字符串,用于定义括号(可选)
close -整个遍历内容体结束的字符串,用于定义括号(可选)
conjunction - 每次遍历内容之间的字符串,用于定义 AND 或 OR(可选)
<iterate> 遍历类型为 java.util.List的元素。
根据参数值的比较拼接SQL:
<isEqual prepend="and" property="delType" compareValue="1"> ID=#id# </isEqual> <isEqual prepend="and" property="delType" compareValue="2"> NAME=#name# </isEqual> <isEqual prepend="and" property="delType" compareValue="3"> TYPE=#type# </isEqual>
相关推荐
9. **实例操作**:通过具体的Java代码示例,展示如何使用MyBatis进行增删改查操作。 10. **最佳实践**:提供一些使用MyBatis的最佳实践,例如使用注解替代XML配置,以及优化SQL性能的建议。 总之,"ibatis-sqlMap-...
在本文中,我们将深入探讨如何使用Ibatis实现基本的增删改查操作,这对于初学者来说是非常重要的基础知识。 ### 1. Ibatis 框架简介 Ibatis 最初由Clinton Begin 创建,后来成为Apache软件基金会的一个项目。它的...
在本示例中,"ibatis实现增删改查功能demo"是一个具体的项目,旨在演示如何利用Ibatis进行数据库操作,包括插入(Insert)、删除(Delete)、更新(Update)和查询(Select)数据。以下将详细解析这个项目的重点内容...
在这个"ibatis的增删改查"主题中,我们将深入探讨如何在不依赖MVC框架的情况下,利用Ibatis进行数据操作。 1. **Ibatis安装与配置** 首先,你需要将Ibatis的jar包添加到项目的类路径中,或者通过Maven或Gradle等...
在本教程中,我们将深入...在“增删改查(二)”这个主题中,我们将继续学习如何利用Ibatis高效地完成日常的数据库任务。通过实践和理解这些基本操作,你可以更好地掌握Ibatis,并将其应用于实际项目中,提升开发效率。
Ibatis和Spring整合例子,实现增删改查功能.
Struts的Action类会接收前端请求,调用Spring管理的Service层接口处理业务逻辑,Service层再通过iBATIS的SqlMapClient执行SQL操作来完成对`VehicleExpense`表的增删改查。 在实际开发中,我们通常会有以下步骤: 1...
在"jsf+ibatis增删改查"项目中,JSF被用来创建用户界面,而iBatis则作为数据访问层,负责与数据库的交互。以下是实现这一功能的关键步骤: 1. **配置iBatis**:首先,需要在项目中引入iBatis的库文件,并配置`...
在本实例中,"ibatis2.3.4.726增删改查源码实例" 提供了一个完整的基于Ibatis 2.3.4.726版本的开发案例,涵盖了数据库的基本操作,即增(INSERT)、删(DELETE)、改(UPDATE)和查(SELECT)。 首先,我们来了解...
这个简单的IBatis增删改查操作例子,通过将SQL语句与Java代码分离,使得代码更加清晰,易于维护。在实际项目中,还可以结合Spring框架,实现更高级的事务管理、自动注入等功能,提升开发效率。通过深入学习和实践,...
总之,这个项目提供了一个学习和实践Java Web开发的良好平台,通过Struts1、Spring和iBatis的组合,展示了如何构建一个完整的用户管理应用,包括登录、注册以及对数据的增删改查操作。这样的实践经验有助于开发者...
本文将详细介绍Ibatis如何实现简单的增删改查操作,并结合提供的源码进行深入理解。 首先,Ibatis的核心是SQL映射文件和SqlSessionFactory。SQL映射文件是XML格式的,其中包含了SQL语句及其参数映射,是Ibatis执行...
此外,insert、update和delete元素分别对应增、删、改操作。 在iBATIS中,SQL语句可以动态化,通过使用、、、等标签实现条件判断,极大地增强了SQL的灵活性。例如,你可以根据传入的参数动态决定是否添加某个WHERE...
这个项目旨在提供一个完整的开发环境,其中包括了iBATIS与SQL Server 2000的集成,以便进行数据的增删改查(CRUD)操作,并且特别针对SQL Server 2000中处理动态变量的限制提供了解决方案。 iBATIS是Java领域中广泛...
本篇文章将深入探讨如何使用Ibatis框架实现对`student`表的增删改查操作,包括模糊查询以及利用序列自动生成主键。 首先,我们来理解Ibatis的基本概念。Ibatis是由Apache基金会维护的一个开源项目,它是一个SQL映射...
"ibatis-struts2简单增删改查"是一个关于如何结合这两个流行框架实现基本数据库操作的示例。Ibatis和Struts2都是Java Web开发中的重要组件,Ibatis作为持久层框架,负责与数据库交互,而Struts2则是一个强大的MVC...
总结,Ibatis以其简单易用、灵活高效的特性在Java开发中占据重要地位,其增删改查功能的实现让开发者能更加专注于业务逻辑,而不是繁琐的JDBC操作。对于初学者来说,深入理解Ibatis的CRUD操作及其相关配置,对提升...
在增删改查功能中,iBatis通过Mapper接口与XML配置文件配合,实现了数据的CRUD操作。开发者只需要定义接口方法,iBatis会自动生成SQL并执行,返回结果集。 这个项目的文件结构通常会包含以下几个部分: 1. **src/...
在本教程中,我们将深入探讨Ibatis 3.0框架中的增、删、改、查操作,这是关于Ibatis 3.0系列教程的第三部分。...通过学习这一部分,你应能熟练掌握在Ibatis中进行数据的增删改查操作,并理解其背后的原理和用法。
SqlMap是iBATIS的核心组件,它是一个XML配置文件,用于定义数据库操作(如增删改查)与Java对象之间的映射关系。SqlMap通过动态SQL生成合适的SQL语句,并将结果映射到Java对象,避免了手动编写大量的DAO(Data ...