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对象进行了赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值