写下博客最大的好处就是即可以分享给大家,自己也作为一种记忆方式吧。为了便于个人对知识点整理写此文章,还望各位指点。
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托管事务中使用.
接下来看一下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
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();
}
}
}
这篇文章主要参考了以下文章:
简单实例链接地址: