通过第一个示例的练习,我们对ibatis这个持久层的框架已经有了初步的了解。其主要工作是在实体对象的CRUD的xml映射配置文件中(User.xml),那么接着我们就来看看它的映射配置文件中的一些标签的使用及含义(基于第一个示例基础上的)
1、如何获得刚插入记录的自增长ID值?
insert语句默认插入一条记录的返回值为object类型的,我们可以使用selectKey来设置它的返回值的内容,select @@identity as ID这是查询自动生成的主键ID的值。
在User.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap SYSTEM "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap>
<typeAlias alias="User" type="com.lzh.ibatis.User"/>
<insert id="insertUser" parameterClass="User">
insert into t_user values(
null,#username#,#password#
)
<selectKey resultClass="int" keyProperty="id">
select @@identity as ID
</selectKey>
</insert>
</sqlMap>
测试代码:
User user = new User();
user.setUsername("张三");
user.setPassword("张三密码");
//如果主键是自动生成的,则其返回值可以通过<selectKey>标签来设置
//如果不通过<selectKey>标签来设置,则返回值为空!
//<selectKey >中的keyProperty,是指定User中的id属性,当调用结束之后,
//user对象的id值和insert方法的返回值obj都是这条记录的ID值!
Object obj = sqlMapper.insert("insertUser", user);
System.out.println(obj);
System.out.println(user.getId());
2、parameterClass的使用(限制参数类型)
insertUser使用了parameterClass参数,则在调用insertUser时,必需传入User类型的对象,如果没有使用parameterClass,则可以传入任意具有相应属性值的对象,只要其他类型的对象中包含所要添加的相应属性就好,否则会报没有相应属性的错误。
增加以个含有相应属性的其他实体类:
public class JustAnObject {
private int id;
private String username;
private String password;
private String otherProperty;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getOtherProperty() {
return otherProperty;
}
public void setOtherProperty(String otherProperty) {
this.otherProperty = otherProperty;
}
}
User.xml配置文件:
<insert id="insertUser" parameterClass="User">
insert into t_user values (
null,#username#,#password#
)
<selectKey resultClass="int" keyProperty="id">
SELECT @@IDENTITY AS ID
</selectKey>
</insert>
<insert id="insertUser2">
insert into t_user values (
null,#username#,#password#
)
<selectKey resultClass="int" keyProperty="id">
SELECT @@IDENTITY AS ID
</selectKey>
</insert>
insertUser使用了parameterClass,所以必需传入User类型的对象
User user = new User();
user.setUsername("张三");
user.setPassword("张三密码");
//传递进去的对象,必须是User类型
Object obj = sqlMapper.insert("insertUser", user);
insertUser2没有使用parameterClass,所以可以传入任意具有相应属性值的对象
JustAnObject anobj = new JustAnObject();
anobj.setUsername("用户名");
anobj.setPassword("用户密码");
//如果没有指定parameterClass属性,则任何一个具有相应属性值
//的对象都可以被传递进去
Object obj = sqlMapper.insert("insertUser2", anobj);
3、parameterMap的使用
parameterMap用于传入参数,以便匹配SQL语句中的?号。
User.xml文件:
<parameterMap class="User" id="insertUser-param">
<parameter property="username"/>
<parameter property="password"/>
</parameterMap>
<insert id="insertUser" parameterMap="insertUser-param">
insert into t_user values (
null,?,?
)
<selectKey resultClass="int" keyProperty="id">
SELECT @@IDENTITY AS ID
</selectKey>
</insert>
利用parameterMap,可以定义参数对象的属性如何映射到SQL查询语句的动态参数上,注
意parameterMap中<parameter/>标签的先后顺序不能颠倒!
测试代码:
User user = new User();
user.setUsername("张三dd");
user.setPassword("张三密码dd");
Object obj = sqlMapper.insert("insertUser", user);
4.1、如何将查询结果映射到不同的对象?(resultClass的使用)
增加一个接收结果的实体类:
public class OtherObject {
private int id;
private String pro1;
private String pro2;
private String pro3;
private boolean flag;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPro1() {
return pro1;
}
public void setPro1(String pro1) {
this.pro1 = pro1;
}
public String getPro2() {
return pro2;
}
public void setPro2(String pro2) {
this.pro2 = pro2;
}
public String getPro3() {
return pro3;
}
public void setPro3(String pro3) {
this.pro3 = pro3;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
User.xml文件:查找t_user表,将其结果映射到一个属性名不同的对象中!
<select id="selectUserForOtherObject" resultClass="com.ibatis.OtherObject" parameterClass="int">
select
username as prop1,
password as prop2
from t_user where id=#value#
</select>
测试代码:
//查找t_user表,将其结果映射到一个属性名不同的对象中!
OtherObject obj = (OtherObject)sqlMapper.queryForObject("selectUserForOtherObject", 1);
System.out.println(obj.getProp1()+","+obj.getProp2());
4.2、如何将查询结果集映射到不同的对象?(resultMap的基本使用)
User.xml文件:
<resultMap class="com.ibatis.OtherObject" id="ooResult">
<result property="prop1" column="username"/>
<result property="prop2" column="password"/>
</resultMap>
<!--
如果使用resultMap来定义如何映射,则如下语句不可写成:
select username as prop1,password as prop2 ....
-->
<select id="selectUserForOtherObject2" parameterClass="int" resultMap="ooResult">
select
username,
password
from t_user where id=#value#//参数值当为一个时,可以任意指定
</select>
//查找t_user表,将其结果映射到一个属性名不同的对象中!
OtherObject obj = (OtherObject)sqlMapper.queryForObject("selectUserForOtherObject2", 17);
System.out.println(obj.getProp1()+","+obj.getProp2());
6.1、如何将查询结果集映射为xml格式的数据?
User.xml文件:
<select id="selectXmlData" resultClass="xml" xmlResultName="User" parameterClass="int">
select * from t_user where id=#value#
</select>
<select id="selectXmlDatas" resultClass="xml" xmlResultName="User">
select * from t_user
</select>
写入xml的方式是采用dom4j
//查找t_user表,将其结果映射到xml!
//返回值obj是xml形式的字符串
Object obj = sqlMapper.queryForObject("selectXmlData", 22);
//dom4j里面的,设置输出格式及编码
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK");
//创建一个具有上面一定格式的XMLWriter对象
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
//将一个xml字符串解转换成一个Document对象
Document document = DocumentHelper.parseText(obj.toString());
//将该document对象写到xml文件中
writer.write(document);
writer.close();
//查找t_user表,将其结果集合映射为xml格式输出!
List list = (List)sqlMapper.queryForList("selectXmlDatas");
System.out.println(list);
6.2、如何将xml格式的数据映射到数据表中?
xm配置文件:
<insert id="insertXmlData" parameterClass="xml" >
insert into t_user values(null,#username#,#password#)
</insert>
同样利用dom4j读取xml文件(必须插入数据表的一条记录)
//dom4j里面的SAXReader对象
SAXReader saxReader = new SAXReader();
//读取xml中数据
Document document = saxReader.read(new File("input.xml"));
//将数据转换成string
String docXmlText=document.asXML();
//将string插入到数据表
sqlMapper.insert("insertXmlData", docXmlText);
7.1、如何用Map类型的对象作为传入参数?
<!--
这里,可以使用全路径类名,如:
java.util.Map
java.util.HashMap
java.util.TreeMap
或
map
-->
<insert id="insertUser" parameterClass="map">
insert into t_user values (
null,#username#,#password#//必须与map中key相对应
)
</insert>
测试代码:
Map user = new TreeMap();
user.put("username", "Map用户");
user.put("password", "Map用户密码");
sqlMapper.insert("insertUser",user);
7.2、如何将查询结果集的元素转换为Map类型的对象?
xml配置文件:
<!--
resultClass可以定义为java.util.HashMap类型,
将能自动转换
-->
<select id="selectMapUsers" resultClass="java.util.HashMap">
select * from t_user
</select>
测试代码:
List list = (List)sqlMapper.queryForList("selectMapUsers");
System.out.println(list);
for (Iterator iter = list.iterator(); iter.hasNext();) {
Map map = (Map) iter.next();
//可在此输出map的数据
}
注意:这里写的SQL语句一定要注意参数的位置,必须插入数据表中的字段顺序保持一致,否则插入到数据表中的数据错位不准确,map映射是将表的一条记录的字段名作为key,字段值做map的值,查询时,结果是一个map类型的数组。
8、事务处理
可以使用sqlMapClient的startTransaction/commitTransaction/endTransaction等方法来控制事务的边界。
如果与spring整合(这是iBatis推荐的方式),则我们需要在spring配置文件中指定其事务特性。