ibatis介绍及配置文件讲解,结合实例

时间:2022-12-25 16:53:13

写下博客最大的好处就是即可以分享给大家,自己也作为一种记忆方式吧。为了便于个人对知识点整理写此文章,还望各位指点。

ibatis是一种“半自动化”的ORM实现,它针对sql语句进行映射。它还是从关系型开始到对象型的思路来解决数据库的操作问题。我这里主要结合一个例子说一说。由于初出茅庐,这里面许多东西都是查找和询问得到的。

下面是主要配置文件sqlMapConfig.xml配置文件,它主要是完成事务的配置、数据库的连接、引入SqlMap.xml配置文件(配置sql语句、输入映射和输出映射)。

下面是sqlMapConfigure.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" 是否启用缓存机制--> 
<!--     lazyLoadingEnabled="true"   是否启用延迟加载机制 --> 
<!--    enhancementEnabled="true"   是否启用字节码增强机制 -->
<!--     errorTracingEnabled="true"   是否启用错误处理机制 --> 
<!--     maxRequests="32"   最大并发请求数 -->  
<!--     maxSessions="10"   最大Session数 --> 
<!--     maxTransactions="5"   最大并发事务数 --> 
<!--    useStatementNamespaces="true" />   是否启用名称空间 -->  
<!-- 数据库的连接 -->
<properties resource="resources/jdbc.properties" />
<transactionManager type="JDBC"><!-- 定义了ibatis的事务管理器有3中(JDBC,JTA,EXTERNAL) --> 
<dataSource type="SIMPLE"><!-- type属性指定了数据源的链接类型,也有3种类型(SIMPLE,DBCP,JNDI) -->
<property name="JDBC.Driver" value="${driver}" />
<property name="JDBC.ConnectionURL" value="${url}" />
<property name="JDBC.Username" value="${username}" />
<property name="JDBC.Password" value="${password}" />
<property name="Pool.MaximumActiveConnections" value ="10" />   <!-- 连接池维持的最大容量 -->  
<property name="Pool.MaximumIdleConnections" value ="5" />   <!-- 连接池允许挂起的最大连接 --> 
<property name="Pool.MaximumCheckoutTime" value ="120000" />   <!-- 连接被某个任务所允许占用的最大时间 -->  
<property name="TimeToWait" value ="500" />   <!-- 线程允许等待的最大时间 --> 
</dataSource>
</transactionManager>
<!-- 引入SQLMap.xml(配置SQL语句、输入映射和输出映射) -->
<sqlMap resource="resources/User.xml"/>
<sqlMap resource="resources/Ext.xml"/><!-- sqmMap节点指定了映射文件的位置,配置文件中可以定义多个sqlMap元素,以指定项目内所包含的所有映射文件.-->

</sqlMapConfig>

配置文件的详细解释

一、transactionManager节点

transactionManagerab定义了ibatis的事务管理器,目前提供了以下几种选择:


1)  JDBC
:通过传统JDBC Connection.commit/rollback实现事务支持.
2)  JTA:
使用容器提供的JTA服务实现全局事务管理
.
3)  EXTERNAL
:外部事务管理,如在EJB中使用ibatis,通过EJB的部署配置即可实现自动的事务管理机制.此时ibatis将把所有事务委托给外部容器进行管理.

、dataSource节点

dataSource从属于 transactionManager,用于设定ibatis运行期使用DataSource属性.
 type
属性: dataSource元素的 type属性指定了 dataSource的实现类型.可选项目
:
1)  SIMPLE:
ibatis内置的 dataSource实现,其中实现了一个简单的数据库连接池机制,对应 ibatis实现类为

               com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory.
  JDBC
使用数据库自己的事务(局部事务),connect.beginTranstion(), connect.commit().

2)  DBCP:基于Apache DBCP连接池组件实现的DataSource封装,当无容器提供DataSource服务时,建议使用该选项,对应ibatis实现类为
              com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory.
  JTA
使用jta事务管理器管理事务(全局事务),使用userTranstion对象.

3)  JNDI:使用J2EE容器提供的DataSource实现, DataSource将通过指定的JNDI Name从容器中获取.对应ibatis实现类为
              com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory.
  Ibatis
不控制事务,事务交由外部控制,一般在CTM,spring托管事务中使用.

以上就是我在网上再结合自己项目总结的有关SQLMapConfig.xml配置文件的了解

接下来看一下sqlmap.xml配置文件(SQL语句的编写)

<?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="UserDAO">
	<!-- 建立表与对象的映射关系 -->
	<resultMap id="UserDO" class="entity.User"> 
		<result property="id" column="ID" />
		<result property="username" column="USERNAME" />
		<result property="password" column="PASSWORD" />
	</resultMap>
	<!-- 常用的增删改查sql语句 -->
	<insert id="insert" parameterClass="entity.User">
		insert into USER (ID,USERNAME,PASSWORD)
		values (
		#id#,
		#username#,
		#password# 
		)
		<!-- 
		自动生成主键
		<selectKey resultClass="int" keyProperty="id">
			SELECT LAST_INSERT_ID() AS ID
		</selectKey>
		 -->
	</insert>
	
	<delete id="deleteUserByName" parameterClass="java.lang.String">
		<![CDATA[
		delete from USER
		where USERNAME = #username#
		]]>
	</delete>
	
	<update id="updateUser" parameterClass="entity.User">
		update USER
		<dynamic prepend="set">
		<isNotNull prepend="," property="username"><!-- 判断是否为空 -->
		USERNAME = #username#
		</isNotNull>
		<isNotNull prepend="," property="password">
		PASSWORD = #password#
		</isNotNull>
		</dynamic>
		where ID = #id#
	</update>
	
	<!-- resultClass与上方sqlMap定义的映射对应 -->
	<select id="selectUser" parameterClass="java.lang.String" resultMap="UserDO">
		select ID,USERNAME,PASSWORD
		from USER
		where USERNAME = #username#
	</select>
	
</sqlMap>
有关这个配置文件的讲解可以看一看 ibatis中SQL映射配置文件中动态SQL语句语法 

动态语句的编写与理解,方便今后查看。而且我自己也写了一个SQL语句的配置文件,如下:

<?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">
<!-- 自己单独写SQL语句  -->
<sqlMap namespace="UserDAO">

    <select id="select" parameterClass="java.lang.String" resultMap="UserDO">
		select ID,USERNAME,PASSWORD
		from USER
		where PASSWORD = #password#
	</select>
</sqlMap>
主要配置文件和SQL语句相关配置文件都结束了,接下来说一说我单独写的有关连接数据库的.properties文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=1234
这个配置文件在书写的时候一定要小心,不可以有无用的空格,不然会保存,这样将他提出来也是便于今后修改和整理,以下是对jdbc连接数据库的详细解析:

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=123

#<!-- 初始化连接 -->
initialSize=10

#最大连接数量
maxActive=50

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000


#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=utf-8

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED

配置文件都OK了,下面就是实体类和测试类了,实体类必须要封装,这是必须的。

package entity;

public class User {

	private int id;
	private String username;
	private String password;
	
	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;
	}
}
测试类我在这里给大家写出了基本的增删改查:

package test;

import java.io.Reader;
import java.util.List;

import com.ibatis.common.resources.Resources;
import com.ibatis.common.util.PaginatedList;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

import entity.User;

public class Test {
	public static void main(String[] args) {
		SqlMapClient sqlMapclient = null;
		try {
			Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
			//SqlMapClient是ibatis的核心组件,提供数据操作的基础平台。SqlMapClient可通过XmlSqlMapClientBuilder创建: 
			sqlMapclient = SqlMapClientBuilder.buildSqlMapClient(reader);
		User user = new User();
		
		//增
		user.setId(3);
		user.setPassword("1234");
		user.setUsername("cg1");
		sqlMapclient.insert("insert", user);
		
		//改
//		user.setPassword("123");
//		user.setId(1);
//		sqlMapclient.update("updateUser", user);
		
		//删
//		sqlMapclient.delete("deleteUserByName","troy");
		
		//查
//		@SuppressWarnings("unchecked")
//		//调用写的基本方法
//		List<User> users = (List<User>) sqlMapclient.queryForList("selectUser", "cg");
//		for(User temp : users) {
//			System.out.println(temp.getId() + "-" + temp.getUsername() + "-" + temp.getPassword());
//		}
//		@SuppressWarnings("unchecked")
//		//调用自己后填入的方法
//		List<User> users1 = (List<User>) sqlMapclient.queryForList("select", "123456");
//		for(User temp : users1) {
//			System.out.println(temp.getId() + "-" + temp.getUsername() + "-" + temp.getPassword());
//		}

		reader.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}
这篇文章主要参考了以下文章:

iBATIS配置文件详细说明

简单实例链接地址:

 ibatis框架简单应用