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