本文系
iBatis开发详解系列文章之iBatis操作DDL和映射继承。
DDL作为SQL的一个子集,是专门用于数据定义的语言,也就是我们所说的对数据库表/模式的操作。最为常见的就是修改表的结构,比如添加字段,修改字段类型,为字段改名等。那么我们来看看如何使用iBatis来进行DDL操作。
前面介绍的iBatis操作数据库都属于DML范畴,比如select,update,delete等。那么操作DDL我们使用的是statement标签,我们来看看对我们之前示例的订单项表来进行修改:
<statement id="addColumn">
alter table orderitem add column type VARCHAR(50);
</statement>
下面编写程序来调用这个语句:
package ibatis;
import java.io.IOException;
import java.io.Reader;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class DDLDemo {
private static String config = "ibatis/SqlMapConfig.xml";
private static Reader reader;
private static SqlMapClient sqlMap;
static {
try {
reader = Resources.getResourceAsReader(config);
} catch (IOException e) {
e.printStackTrace();
}
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
}
public static void main(String[] args) throws Exception {
sqlMap.update("OrderItem.addColumn", null);
}
}
我们使用SqlMapClient的update方法来调用statement语句,那么执行完后,我们可以看到数据表被修改了。可能不同的数据库并不支持这种方式的修改,但用MySQL 5.5来测试是成功的,我们得到了如下的数据库表结构:
现在,我们为为type设置值,个人订单为indi,团体订单为group,然后我们来介绍iBatis的映射继承特性。
继承是面向对象的编程中的最基本的概念,我们这里不对继承的概念做过多的介绍,只是来看看在iBatis中对映射继承的做法。
iBatis的resultMap可以使用<discriminator>标签来支持继承体系。使用鉴别器标签可以根据数据库中某字段的值来确定要实例化类的类型。那么我们来看一下oderitem关于映射继承的示例,首先我们修改orderItem模型类,添加type属性:
package ibatis.model;
public class OrderItem implements java.io.Serializable {
private Integer orderItemId;
private String itemName;
private int quantity;
private float price;
private String type;
private Integer orderId;
public OrderItem() {
}
public OrderItem(Integer orderItemId, String itemName, int quantity,
float price, String type, Integer orderId) {
super();
this.orderItemId = orderItemId;
this.itemName = itemName;
this.quantity = quantity;
this.price = price;
this.orderId = orderId;
}
//getters and setters
public String toString() {
return "OrderItem [itemName=" + itemName + ", orderId=" + orderId
+ ", orderItemId=" + orderItemId + ", price=" + price
+ ", quantity=" + quantity + ", type=" + type + "]";
}
}
那么resultMap的映射文件我们可以写为:
<resultMap class="ibatis.model.OrderItem" id="orderItem">
<result property="orderItemId" column="orderItemId" />
<result property="orderId" column="orderId" />
<result property="itemName" column="itemName" />
<result property="quantity" column="quantity" />
<result property="price" column="price" />
<result property="type" column="type" />
<discriminator column="type" javaType="java.lang.String">
<subMap resultMap="Individual" value="individual" />
<subMap resultMap="Group" value="group" />
</discriminator>
</resultMap>
<resultMap class="ibatis.model.Individual" id="Individual"
extends="orderItem">
<result property="username" column="username" />
</resultMap>
<resultMap class="ibatis.model.Group" id="Group" extends="orderItem">
<result property="company" column="company" />
</resultMap>
很容易理解discriminator为我们选择type的类型,并查找子映射,这里我们在orderitem表中添加两个字段,username表示individual的订单的用户名,company表示group的订单的公司名称,就很好理解了。
来看一下这里我们定义的两个类Individual和Group:
package ibatis.model;
public class Individual extends OrderItem {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return super.toString() + "Individual [username=" + username + "]";
}
}
我们可以这么来理解,个体订单是订单的一个子类,其中我们要标识下该订单的用户名称,那么我们就在这个类中定义一个username属性,给出getter和setter方法,加上toString()方法,便于我们后续测试来打印其内容。同理,我们可以得到Group类:
package ibatis.model;
public class Group extends OrderItem {
private String company;
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@Override
public String toString() {
return super.toString() + "Group [company=" + company + "]";
}
}
其道理和Individual类相同,这里不再解释了。下面编写一个查询语句:
<select id="getOrderItemById" resultMap="orderItem">
select * from orderitem where orderitemId=1
</select>
为了测试,我们将SQL直接给定,那么后面就需要编写测试代码了,也很简单,我们来看一下:
package ibatis;
import java.io.IOException;
import java.io.Reader;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class DiscriminatorDemo {
private static String config = "ibatis/SqlMapConfig.xml";
private static Reader reader;
private static SqlMapClient sqlMap;
static {
try {
reader = Resources.getResourceAsReader(config);
} catch (IOException e) {
e.printStackTrace();
}
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
}
public static void main(String[] args) throws Exception {
Object obj = sqlMap.queryForObject("OrderItem.getOrderItemById");
System.out.println(obj.getClass().getName());
System.out.println(obj);
}
}
在主函数内,我们通过sqlMapClient获取到这条查询语句,不需要任何参数,它的返回值我们先定义成Object类型,方便后续操作,之后我们打印出该Object类的名称,看看到底是哪种类型,最后打印出这个对象所包含的内容,执行语句,我们得到如下结果:
ibatis.model.Individual
OrderItem [itemName=Moto MB525, orderId=1, orderItemId=1, price=1000.0, quantity=1, type=individual]Individual [username=Sarin]
可以看到orderitemId为1时,这是一个个人订单,最终的Object为Individual类型,我们可以打印出OrderItem和子类Individual的信息,那么下单人也会打印出来。同理,我们查询一个团体订单,可以得到如下结果:
ibatis.model.Group
OrderItem [itemName=Lenovo X201, orderId=2, orderItemId=3, price=5000.0, quantity=1, type=group]Group [company=soft]
这也是我们期望的结果。请记住iBatis仅仅是一个SQL Mapping框架,而不是ORM框架,iBatis本身不知道也不关心我们类的关系和数据表之间的映射关系。那么你可以随意使用鉴别器,只要合适业务,即可使用。
- 大小: 60.5 KB
分享到:
相关推荐
在Java Web开发中,iBATIS(现在被称为MyBatis)是一个流行的持久层框架,它提供了灵活的SQL映射机制,使得开发者可以更方便地操作数据库。本篇将深入讲解iBATIS一对一映射的概念、配置及应用,帮助你更好地理解和...
此文本主要是关于ibatis总配置和映射配置和一些需要主要的细节。
在IT行业中,数据库映射和对象关系映射(ORM)框架是开发人员处理数据库操作的重要工具。其中,iBATIS(现在称为MyBatis)是一个流行的选择,它允许程序员将SQL查询直接集成到Java代码中,提高了灵活性和性能。本篇...
另外,数据库管理工具如MySQL Workbench或SQL Developer可以帮助你直观地查看和操作数据库结构,以便更好地理解和调整映射。 总结,iBATIS的一对多和多对多关系映射是通过XML映射文件和自定义SQL查询实现的。理解...
这篇博客可能深入探讨了iBATIS如何实现从数据库结果集到Java对象的映射,以及如何处理一对多、多对一和多对多的关系。 在数据库设计中,关系映射是至关重要的,因为它允许我们将复杂的数据库结构转换为易于管理和...
### ibatis配置文件、映射文件详解 #### 1. SQL Map Config 文件详解 在ibatis框架中,`sqlMapConfig.xml`是一个非常重要的配置文件,它主要用于设置ibatis的全局配置信息,包括数据库连接信息、环境配置以及其它...
在IT行业中,数据库关系映射是数据访问层...同时,它也能帮助开发者将关注点从底层数据库操作转移到业务逻辑上,使代码更加简洁、易于理解和维护。因此,对于任何使用Ibatis的项目,掌握一对多关系映射都是非常关键的。
7. **Test_ibatis**:这个文件可能是一个测试用例,用于验证iBatis配置和映射是否正确,以及数据库操作是否按预期工作。在实际项目中,通常会编写JUnit或TestNG测试来确保ORM映射的正确性。 通过使用iBatis,开发者...
iBATIS-SqlMaps是Java开发中的一个持久层框架,它...通过理解和熟练运用SqlMapConfig.xml和SqlMap.xml文件,开发者可以高效地实现数据的CRUD操作,同时还能享受到iBATIS提供的高级特性,如动态SQL和复杂的数据映射。
映射文件(如`userMap.xml`)是iBATIS的核心,它包含SQL语句、结果映射和参数映射等信息。映射文件通常有以下元素: - `<select>`:定义查询语句,可以包含参数和结果集映射。 - `<insert>`:用于插入记录,可以...
iBatis并不鼓励直接复制SQL字符串到数据库管理系统(DBMS)进行执行,因为这样会丧失iBatis的一些核心优势,如参数绑定、动态SQL和结果映射等。在iBatis中,我们通常通过XML配置文件或者注解来定义SQL语句,并使用...
标题和描述中提到的“ibatis映射文件信息,接口对应”是指Ibatis如何通过映射文件与Java接口进行关联,实现数据操作的封装和调用。 首先,我们需要了解Ibatis的核心组成部分:SqlMapConfig.xml配置文件、Mapper接口...
这些文件包含了具体的 SQL 查询、更新、插入和删除操作,以及结果集的映射配置。 3. **Java API**:iBATIS 提供了丰富的 Java 接口,如 `SqlMapClient` 和 `SqlMapSession`,它们是与数据库交互的主要接口。开发者...
### ibatis 使用 HashMap 解决 resultClass 映射 在日常的软件开发过程中,尤其是在处理数据库查询时,我们经常面临一个问题:如何优雅地处理那些未知或动态变化的列名及列数的情况?在这种情况下,传统的实体类...
【标题】:深入理解iBATIS的查询机制 【描述】:本文将详细解析iBATIS...无论是处理简单的查询还是复杂的对象关系,iBATIS都提供了足够的工具和灵活性,让开发者能够在保持代码整洁的同时,有效地管理和操作数据库。
`<select>`、`<insert>`、`<update>`和`<delete>`标签用于执行数据库操作,而`<parameterMap>`和`<resultMap>`则用来定义输入参数和返回结果的映射。 在实际应用中,我们还需要创建对应的Java模型类,这些类的属性...
总结来说,这个话题覆盖了Mybatis/iBatis中的多表映射,通过XML配置文件处理一对一和一对多关系,以及如何在ExtJS前端通过Model和Grid获取并展示这些数据。了解这些知识对于开发涉及多表交互的应用至关重要,能够...
NULL 博文链接:https://rickysun.iteye.com/blog/993470