• ibatis实战之基础环境搭建


    关于ibatis的介绍、优缺点,以及ibatis和hibernate的比较再此不在赘述,可参阅其他资料。

    一、准备工作

    1、下载ibatis软件包http://download.csdn.net/detail/itmyhome/7473661

       所需jar包为:ibatis-xxx.jar,mysql-connector-java-xxx-bin.jar

    2、创建测试数据库,并新建user表,其中包含三个字段:

       id(int)
       name(varchar)
       age(int)

       ps:以mysql数据库为例

    create table user(
        id int,
        name varchar(50),
        age int
    );

    二、构建ibatis基础代码

    ibatis基础代码包括:

    1、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"
    		errorTracingEnabled="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/ibatis" />
    			<property name="JDBC.Username" value="root" />
    			<property name="JDBC.Password" value="root" />
    			<property name="Pool.MaximumActiveConnections" value="10" />
    			<property name="Pool.MaximumIdleConnections" value="5" />
    			<property name="Pool.MaximumCheckoutTime" value="120000" />
    			<property name="Pool.TimeToWait" value="500" />
    			<property name="Pool.PingQuery" value="select 1 from ACCOUNT" />
    			<property name="Pool.PingEnabled" value="false" />
    			<property name="Pool.PingConnectionsOlderThan" value="1" />
    			<property name="Pool.PingConnectionsNotUsedFor" value="1" />
    		</dataSource>
    	</transactionManager>
    	<sqlMap resource="com/itmyhome/User.xml" />
    </sqlMapConfig>

    ibatis配置文件各节点简单说明:

    (1)Settings节点

    参数描述
    cacheModelsEnabled是否启用 SqlMapClient 上的缓存机制。
    建议设为"true"
    enhancementEnabled是否针对POJO启用字节码增强机制以提升
    getter/setter 的调用效能,避免使用Java
    Reflect 所带来的性能开销。
    同时,这也为Lazy Loading带来了极大的性能
    提升。建议设为"true"
    errorTracingEnabled是否启用错误日志,在开发期间建议设为"true"
    以方便调试
    lazyLoadingEnabled是否启用延迟加载机制,建议设为"true"
    maxRequests最大并发请求数(Statement并发数)
    maxTransactions最大并发事务数
    maxSessions最大Session数.即当前最大允许的并发SqlMapClient数
    maxSessions设定必须介于
    maxTransactions和maxRequests之间,即
    maxTransactions<maxSessions=< maxRequests
    useStatementNamespaces是否使用Statement命名空间。
    这里的命名空间指的是映射文件中,sqlMap节点
    的namespace属性,如在上例中针对user
    表的映射文件sqlMap节点:
    <sqlMap namespace="User">
    这里,指定了此sqlMap节点下定义的操作均从
    属于"User"命名空间。
    在useStatementNamespaces="true"的情况下,
    Statement调用需追加命名空间,如:
    sqlMap.update("User.updateUser",user);
    否则直接通过Statement名称调用即可,如:
    sqlMap.update("updateUser",user);
    但请注意此时需要保证所有映射文件中,
    Statement定义无重名

    (2)transactionManager节点

       transactionManager节点定义了ibatis的事务管理器,目前提供了以下几种选择:
       1)  JDBC
       通过传统 JDBC Connection.commit/rollback实现事务支持。
       2)  JTA
       使用容器提供的JTA服务实现全局事务管理。
       3)  EXTERNAL
       外部事务管理,如在EJB中使用ibatis,通过EJB的部署配置即可实现自动的事务管理机制。

       此时ibatis将把所有事务委托给外部容器进行管理。此外,通过Spring等轻量级容器实现事务的配置化管理也是一个不错的选

       择。关于结合容器实现事务管理,参见“高级特性”中的描述。

    (3)dataSource节点

       dataSource从属于transactionManager节点,用于设定ibatis运行期使用的DataSource属性。

       type属性:dataSource节点的type属性指定了dataSource的实现类型。

       可选项目:

       1)  SIMPLE:

       SIMPLE是ibatis内置的dataSource实现,其中实现了一个简单的数据库连接池机制,对应ibatis实现类为

       com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory。

       3)  DBCP:

       基于Apache DBCP连接池组件实现的DataSource封装,当无容器提

       供DataSource服务时,建议使用该选项,对应ibatis实现类为com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory。

       3)  JNDI:

       使用J2EE容器提供的DataSource实现,DataSource将通过指定

       的JNDI Name从容器中获取.对应ibatis实现类为com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory。

        dataSource的子节点说明(SIMPLE&DBCP):

    JDBC.DriverJDBC驱动.如:com.mysql.jdbc.Driver
    JDBC.ConnectionURL数据库URL。如:jdbc:mysql://localhost:3306/ibatis
    如果用的是SQLServer JDBC Driver,需要
    在url后追加SelectMethod=Cursor以获得
    JDBC事务的多Statement支持。
    JDBC.Username数据库用户名
    JDBC.Password数据库用户密码
    Pool.MaximumActiveConnections数据库连接池可维持的最大容量。
    Pool.MaximumIdleConnections数据库连接池中允许的挂起(idle)连接数。

    (4)sqlMap节点

    sqlMap节点指定了映射文件的位置,配置中可出现多个sqlMap节点,以指定

    项目内所包含的所有映射文件。

    2、POJO

    下面是我们用作示例的一个POJO

    public class User implements Serializable {
    
    	private static final long serialVersionUID = 1L;
    	private int id;
    	private String name;
    	private int age;
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    }


    3、映射文件

    与Hibernate不同,因为需要人工编写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="User">
    	<typeAlias alias="user" type="com.itmyhome.User" />
    	<!-- 查询 -->
    	<select id="getUser" parameterClass="java.lang.Integer" resultClass="user">
    		<![CDATA[
    		    select name,age from user where id = #id#
    		]]>
    	</select>
    	<!-- 插入 -->
    	<insert id="insertUser" parameterClass="user">
    		    insert into user values(#id#,#name#,#age#)
    	</insert>
    	<!-- 更新 -->
    	<update id="updateUser" 
    		    parameterClass="user"> 
    		<![CDATA[
    			update user 
    			SET name=#name#, age=#age#
    			WHERE id = #id# 
    		]]>
    	</update>
    	<!-- 删除 -->
    	<delete id="deleteUser" parameterClass="java.lang.Integer">
    			delete from user where id = #id# 
    	</delete>
    </sqlMap>
    从上面的映射文件可以看出,通过<insert>、<delete>、<update>、

    <select>四个节点,我们分别定义了针对User对象的增删改查操作。在这

    四个节点中,我们指定了对应的SQL语句,以update节点为例:

    <update id="updateUser"                        (1
    	parameterClass="user">                     (2
    	<![CDATA[                                  (3  
    		update user                            (4  
    		SET name=#name#, age=#age#             (5
    		WHERE id = #id# 
    	]]>
    </update>
    ⑴ID

    指定了操作ID,之后我们可以在代码中通过指定操作id来执行此节点所定义的操作,如:

    sqlMap.update("updateUser",user);

    ID设定使得在一个配置文件中定义两个同名节点成为可能(两个update节点,以不同id区分)

    ⑵ parameterClass

    指定了操作所需的参数类型,此例中update操作以

    com.itmyhome.User 类型的对象作为参数,目标是将提供的User实例更新到数据库。

    parameterClass="user"中,user为"com.itmyhome.User"类的别名,别名可通过typeAlias节点指定,

    如示例配置文件中的:<typeAlias alias="user" type="com.itmyhome.User"/>

    ⑶  <![CDATA[… ]]>

    通过<![CDATA[… ]]>节点,可以避免SQL中与XML规范相冲突的字符对XML映射文件的合法性造成影响。

    ⑷执行更新操的SQL,这里的SQL即实际数据库支持的SQL语句,将由ibatis填入参数后交给数据库执行。

    ⑸ SQL中所需的用户名参数,"#name#"在运行期会由传入的user对象的name属性填充。(其他参数同)

    对于这个示例,ibatis在运行期会读取id为"updateUser"的update节点

    的SQL定义,并调用指定的user对象的对应getter方法获取属性值,并用此

    属性值,对SQL中的参数进行填充后提交数据库执行。

    好了,我们完成了所有的配置文件和映射文件,就剩下应用的编码工作了。

    首先要设置SQL Map,读入刚创建好的SQL Map XML配置文件。为简化这个工作,可以使用

    SQL Map架构中提供的Resources类。

    Stringresource ="SqlMapConfig.xml"; 
    Readerreader=Resources.getResourceAsReader(resource); 
    SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);

    以上的SqlMapClient对象是线程安全,并且应持久生存。对于一个特定的应用,只需

    进行一次SqlMap配置。因此,它可以作为基类的一个静态对象(即DAO对象的基类),或

    者,如果您想让它有更大的作用范围,可以把它封装在方便使用的类中。例如:

    public class MyAppSqlConfig {
    	private static final SqlMapClient sqlMap;
    	static {
    		try {
    			String resource = "SqlMapConfig.xml";
    			Reader reader = Resources.getResourceAsReader(resource);
    			sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
    		} catch (Exception e) {
    			e.printStackTrace();
    			throw new RuntimeException("Error initializing MyAppSqlConfig class. Cause: " + e);
    		}
    	}
    	public static SqlMapClient getSqlMapInstance() {
    		return sqlMap;
    	}
    }

    从数据库读取对象

    既然SqlMap对象已完成初始化,那么就可以方便地使用它了。首先我们用它

    从数据库中读取一个User对象(本例中 先假设User表中一村庄N条记录,id从i到N)

    要从数据库中得到一个User对象,只需要SqlMap实例,让我们读入id为1的User对象

    SqlMapClient sqlMap = MyAppSqlConfig.getSqlMapInstance(); 
    User user = (User)sqlMap.queryForObject ("getUser", 1);

    把对象写入数据库
    User u = new User();
    u.setId(2);
    u.setName("wangwu");
    u.setAge(23);
    sqlMap.insert("insertUser",u);

    更新对象

    User u = new User();
    u.setId(3);
    u.setName("itmyhome");
    u.setAge(25);
    sqlMap.update("updateUser",u)

    删除对象

    sqlMap.delete("deleteUser", 1)


    项目工程图如下:



    项目源码下载:http://download.csdn.net/detail/itmyhome/7473721



  • 相关阅读:
    Educational CF # 17 C 二分,字符串 D 最长路,dp
    HDU-1878 判断无向图欧拉回路,水
    LightOJ-1094 求树直径,水
    POJ-1144 Tarjan求割点,双连通模板题
    HDU-1269 Tarjan求强连通分量,模板题
    POJ-1094 拓扑排序
    POJ-1847 最短路裸题,Floyd, Bellman, Dijkstra, Spfa
    LightOJ-1005 组合数学,组合数水题
    CF #392(2) C 暴力模拟
    Android xUtils3使用
  • 原文地址:https://www.cnblogs.com/itmyhome/p/4131294.html
Copyright © 2020-2023  润新知