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.youkuaiyun.com/walkcode/article/details/6929898
当然了如果要使用ibatis执行存储过程可以参考下面这篇文章
http://blog.youkuaiyun.com/walkcode/article/details/9318039
要了解ibatis动态sql可以看下面这个