`
springking
  • 浏览: 131807 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

ibatis小结

阅读更多

sqlMap配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig     
    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"     
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>

    <!-- settings元素指定全局配置选项 -->
    <!-- useStatementNamespaces属性指定是否开启命名空间,默认值为false(关闭) -->   
    <!-- cacheModelsEnabled属性指定是否开启数据高速缓存,默认值为true(开启) -->
    <!-- enhancementEnabled属性指定是否开启cglib中已优化的类来提高延迟加载的性能,默认值为true(开启) -->
    <!-- lazyLoadingEnabled属性指定是否开启延迟加载,默认值为true(开启) -->
    <settings   
       
        useStatementNamespaces="true" 
        cacheModelsEnabled="true"
        enhancementEnabled="true"
        lazyLoadingEnabled="true"
    />

    <!-- 由transactionManager元素的type属性值指定使用哪个事务管理器. -->
    <transactionManager type="JDBC" commitRequired="false">
        <!-- dataSource元素定义DataSourceFactory的实现类,用这个实现类来创建实际的DataSourse. -->
        <dataSource type="SIMPLE">
            <!-- 指定数据源的各种属性值 -->
            <property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver" />
            <property name="JDBC.ConnectionURL"
                value="jdbc:oracle:thin:@127.0.0.1:1521:TEST" />
            <property name="JDBC.Username" value="me" />
            <property name="JDBC.Password" value="123" />
        </dataSource>
    </transactionManager>

    <sqlMap resource="com/lovo/ibatis/student.xml" />

</sqlMapConfig>
——————————————————————————————————————————————————————
<!-- ibatis映射文件 -->

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap     
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"     
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
   
    <!-- 在根元素上指定命名空间 -->
<sqlMap namespace="Person">

        <!-- 给经常使用到的类取一个别名 -->
<typeAlias alias="person" type="com.po.Person"/>
    <!-- 查询全部数据 -->
    <select id="getAllPerson" resultClass="person">
        <![CDATA[
        select * from person
        ]]>
    </select>

    <!-- 查询单条数据 -->
    <select id="getOnePerson" resultClass="person" parameterClass="int">
        <![CDATA[
        select * from person where id=#id#
        ]]>
    </select>
   
    <!-- 插入1条数据 -->
    <insert id="insertUser" parameterClass="person">
        <![CDATA[
        INSERT INTO person(name,pwd) VALUES (#name#,#pwd#)
        ]]>
    </insert>
   
    <!-- 删除全部数据 -->
    <delete id="deleteAllPerson">
        <![CDATA[
        delete from person
        ]]>
    </delete>
   
    <!-- 删除1条数据 -->
    <delete id="deleteOnePerson" parameterClass="person">
        <![CDATA[
        delete from person where id=#id#
        ]]>
    </delete>
   
    <!-- 更新1条数据 -->
    <update id="updatePerson" parameterClass="person">
        <![CDATA[
        UPDATE person SET name=#name#,pwd=#pwd# WHERE id = #id#
        ]]>
    </update>
   
   
</sqlMap>
——————————————————————————————————————————————————————
可以将一条sql语句进行分解,如:
    <sql id="select-all">
        <![CDATA[
            select * from t_stu
        ]]>
    </sql>
   
    <sql id="where-name">
        <![CDATA[
            where s_name = #name#
        ]]>
    </sql>
   
    <!-- 查询一个学生 -->
    <select id="showOneStudent" parameterClass="String"  resultClass="student">
        <include refid="select-all"/>
        <include refid="where-name"/>     
    </select>
   
    这样在其他sql语句中也可以引用<sql>标签中定义的语句,只要传入的参数正确即可,提高了复用率
    (注意:<include>标签组合sql语句的顺序)

——————————————————————————————————————————————————————
ibatis中like关键字的用法
    <select id="showOneStudentByName" parameterClass="String" resultMap="studentORM">
        <![CDATA[
              select * from t_stu where s_name like '%'||#name#||'%'
        ]]>
    </select>
——————————————————————————————————————————————————————

        读取配置文件
        Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
        SqlMapClient sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
        reader.close();
       
        查询单条记录
        Person p = (Person)sqlMapper.queryForObject("getOnePerson", 55);
        System.out.println("名字:" + p.getName() + "  密码:" + p.getPwd());
       
        查询全部记录(返回1个List)
        List personList = sqlMapper.queryForList("getAllPerson");
        for(int i=0; i<personList.size(); i++){
            Person p = (Person)personList.get(i);
            String name = p.getName();
            String pwd = p.getPwd();
            System.out.println("名字:" + name + "  密码:" + pwd);
        }
       
        查询全部记录(返回1个Map),其中id和name都是Person类的属性,
        得到的Map是以id属性的值作为键,name属性的值作为值
        Map map = sqlMapper.queryForMap("getAllPerson", null, "id","name");
        Set keySet = map.keySet();
        Iterator it = keySet.iterator();
        while(it.hasNext()){
            int id = (Integer) it.next();
            String name = (String) map.get(id);
            System.out.println(id + "  " +name);
        }
       
        分页支持
        arg0表示映射文件中要执行的sql语句,arg1表示从第多少行记录开始(包含这一行记录)
        arg2表示要取多少行记录。
        例如:List personList = sqlMapper.queryForList("getAllPerson",8,5);
        表示执行"getAllPerson"匹配的sql语句,从第8行记录开始,取5条记录。
       
        更改数据
        Person p = new Person();
        p.setId(55);
        p.setName("张三");
        p.setPwd("321");
        sqlMapper.update("updatePerson",p);
       
        删除全部数据
        sqlMapper.delete("deleteAllPerson");
       
        删除单条数据
        for(int i=0; i<10; i++){
            Person p = new Person();
            p.setId(i);
            sqlMapper.delete("deleteOnePerson",p);
        }
       
        插入单条数据
        for(int i=0; i<10; i++){
            Person p = new Person();
            p.setName("名字" + i);
            p.setPwd("密码" + i);
            sqlMapper.insert("insertUser",p);
        }
        ____________________________________________
        事务处理
        sqlMapper.startTransaction();
        try{
            for(int i=1; i<11; i++){
                Person p = new Person();
                p.setId(i);
                p.setName("名字" + i);
                p.setPwd("密码" + i);
                sqlMapper.insert("insertUser",p);
            }
           
            Person p = new Person();
            p.setId(1);
            sqlMapper.insert("insertUser", p);
            sqlMapper.commitTransaction();
        }
        catch (Exception e) {
            sqlMapper.endTransaction();
            e.printStackTrace();
        }
       
        SqlMapClient类中有以下方法控制事务
        startTransaction()方法开始一个事务
        commitTransaction()方法提交事务
        endTransaction()方法回滚事务
       
        __________________________________________________
       
        spring集成ibatis
       
        1.导入commons-dbcp-1.2.2.jar和commons-pool-1.3.jar
       
        2.配置数据源
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="colse">
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <property name="url" value="jdbc:mysql://localhost:3306/test" />
            <property name="username" value="root" />
            <property name="password" value="root" />   
        </bean>
       
        3.配置产生sqlMapClient的工厂bean,将数据源传入
        <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
            <property name="configLocation" value="SqlMapConfig.xml"></property>
            <property name="dataSource" ref="dataSource"></property>
        </bean>
       
        4.配置自定义的DAO,这个自定义的DAO类继承org.springframework.orm.ibatis.support.SqlMapClientDaoSupport
          在配置文件中将第3步的工厂bean传入   
        <bean id="personDao" class="com.dao.DAO">
            <property name="sqlMapClient" ref="sqlMapClient"></property>
        </bean>
       
        ___________________________________________________________________
        类的属性和表的字段名不一致时可以用resultMap标签来进行映射
        <sqlMap namespace="Person">

            <typeAlias alias="person" type="com.po.Person"/>
            <resultMap class="person" id="aaa">
                <result property="id" column="id" />
                <result property="username" column="name" />
                <result property="password" column="pwd" />
            </resultMap>
           
            <!-- 查询全部数据 -->
            <select id="getAllPerson" resultMap="aaa">
                <![CDATA[
                select * from person
                ]]>
            </select>
        </sqlMap>
        ________________________________________________________________________
       
        parameterMap的使用同resultMap相似,parameterMap标签的id属性作为唯一标识符,与insert等语句执行标签的
            parameterMap属性值相匹配。
        parameterMap标签中可以由多个parameter子标签,parameter子标签的property属性值和parameterMap标签的class属性值指定的java对象的属性相匹配。
        parameterMap中parameter子标签出现的顺序要和sql语句中?的顺序一致。
        例如:
       
            <parameterMap class="users" id="user">
                <parameter property="id"/>
                <parameter property="name"/>
                <parameter property="pwd"/>
            </parameterMap>
   
            <insert id="in" parameterMap="user">
                <![CDATA[
                    insert into users(id,name,pwd) values(?,?,?)
                ]]>
            </insert>
           
            插入的是顺序是id,name,pwd 所以parameter出现的顺序也是    <parameter property="id"/>
              <parameter property="name"/>
                <parameter property="pwd"/>
            ________________________________________________________________________
            主键自动生成方法:
            在insert标签的子标签selectKey中进行指定.keyProperty属性的值就是bean的属性名,也就是与数据库中主键对应的bean的属性。resultClass属性的值就是查询主键生成策略返回的类型,这里以oracle为例
           
            <insert id="vvv" parameterMap="sss">
                <selectKey keyProperty="id" resultClass="int">
                     select stu_seq.nextval as id from dual
                </selectKey>
                  <![CDATA[
                    insert into t_stu2(S_ID,S_NAME,S_SEX) values(?,?,?)
                ]]> 
            </insert> 
           
            keyProperty="id"表示在插入的po对象中有1个属性是id,resultClass="int"表示查询主键返回的值是int类型。
            ibatis把查询到的主键值自动赋给po对象的id属性(因为keyProperty="id",指定的是id属性,也可以是其他属性).
            然后再真正执行insert语句,这时po对象的id属性已经赋值了,在调用的时候可以不给id属性赋值(即使赋值了也会被ibatis赋的值取代)。
           
            ________________________________________________________________________           
            1对1联合查询或多对1查询
            例如:
            Users类中有Person类的引用,查询某个Users类的对象时自动加载该对象的person属性。
           
            类的定义如下:
            public class Users {
                private int id;
                private String name;
                private String pwd;
                private Person person;
               
                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 String getPwd() {
                    return pwd;
                }
                public void setPwd(String pwd) {
                    this.pwd = pwd;
                }
                public Person getPerson() {
                    return person;
                }
                public void setPerson(Person person) {
                    this.person = person;
                }
            }
           
            public class Person {

                private int id;
                private String username;
                private String password;
               
                public int getId() {
                    return id;
                }
                public void setId(int id) {
                    this.id = id;
                }
                public String getPassword() {
                    return password;
                }
                public void setPassword(String password) {
                    this.password = password;
                }
                public String getUsername() {
                    return username;
                }
                public void setUsername(String username) {
                    this.username = username;
                }
            }
           
            Users类中有1个Person类的引用。
            sqlMap文件映射如下:
            <resultMap class="users" id="aaa">
                <result property="id" column="id"/>
                <result property="name" column="name"/>
                <result property="pwd" column="pwd"/>
                <result property="person.id" column="p.id"/>
                <result property="person.username" column="p.name"/>
                <result property="person.password" column="p.pwd"/>
            </resultMap>
           
            <select id="joinUser" parameterClass="int" resultMap="aaa">
                <![CDATA[
                    select * from users u left join person p
                    on u.pid = p.id
                    where u.id = #id#;
                ]]>
            </select>
            先定义resultMap,其中<result property="person.id" column="p.id"/>表示返回类型的person属性所对应的对象
            的id属性,对应的数据库中的字段是p.id,p是查询是定义的表的别名。
            在查询中直接将2张表用join进行联合查询。
           
           
——————————————————————————————————————————————————————
1对多联合查询

在“一”方保存1个Connection类型的集合对象,集合中的元素就是“多”方的对象。
例如:
    “一”方
        public class Users {
            private int id;
            private String name;
            private String pwd;
            private List personList;
           
            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 String getPwd() {
                return pwd;
            }
            public void setPwd(String pwd) {
                this.pwd = pwd;
            }
            public List getPersonList() {
                return personList;
            }
            public void setPersonList(List personList) {
                this.personList = personList;
            }
       
        }
“多”方
            public class Person {
           
                private int id;
                private String username;
                private String password;
               
                public int getId() {
                    return id;
                }
                public void setId(int id) {
                    this.id = id;
                }
                public String getPassword() {
                    return password;
                }
                public void setPassword(String password) {
                    this.password = password;
                }
                public String getUsername() {
                    return username;
                }
                public void setUsername(String username) {
                    this.username = username;
                }   
            }
           
            sqlMap配置文件
            <resultMap class="users" id="bbb">
                <result property="id" column="id" />
                <result property="name" column="name" />
                <result property="pwd" column="pwd" />
                <result property="personList" column="id" select="Users.ssss" />
            </resultMap>
            <resultMap class="person" id="ppp">
                <result property="id" column="id"/>
                <result property="username" column="name"/>
                <result property="password" column="pwd"/>
            </resultMap>
            <select id="ssss" parameterClass="int" resultMap="ppp">
                <![CDATA[
                    select * from person
                    where uid = #uid#;
                ]]>
            </select>
            <select id="showUsers" parameterClass="int" resultMap="bbb">
                <![CDATA[
                    select * from users
                    where id = #id#;
                ]]>
            </select>
           
            执行顺序:应用程序调用id="showUsers"的select语句,将查询结果组装为<select id="showUsers">指定的类型,
            当组装到<result property="personList" column="id" select="Users.ssss"/>时,将column属性指定的数据库字段的值作为参数传给调用id="ssss"的select语句并执行,然后将返回结果组装成1个集合对象,赋值给property属性指定的集合类对象。
           
           
            注意:在指定<result>元素的select属性时,如果开启了命名空间,也要指定命名空间。
            ——————————————————————————————————————————————
            当resultMap调用select语句时如果需要传递的参数大于1个时,可以用 column="{键=列名,键=列 ......}"进行传递,在select语句中可以用#键#来接受参数。
            例如:
            <resultMap class="users" id="bbb">
                <result property="id" column="id" />
                <result property="name" column="name" />
                <result property="pwd" column="pwd" />
                <result property="personList" column="{aaa=id,bbb=name}" select="Users.ssss" />
            </resultMap>
            <resultMap class="person" id="ppp">
                <result property="id" column="id"/>
                <result property="username" column="name"/>
                <result property="password" column="pwd"/>
            </resultMap>
            <select id="ssss" parameterClass="int" resultMap="ppp">
                <![CDATA[
                    select * from person
                    where uid = #uid#;
                ]]>
            </select>
            <select id="showUsers" parameterClass="int" resultMap="bbb">
                <![CDATA[
                    select * from users
                    where id = #aaa# and name=#bbb#
                ]]>
            </select>
           
            在<result property="personList" column="{aaa=id,bbb=name}" select="Users.ssss" />中aaa和bbb就是键。
            在select语句中利用where id = #aaa# and name=#bbb#就可以接收。
           
_____________________________________________________________________________________________
   
    如果在代码中向sql语句传递的参数超过1个,并且不是同1个对象的属性,在映射文件中可以将parameterClass设置为"java.util.Map".Map的键就是参数名。
    例如
    <select id="showTotalNum" parameterClass="java.util.Map" resultClass="int">
        <![CDATA[
        select count(*) from letter where place=#place# and user=#username#
        ]]>
    </select>
   
    Map的键就是place和username。
           
____________________________________________________________________________________________________

当1个对象需要多次查询才能完成赋值时,可以使用public Object queryForObject(String statementName,
Object parameterObject, Object resultObject)方法。将查询提交封装为1个对象,并将需要赋值的对象也作为参数传入,
多次查询时只要保证每次传入的需要赋值的对象是同1个即可。
例如:
    配置文件:
        <resultMap class="person" id="aaa">
            <result property="id" column="id"/>
            <result property="password" column="pwd"/>
        </resultMap>
       
        <resultMap class="person" id="bbb">
            <result property="username" column="name"/>
        </resultMap>
       
        <select id="showPerson2" parameterClass="int" resultMap="bbb">
            <![CDATA[
                select name from person where id = #id#;
            ]]>
        </select>
       
        <select id="showPerson1" parameterClass="int" resultMap="aaa">
            <![CDATA[
                select id,pwd from person where id = #id#;
            ]]>
        </select>
       
        调用:
            public Person getOneUser(int id,String name){
                Person p = new Person();
                this.getSqlMapClientTemplate().queryForObject("Users.showPerson1", id,p);
                this.getSqlMapClientTemplate().queryForObject("Users.showPerson2", id,p);
                return p;
            }
           
        通过2次查询为Person类的p对象进行了赋值。

分享到:
评论
2 楼 facingSun 2009-03-19  
学习~学习~
1 楼 diyutaizi3721 2008-06-02  
看过还蛮详细的!!
学习中...
加油!!!

相关推荐

    ibatis 学习小结笔记

    ### ibatis 学习小结笔记 #### 一、ibatis 概述 ibatis 是一个基于 Java 的持久层框架,它提供了一种简便的方式来处理关系型数据库与 Java 对象之间的映射(O/R Mapping)。ibatis 在设计上强调的是 SQL 语句的...

    IBATIS开发使用小结

    IBATIS是一个开源的ORM(Object-Relational Mapping)框架,最初由Java版本发展而来,后来移植到了.NET平台,成为IBatis.Net。它允许开发者将SQL语句与业务逻辑对象分离,以XML文件的形式存储SQL映射,提高代码的可...

    iBATIS实战

    1.5 小结 24 第2章 iBATIS是什么 26 2.1 映射SQL语句 27 2.2 iBATIS如何工作 29 2.2.1 iBATIS之于小型、简单系统 30 2.2.2 iBATIS之于大型、企业级系统 31 2.3 为何使用iBATIS 31 2.3.1 简单性 32 2.3.2 生产效率 ...

    Ibatis.net学习和实例~

    通过提供的文件《IBatisNet开发使用小结.docx》和《iBatis[1].Net详细使用手册.docx》,你将能够找到具体的步骤和示例代码,这些实例将涵盖基本的CRUD操作(创建、读取、更新和删除),以及更高级的功能如存储过程...

    ibatis in action

    每个章节末尾都有小结和练习题,加深理解并鼓励读者动手实践。书中的案例涵盖了各种常见应用场景,如单表操作、多表关联查询、批量更新等,全面展示了iBatis在实际开发中的应用。 总之,《iBatis in Action》是学习...

    Ibatis3.0+spring2.5+strut2

    #### 四、小结 通过以上步骤,我们成功地将 Ibatis3.0、Spring2.5 和 Struts2 这三个框架进行了整合,并实现了一个简单的应用案例。在整个过程中,我们不仅了解了各个框架的基本用法,还掌握了它们之间如何协作以...

    SSI框架整合小结

    ### SSI框架整合小结 #### 一、概述 本文旨在详细介绍在SSI(Struts + Spring + iBatis)框架下的整体运作流程。通过本文,读者可以了解到在SSI框架环境中,每一项具体操作是如何被各个组件所处理和执行的。 ####...

    Java数据库技术详解 DOC简版

    1.5 本章小结 第2章 SQL语句基础之DDL 2.1 DDL基础 2.2 DDL操作视图 2.3 本章小结 第3章 SQL语句基础之DML 3.1 SELECT语句基础 3.2 WHERE子句 3.3 ORDER BY子句 3.4 GROUP BY和HAVING子句 3.5 ...

    JAVA 模块知识小结

    JAVA模块知识小结涵盖的内容非常广泛,包含了Java技术栈中的多个重要知识点,从基础的开发工具到框架、数据库以及编程语言本身,以下是对给定文件中提到的各项技术的详细知识点梳理: 1. Hibernate和Ibatis ...

    ssi框架学习个人小结

    - **Spring与iBatis的集成**:通过Spring管理DAO层的Bean,使得iBatis更加灵活地被应用于数据访问操作中。 #### 三、开发环境搭建 ##### 1. 开发工具 - **Eclipse 3.6**:主流的Java集成开发环境之一。 - **...

    优秀计算机软件实习小结模板.pdf

    这篇实习小结主要涵盖了计算机软件实习的一些核心要点,包括实习的目的、实习地点、实习时间、实习内容以及实习过程中的挑战和解决方法。以下是对这些知识点的详细说明: 1. **实习目的**:实习的主要目标是将所学...

    优秀计算机软件实习小结模板.docx

    在【优秀计算机软件实习小结模板】中,实习地点是深圳市百盛佳信息咨询有限公司,实习时间为20__年12月5日至20__年4月5日。实习内容涉及Java软件开发,这是一种广泛使用的编程语言,尤其适合构建企业级应用。在实习...

    JAVA WEB典型模块与项目实战大全

    1.5 小结  第2章 myedipse开发工具对各种框架的支持  2.1 使用jsp的两种模式  2.2 struts框架的实现  2.3 hibernate框架的实现  2.4 jpa框架的实现  2.5 spring框架的实现  2.6 jsf框架的实现  2.7...

    J2EE开发架构小结.doc

    本文将根据《J2EE开发架构小结》的文件内容,深入探讨J2EE开发架构的多种实现方式,以及每种架构的特点和应用场景。 ### 宏观架构视角 在宏观层面,J2EE架构遵循分层原则,通常分为表现层、业务层、访问层和资源层...

    IBatisNet开发使用小结[收集].pdf

    IBatisNet源自Java版本的iBATIS,是一个轻量级的数据访问框架。它提供了一种灵活的数据持久化方式,通过SQL映射文件将对象与SQL语句关联,实现了SQL与代码的解耦,降低了数据库操作的复杂性。IBatisNet包含两个主要...

    Spring in Action(第2版)中文版

    目录 第一部分spring的核心 第1章开始spring之旅 1.1spring是什么 1.2开始spring之旅 1.3理解依赖注入 ...1.5小结 ...2.6小结 ...3.7小结 ...4.6小结 ...5.6spring和ibatis ...5.6.1配置ibatis客户模板 ...b.4小结

    Spring in Action(第二版 中文高清版).part2

    第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP ...B.4 小结

Global site tag (gtag.js) - Google Analytics