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

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 学习小结笔记

    ibatis 组件 , 用于访问数据库 ibatis 基于O-R mapping 映射

    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 生产效率 ...

    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 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...

    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 小结

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

    第一部分 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 小结

    MyBatis持久层框架的用法知识小结

    MyBatis 本是apache的一个开源项目iBatis,接下来通过本文给大家介绍MyBatis持久层框架的用法知识小结,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧

    spring in action英文版

    第一部分 Spring基础  第1章 开始Spring之旅  1.1 为什么使用Spring  1.1.1 J2EE开发者的一天  1.1.2 Spring的承诺  1.2 Spring是什么 ... 1.7 小结 ... 2.5 小结 ... 3.7 小结 ... 11.6 小结

    面向对象设计 PPT

    主要讲的ssi框架,MVC对于我们来说,已经不陌生了,它起源于20世纪80年代针对smalltalk语言的一种软件设计模式,...由于最近用了一次SSI框架,因此本文主要是对Strtus2、Spring、iBatis三个开源的MVC框架进行一个小结。

    Spring-Reference_zh_CN(Spring中文参考手册)

    14.5.2. 小结 14.6. 文档视图(PDF/Excel) 14.6.1. 简介 14.6.2. 配置和安装 14.6.2.1. 文档视图定义 14.6.2.2. Controller 代码 14.6.2.3. Excel视图子类 14.6.2.4. PDF视图子类 14.7. JasperReports 14.7.1. 依赖...

    spring chm文档

    14.5.2. 小结 14.6. 文档视图(PDF/Excel) 14.6.1. 简介 14.6.2. 配置和安装 14.7. JasperReports 14.7.1. 依赖的资源 14.7.2. 配置 14.7.3. 构造ModelAndView 14.7.4. 使用子报表 14.7.5. 配置Exporter的...

    Spring 2.0 开发参考手册

    14.5.2. 小结 14.6. 文档视图(PDF/Excel) 14.6.1. 简介 14.6.2. 配置和安装 14.7. JasperReports 14.7.1. 依赖的资源 14.7.2. 配置 14.7.3. 构造ModelAndView 14.7.4. 使用子报表 14.7.5. 配置Exporter的...

    Spring中文帮助文档

    14.5.2. 小结 14.6. 文档视图(PDF/Excel) 14.6.1. 简介 14.6.2. 配置和安装 14.7. JasperReports 14.7.1. 依赖的资源 14.7.2. 配置 14.7.3. 构造ModelAndView 14.7.4. 使用子报表 14.7.5. 配置Exporter的...

    Spring API

    14.5.2. 小结 14.6. 文档视图(PDF/Excel) 14.6.1. 简介 14.6.2. 配置和安装 14.7. JasperReports 14.7.1. 依赖的资源 14.7.2. 配置 14.7.3. 构造ModelAndView 14.7.4. 使用子报表 14.7.5. 配置Exporter的...

Global site tag (gtag.js) - Google Analytics