• 周蓬安.blog的博客—强国博客—人民网 2019-05-10
  • 紫光阁中共中央国家机关工作委员会 2019-05-10
  • 感触名家笔下的端午文化吃香粽原来可以这样文艺 2019-05-09
  • 追梦夺冠游行嘲讽詹皇 百万人面前穿订制T恤羞辱他 2019-04-27
  • 《瘟疫传说》:黑死病恐怖 姐弟在绝望中求生 2019-04-10
  • 陕西国防工业职业技术学院百名大学生志愿者敬老院慰问孤寡老人陕西国防工业职业技术学院百名大学生志愿者敬老院慰问-陕西教育新闻 2019-04-08
  • 西藏拉萨:新家园 新生活 2019-04-08
  • 尊重和保障宗教信仰自由的中国实践 2019-04-06
  • 一敬泯恩仇 俄罗斯队主帅这个动作太暖了 2019-03-20
  • 四大名著剧组首次同台忆往事 经典影视剧如何铸就? 2018-12-07
  • “天眼”凝望 探秘宇宙 2018-12-07
  • 0

    iBatis基础

    Posted by 撒得一地 on 2016年4月22日 in 杂谈
    国外稳定加速器推荐    Express | Vypr

    iBatis只是一个模板,真正的内容全是数据库

    Datasource,SqlMapClient,Dao

    对于任何一个与数据库打交道的程序来说,DataSource(DriverManager), Driver, Connection, Statement, FetchResult, 基本就理出了脉络。如果需要处理数据库事务,那么就再加上TransactionTemplate和TransactionManager,在TransactionManager中加上Datasource基本就成了。

    Spring配置

    <bean id="dataSource" name="dataSource"
          class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://ip:3306/test?useUnicode=true&characterEncoding=UTF-8"/>
        <property name="username" value="xxx"/>
        <property name="password" value="xxx"/>
        <property name="maxActive" value="20"/>
    </bean>
    <!--sql map -->
    <bean id="sqlMapClient"
         class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
          <property name="configLocation" value="classpath:config/sqlmap/sqlMapConfig.xml"/>
          <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--dao-->
    <bean id="studentDAO" class="me.huachao.dao.StudentDao">
        <property name="sqlMapClient" ref="sqlMapClient"/>
        <!--<property name="sqlMapTransactionTemplate" ref="sqlMapTransactionTemplate"/>-->
    </bean>
    

    mvn依赖

    • commons-dbcp:commons-dbcp,当然也可以用c3p0,点评现在都已经用自己写的一个zebra来代替
    • mysql:mysql-connector-java
    • com.ibatis:ibatis

    SqlMap

    <sqlMap namespace="Student">
        <!-- Use type aliases to avoid typing the full classname every time. -->
        <typeAlias alias="Student" type="me.huachao.entity.StudentEntity"/>
        <!-- Result maps describe the mapping between the columns returned
             from a query, and the class properties.  A result map isn't
             necessary if the columns (or aliases) match to the properties
             exactly. -->
        <resultMap id="StudentMap" class="Student">
            <result property="id" column="Id"/>
            <result property="name" column="Name"/>
            <result property="sex" column="Sex"/>
            <result property="birthday" column="Birthday"/>
            <result property="gpa" column="Gpa"/>
        </resultMap>
        <sql id="allFields">
            Id,
            Name,
            Sex,
            Birthday,
            Gpa
        </sql>
        <!-- Select with no parameters using the result map for Account class. -->
        <select id="selectAllStudents" resultClass="Student">
            select
              <include refid="allFields"/>
            from
              Student
        </select>
        <!-- A simpler select example without the result map.  Note the
             aliases to match the properties of the target result class. -->
        <select id="selectStudentById" parameterClass="int" resultMap="StudentMap">
            select
              <include refid="allFields"/>
            from
              Student
            where
              Id = #id#
        </select>
         <!--Insert example, using the Account parameter class-->
        <insert id="insertStudent" parameterClass="Student">
            insert into Student
            (
                Name,
                Sex,
                Birthday,
                Gpa
            )
            values
            (
                #name#,
                #sex#,
                #birthday#,
                #gpa#
            )
            <selectKey resultClass="int" keyProperty="id">
                SELECT @@IDENTITY
                AS id
            </selectKey>
        </insert>
         <!--Update example, using the Account parameter class-->
        <update id="updateStudent" parameterClass="Student">
            update
                Student
            set
                Name = #name#,
                Birthday = #birthday#,
                Sex = #sex#,
                Gpa = #gpa#
            where
                Id = #id#
        </update>
        <!-- Delete example, using an integer as the parameter class -->
        <delete id="deleteStudentById" parameterClass="int">
            delete from Student where Id = #id#
        </delete>
    </sqlMap>
    

    Dao实现

    public class StudentDao extends SqlMapClientDaoSupport {
    
        public List selectAll() {
            return getSqlMapClientTemplate().queryForList("selectAllStudents");
        }
    
        public StudentEntity selectStudentById(int id) {
            return (StudentEntity) getSqlMapClientTemplate().queryForObject("selectStudentById", id);
        }
    
        public int insertStudent(StudentEntity studentEntity){
            Integer id = (Integer) getSqlMapClientTemplate().insert("insertStudent", studentEntity);
            return id;
        }
    
        public void updateStudent(StudentEntity studentEntity){
            getSqlMapClientTemplate().update("updateStudent", studentEntity);
        }
    
        public void deleteStudent(int id) {
            getSqlMapClientTemplate().delete("deleteStudentById", id);
        }
    
    }
    

    事务(编程方式)

    <!--service-->
    <bean id="studentService" class="me.huachao.service.StudentService">
    </bean>
    
    <!--transaction-->
    <bean id="sqlMapTransactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <bean id="sqlMapTransactionTemplate"
          class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager" ref="sqlMapTransactionManager"/>
    </bean>
    

    注意:一般transaction的逻辑都是写在Service里面,Dao不管transaction

    public class StudentService {
        @Resource
        private StudentDao studentDao;
    
        @Resource
        private TransactionTemplate sqlMapTransactionTemplate;
    
        public int insertWithTransaction(final StudentEntity studentEntity){
            Integer idObj = (Integer) sqlMapTransactionTemplate.execute(new TransactionCallback(){
                public Object doInTransaction(TransactionStatus status){
                    try{
                        int id = studentDao.insertStudent(studentEntity);
                        throw new SQLException();
    //                    return id;
                    } catch (Exception e) {
                        status.setRollbackOnly();
                        return -1;
                    }
                }
            });
            return (idObj!=null)?idObj.intValue():-1;
        }
    }
    

    事务(注解方式)

    • 因为@Transactional需要用到AOP,所以cglib和asm都需要加上*
    • Spring配置文件需要加上 <tx:annotation-driven transaction-manager="sqlMapTransactionManager"/>
    • 具体写code的时候,需要在方法上注明rollbackfor=xxx.class, 默认是只回滚RuntimeException和unchecked Exception的

       

      @Transactional(rollbackFor = SQLException.class)
      public int insertWithTransactionAnnotation(StudentEntity studentEntity) throws SQLException {
          int id = studentDao.insertStudent(studentEntity);
          if (id > 0)
              throw new SQLException();
          return id;
      }
      

    Code

    [email protected]

    原文:https://blog.huachao.me/2015/4/iBatis基础/

    上一篇:

    下一篇:

    相关推荐

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注

    5 + 6 = ?

    网站地图|广东快乐10分开奖直播

    Copyright © 2015-2019 广东快乐10分开奖直播 All rights reserved.
    闽ICP备15015576号-1,版权所有?psz.

  • 周蓬安.blog的博客—强国博客—人民网 2019-05-10
  • 紫光阁中共中央国家机关工作委员会 2019-05-10
  • 感触名家笔下的端午文化吃香粽原来可以这样文艺 2019-05-09
  • 追梦夺冠游行嘲讽詹皇 百万人面前穿订制T恤羞辱他 2019-04-27
  • 《瘟疫传说》:黑死病恐怖 姐弟在绝望中求生 2019-04-10
  • 陕西国防工业职业技术学院百名大学生志愿者敬老院慰问孤寡老人陕西国防工业职业技术学院百名大学生志愿者敬老院慰问-陕西教育新闻 2019-04-08
  • 西藏拉萨:新家园 新生活 2019-04-08
  • 尊重和保障宗教信仰自由的中国实践 2019-04-06
  • 一敬泯恩仇 俄罗斯队主帅这个动作太暖了 2019-03-20
  • 四大名著剧组首次同台忆往事 经典影视剧如何铸就? 2018-12-07
  • “天眼”凝望 探秘宇宙 2018-12-07
  • 排列五走势图带线 重庆老时时彩 体彩重庆百变王牌走势图 598彩票软件 北京赛车和值11是大小 pc蛋蛋幸运在线预测 天津快乐十分走势图 排列三开奖 北京赛车刷水钱技巧 福彩3d试机号出现情况统计 江西多乐彩开奖走势图 吉林时时彩开奖纪录 排列五走势图二元网 中国体彩网36选7 体彩排列五 pk10赛车历史开奖记录