有的时候为了适应多人开发,我们可能会把配置文件放在文件夹里。这样管理起来就方便了,这一点在开发中是共同的。下面就顺便来弄一下这个。这次就把ibatis的配置文件放在名称为“mymap”的文件夹里,pojo的配置文件就把他放在“mapping”文件夹(包)里。这次的配置文件我加了注释,如下所示
<?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>
<!--
1. cacheModelsEnabled 是否启动sqlMapClient上的缓存机制;
2. enhancementEnabled是否针对POJO启用字节码增强机制以提升getter/setter的调用效能,
避免使用Java Reflect所带来的性能开销,同时也为Lazy Loading带来了极大的性能提升;
3. errorTracingEnabled 是否启用错误日志;在开发期间建议设为“true”以方便调试
4. lazyLoadingEnabled 是否启动延迟加载机制
5. maxRequests 最大并发请求数(Statement并发数)
5. maxTransactions 最大并发事务
6. maxSessions 最大Session数,即当前最大允许的并发sqlMapClient数(介于maxRequests和maxTransactions之间)
7. useStatementNamespaces 是否使用Statement命名空间(为true时,需要追加命名空间)
-->
<settings cacheModelsEnabled="true" enhancementEnabled="true"
lazyLoadingEnabled="true" maxRequests="32" maxSessions="10"
maxTransactions="5" useStatementNamespaces="false" />
<!--
transactionManager 节点定义了ibatis的事务管理器
1. JDBC:通过传统JDBC Connection.commit/rollback实现事务支持
2. JTA:使用容器提供的JTA服务实现全局事务管理
3. EXTERNAL:外部事务管理,如EJB中使用ibatis,通过EJB的部署配置即可实现自动事务管理机制
此时ibatis将所有事务委托给外部容器管理
-->
<transactionManager type="JDBC">
<!--
dataSource从属于transactionManager节点,用于设定ibatis运行期使用的DataSource属性
type属性: dataSource节点的type属性指定了dataSource的实现类型
1. SIMPLE:
SIMPLE是ibatis内置的dataSource实现,其中实现了一个简单的数据库连接池机制, 对应ibatis 实现类为
com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory。
2. DBCP:
基于Apache DBCP连接池组件实现的DataSource 封装,当无容器提供DataSource 服务时,
建议使用该选项,对应ibatis 实现类为com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory。
3. JNDI:
使用J2EE 容器提供的DataSource 实现,DataSource 将通过指定的JNDI Name 从容器中获取。
对应ibatis 实现类为com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory。
-->
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="org.gjt.mm.mysql.Driver" />
<property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/mldn" />
<property name="JDBC.Username" value="root" />
<property name="JDBC.Password" value="123456" />
</dataSource>
</transactionManager>
<sqlMap resource="mapping/Account.xml" />
</sqlMapConfig>
那些什么vo类就不写了,还是上次的那个。下面来写一下pojo的配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="Account">
<select id="getAccount" parameterClass="java.lang.String"
resultClass="org.lxh.vo.Account"> select * from Account
</select>
<insert id="createAccount" parameterClass="org.lxh.vo.Account">
insert into Account(username, password) values ( #username#, #password# )
</insert>
<delete id="deleteAccount" parameterClass="java.lang.Integer">
delete from Account where id=#id#
</delete>
<update id="updateAccount" parameterClass="org.lxh.vo.Account">
update Account set username=#username#,password=#password# where id=#id#
</update>
</sqlMap>
这次我把一部分代码做了封装,这样可以减少一些代码。
package org.lxh.util;
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 final class GetSqlMap {
public static SqlMapClient getMap(String path){
SqlMapClient sqlMap = null;
Reader reader=null;
try {
reader = Resources.getResourceAsReader (path);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (IOException e) {
e.printStackTrace();
}
return sqlMap;
}
}
之后就是Junit了,这个用起来方便
package test;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.junit.BeforeClass;
import org.lxh.util.GetSqlMap;
import org.lxh.vo.Account;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class Test{
@org.junit.Test public void insert(){
try {
Account account = new Account();
account.setUsername("micheal");
account.setPassword("1234");
GetSqlMap.getMap("mymap/sqlmap.xml").insert("createAccount", account);
}catch(Exception e){
e.printStackTrace();
}
}
@org.junit.Test public void delete(){
try {
SqlMapClient sqlMap = null;
Reader reader = Resources.getResourceAsReader ("mymap/sqlmap.xml");
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
sqlMap.delete("deleteAccount", 3);
}catch(Exception e){
e.printStackTrace();
}
}
@org.junit.Test public void query() {
try {
ArrayList all=(ArrayList) GetSqlMap.getMap("mymap/sqlmap.xml").queryForList("getAccount");
Iterator it=all.iterator();
while(it.hasNext()){
Account account=(Account)it.next();
System.out.println(account.getUsername());
System.out.println(account.getPassword());
}
}catch(Exception e){
e.printStackTrace();
}
}
@org.junit.Test public void update(){
try {
Account ac=new Account();
ac.setId(2);
ac.setUsername("陈瑞银");
ac.setPassword("modify");
GetSqlMap.getMap("mymap/sqlmap.xml").update("updateAccount", ac);
}catch(Exception e){
e.printStackTrace();
}
}
}
对于查询,我这里查询的是多列,单列的也可以。在pojo的配置文件里改一下resultClass就可以了,在查询的时候用queryForObject方法就可以了。这次的东西也比较简单,
下面这个是其中一个运行效果图