ibatis的移植性雖然沒有hibernate那麼強,但是很多方面hibernate是做不到的,ibatis的特點在於動態sql查詢以及靈活性上面。升級版的mybatis同樣在動態sql查詢上下了不少功夫,如果對hibernate之類的東西厭倦了學習ibatis應該是個不錯的選擇。
1.ibatis程序需要的東西
數據庫驅動必不可少,選擇什麼數據庫無所謂,最重要的就是ibatis的jar包了
2.ibatis最主要的配置文件
<?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/humansource" />
<property name="JDBC.Username" value="root" />
<property name="JDBC.Password" value="123456" />
</dataSource>
</transactionManager>
<!-- 映射文件的相關配置 -->
<sqlMap resource="org/lxh/mapping/Role_sqlmap.xml" />
</sqlMapConfig>
這個配置文件數據源的配置居多,最下面的sqlmap配置的是映射文件,數據源配置出錯或者映射文件不對,程序就運行不起來
3.映射文件
我的建議是屬性名稱和數據庫的列名相對應,另外ibatis的映射文件大部分都是sql語句,如果害怕寫sql,那建議就不要學ibatis了
<?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="Role">
<resultMap id="resultMap" class="org.lxh.info.Role">
<result property="id" column="id"/>
<result property="name" column="name"/>
<result property="remark" column="remark"/>
</resultMap>
<!-- 添加角色 -->
<insert id="createRole" parameterClass="org.lxh.info.Role">
insert into m_role(name, remark)values(#name#,#remark#)
</insert>
<!-- 刪除角色 -->
<delete id="deleteRole" parameterClass="int">
delete from m_role where id=#id#
</delete>
<!-- 修改角色信息 -->
<delete id="updateRole" parameterClass="org.lxh.info.Role">
update m_role set remark=#remark# where id=#id#
</delete>
<!-- 查詢所有的角色信息 -->
<select id="findAll" resultMap="resultMap">
select * from m_role
</select>
</sqlMap>
這個文件最前面的resultMap是返會的結果集的配置,這個地方主要在查詢上面使用,ibatis會把結果集進行封裝
4.領域模型文件
package org.lxh.info;
public class Role {
private Integer id;
private String name;
private String remark;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
ibatis的映射文件應該是比較好理解的,沒有像hibernate那樣另類有什麼一對一對多配置一大把的,ibatis對增刪改查都要很好額區別 如果是查詢那標籤就應該是select其他的以此類推
4.增刪改查操作
package org.lxh.junit;
import static org.junit.Assert.*;
import java.io.Reader;
import java.util.*;
import org.junit.Test;
import org.lxh.info.Role;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class TestIbatis {
//添加角色
@Test
public void testInsert() {
try {
Reader reader = com.ibatis.common.resources.Resources.getResourceAsReader("DataSource.xml");
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
Role r = new Role();
r.setName("系統維護人員");
r.setRemark("--");
sqlMap.insert("createRole", r);
} catch (Exception e) {
e.printStackTrace();
}
}
//刪除角色
@Test
public void testDelete() {
try {
Reader reader = com.ibatis.common.resources.Resources.getResourceAsReader("DataSource.xml");
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
sqlMap.delete("deleteRole", 3);
} catch (Exception e) {
e.printStackTrace();
}
}
//修改角色
@Test
public void testUpdate() {
try {
Reader reader = com.ibatis.common.resources.Resources.getResourceAsReader("DataSource.xml");
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
Role r=new Role();
r.setId(2);
r.setRemark("***");
sqlMap.update("updateRole", r);
} catch (Exception e) {
e.printStackTrace();
}
}
//查詢角色信息
@Test
public void testSelect() {
try {
Reader reader = com.ibatis.common.resources.Resources.getResourceAsReader("DataSource.xml");
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
List<Role>all=sqlMap.queryForList("findAll");
Iterator<Role> it=all.iterator();
while(it.hasNext()){
Role info=it.next();
System.out.println(info.getName()+","+info.getId());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
有人會問ibatis可以寫連接查詢碼,那是肯定的,可以參考下這個文章:
http://blog.csdn.net/walkcode/article/details/6929898
當然瞭如果要使用ibatis執行存儲過程可以參考下面這篇文章
http://blog.csdn.net/walkcode/article/details/9318039
要了解ibatis動態sql可以看下面這個