zoukankan      html  css  js  c++  java
  • 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



  • 相关阅读:
    jsp mysql 配置线程池
    服务端 模拟 检测 攻击。。乱写
    硕思闪客精灵 7.2 破解版
    unity UnityAwe 插件
    smartfoxserver 2x 解决 Math NAN
    unity 断点下载
    java 监听文件目录修改
    wind7 64 setup appjs
    sfs2x 修改jvm 内存
    unity ngui 解决图层问题
  • 原文地址:https://www.cnblogs.com/itmyhome/p/4131294.html
Copyright © 2011-2022 走看看