1 namespace 命名空间
为了测试命名空间 在创建表 u1(id name email) u2(id name email)
分别创建 实体Bean和映射文件
User.java
package com.bean;
public class User {
private Integer id;
private String name;
private String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
User.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="user">
<typeAlias alias="userVO" type="com.bean.User"/>
<insert id="createUser" parameterClass="userVO">
insert into u1(name,email)
values(#name#,#email#)
</insert>
</sqlMap>
User2.java
package com.bean;
public class User2 {
private Integer id;
private String name;
private String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
User2.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="user2">
<typeAlias alias="user2VO" type="com.bean.User2"/>
<insert id="createUser" parameterClass="user2VO">
insert into u2(name,email)
values(#name#,#email#)
</insert>
</sqlMap>
ibatis 配置文件
SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="false"
/>
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver"
value="com.mysql.jdbc.Driver" />
<property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/ibatis_db?characterEncoding=UTF-8" />
<property name="JDBC.Username" value="root" />
<property name="JDBC.Password" value="" />
</dataSource>
</transactionManager>
<sqlMap resource="com/bean/User.xml" />
<sqlMap resource="com/bean/User2.xml"/>
</sqlMapConfig>
测试方法
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
User u =new User();
u.setName("aa");
u.setEmail("[email protected]");
sqlMap.insert("createUser", u);
如果此时执行 会报异常 原因很明显
There is already a statement named createUser in this SqlMap.
就是因为在加载的实体映射文件中 都含有 id = "createUser"
这里去掉已经 <sqlMap resource="com/bean/User2.xml"/>就可以
这也就是为什么我们要引入namespace的原因
我们的映射文件中已经设置了namespace
<sqlMap namespace="user">
实际ibatis的默认是不开启的namespace的
此时我们将 配置文件中的useStatementNamespaces="false" 改为true
我们在测试一下,不过此时的调用方式 需要 namespace.id_name
sqlMap.insert("user.createUser", u);
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
User u =new User();
u.setName("aa");
u.setEmail("[email protected]");
sqlMap.insert("user.createUser", u);
这里需要注意 typeAlias 标签不受命名空间影响 只对应当前的实体映射页
2 parameterMap传入参数映射
之前我们已经用到过rseultMap映射,现在我们来看一下 parameterMap
我们修改User.xml
<parameterMap class="userVO" id="userVOpmp">
<!--
这里可以对java的类进行映射 也可以映射jdbcType
如果jdbcType 要注意是Date(只保存日期) 区别 TimeSTAMP(日期+时间)
-->
<parameter property="name" jdbcType="varchar"/>
<parameter property="email" jdbcType="varchar"/>
</parameterMap>
<insert id="createUser" parameterMap="userVOpmp">
insert into u1(name,email)
values(?,?)
</insert>
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
User u =new User();
u.setName("www.0431.la");
u.setEmail("[email protected]");
sqlMap.insert("user.createUser",u);
需要注意
类型必须一致 保证语句的参数顺序正确
3 Like 模糊查询
这个比价简单 和正常查询几乎没有什么变化 主不过标识符由#换成$
<select id="selectLikeName" parameterClass="java.lang.String" resultClass="userVO">
select * from u1 where name like '%$value$%'
</select>
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
List list = sqlMap.queryForList("user.selectLikeName", "a");
System.out.println(list.size());
4 批量及事物处理
这里的设置不需要更改xml
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
//开启事物
sqlMap.startTransaction();
//开启批次操作
sqlMap.startBatch();
User user = new User();
user.setName("aaaaa");
User2 user2 = new User2();
user2.setName("bbbbb");
sqlMap.insert("user.createUser",user);
sqlMap.insert("user2.createUser",user2);
//执行批次操作
sqlMap.executeBatch();
//提交事物
sqlMap.commitTransaction();