• iBatis入手案例


    第一部分,iBatis组织架构分析

    1.1 组织架构图

    1.2 架构分析

    DAO层上面,DAO类通过SqlMapConfig文件,来构建iBatis提供的SqlMapClient,SqlMapConfig文件的作用就是:将操作行为以iBatis约定的方式配置到文件中;由iBatis提供的解析类SqlMapClientBuilder来进行解析并构建出SqlMapClient对象,如下所示:

    应用层通过SqlMapClient对象来执行之前通过配置文件定义的操作;所以iBatis沿用的是Java第三方框架 一贯沿用的"面向配置"的思路。

    iBatis处理提供了一个对象用来执行操作,使得操作更加集中,提高了工作效率之外,还做了一件更重要的事情,就是实现了和DTO互操作,也是就是O/R Mapping。这里的提到了"互操作"是指:iBatis接收DTO的形式作为参数容器,底层采用反射的方式根据命名进行参数映射;另一方面iBatis可以将(查询)结果自动映射到指定的DTO中。

    第二部分,入手案例

    1. 创建数据表

    创建数据库表,入手案例为链接Mysql,sql如下:

    DROP TABLE IF EXISTS `tbl_student`;

    CREATE TABLE `tbl_student` (

    `id` int(11) NOT NULL AUTO_INCREMENT,

    `name` varchar(100) DEFAULT NULL,

    `score` float DEFAULT NULL,

    `birth` date DEFAULT NULL,

    PRIMARY KEY (`id`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    1. 创建DTO:

    import java.sql.Date;

     

    public class Student {

        private int id;

        private String name;

        private float score;

        private Date birth;

        private int getId() {

            return id;

        }

     

        private void setId(int id) {

            this.id = id;

        }

     

        private String getName() {

            return name;

        }

     

        private void setName(String name) {

            this.name = name;

        }

     

        private float getScore() {

            return score;

        }

     

        private void setScore(float score) {

            this.score = score;

        }

     

        private Date getBirth() {

            return birth;

        }

     

        private void setBirth(Date birth) {

            this.birth = birth;

        }

    }

    1. 创建一个Dao接口

    创建一个Dao接口,里面定义了Dao操作;

    import java.util.List;

     

    public interface StudentDao {

        public void createStudent(Student pStudent);

     

        public void updateStudent(Student pStudent);

     

        public void deleteStudent(int pStudentId);

     

        public List<Student> selectAllStudent();

    }

    1. 创建DaoImpl

    创建核心数据访问层,DaoImpl

     

    public class StudentDaoImpl implements StudentDao {

        private static SqlMapClient sqlMapClient = null;

        static{

            try {

                Reader reader = Resources.getResourceAsReader("iBatis/Demo/SqlMapConfig.xml");

                sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);

                reader.close();

            } catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

        @Override

        public void createStudent(Student pStudent) {

            try {

                Object ret = sqlMapClient.insert("insertStudent", pStudent);

                System.out.println("Add student return value: " + ret);

            } catch (SQLException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

     

        @Override

        public void updateStudent(Student pStudent) {

            try {

                Object ret = sqlMapClient.update("updateStudent", pStudent);

     

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

     

        @Override

        public void deleteStudent(int pStudentId) {

            try {

                Object ret = sqlMapClient.delete("deleteStudent", pStudentId);

                System.out.println("delete Student return value: " + ret);

            } catch (SQLException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

        @Override

        public List<Student> selectAllStudent() {

            try {

                List<Student> stus = sqlMapClient.queryForList("getAllStudent");

                System.out.println("Get All student Count(s): " + stus.size());

            } catch (SQLException e) {

                e.printStackTrace();

            }

            return null;

        }

    1. 创建配置sqlMapConfig

    config文件中在iBatis里面扮演着一个头文件的角色,里面定义了对于jdbc资源文件(Propertiesresource属性)的引用以及框架中需要加载的包含SQLDAO的文件(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>

    <properties resource="myibatis/study/SqlMap.properties"/>

    <transactionManager type="JDBC">

    <dataSource type="SIMPLE">

    <property name="JDBC.Driver" value="${driver}" />

    <property name="JDBC.ConnectionURL" value="${url}" />

    <property name="JDBC.Username" value="${username}" />

    <property name="JDBC.Password" value="${password}" />

    </dataSource>

    </transactionManager>

    <sqlMap resource="myibatis/study/Student.xml" />

    </sqlMapConfig>

    1. 创建关联的Properties文件

    driver=com.mysql.jdbc.Driver

    url=jdbc:mysql://localhost:3306/test

    username=root

    password=root

    1. 创建关联的DAO文件

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

    <!-- 通过typeAlias使得我们在下面使用Student实体类的时候不需要写包名 -->

    <typeAlias alias="Student" type="iBatis.Demo.Student" />

    <!-- 这样以后改了sql,就不需要去改java代码了 -->

    <!-- id表示select里的sql语句,resultClass表示返回结果的类型 -->

    <select id="selectAllStudent" resultClass="Student">

    select * from

    tbl_student

    </select>

    <!-- 注意这里的resultClass类型,使用Student类型取决于queryForList还是queryForObject -->

    <select id="selectStudentByName" parameterClass="String"

    resultClass="Student">

    select name,birth,score from tbl_student where name like

    '%$name$%'

    </select>

    <insert id="insertStudent" parameterClass="Student">

    insert into

    tbl_student(name,birth,score) values

    (#name#,#birth#,#score#)

    <!--<selectKey resultClass="int" keyProperty="id">

    select @@identity as inserted

    这里需要说明一下不同的数据库主键的生成,对各自的数据库有不同的方式: -->

    <!-- mysql:SELECT LAST_INSERT_ID() AS VALUE -->

    <!-- mssql:select @@IDENTITY as value -->

    <!-- oracle:SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL -->

    <!-- 还有一点需要注意的是不同的数据库生产商生成主键的方式不一样,有些是预先生成 (pre-generate)主键的,如OraclePostgreSQL

    有些是事后生成(post-generate)主键的,如MySQLSQL Server 所以如果是Oracle数据库,则需要将selectKey写在insert之前

    </selectKey> -->

    </insert>

    <delete id="deleteStudent" parameterClass="int">

    <!-- #id#里的id可以随意取,但是上面的insert则会有影响,因为上面的name会从Student里的属性里去查找 -->

    <!-- 我们也可以这样理解,如果有#占位符,则ibatis会调用parameterClass里的属性去赋值 -->

    delete from tbl_student where id=#id#

    </delete>

    <update id="updateStudent" parameterClass="Student">

    update tbl_student set

    name=#name#,birth=#birth#,score=#score# where id=#id#

    </update>

    </sqlMap>

    1. 测试入口

    创建Main函数进行测试:

    public class StudentEntry {

        public static void main(String[] args) {

            StudentDaoImpl dao = new StudentDaoImpl();

            Student s = new Student();

            s.setName("Lorry");

            s.setScore(99);

            dao.createStudent(s);

            dao.deleteStudent(1);

        }

    }

     

    调试后记:

    "在处理指令目标和数据之间需要有空格",报的异常地方是"SqlMapConfig.xml"文件,但是其实是因为ibastis会校验config的xml文件节点中sqlMap节点文件关联到的资源文件DAO的xml。这里也是在讲述对于第三方应用工具调试的思路:很多时候报错不是在报错出,还可能是报错处所引用到的深层内内容,你所看到的问题,可能"水很深"。

  • 相关阅读:
    WPFlog4net学习笔记(一)
    C#比较两个List是否相同_SequenceEqual
    01.HTML基础
    startActivityForResult()被标注弃用,推荐使用registerForActivityResult()方法
    02.Android项目介绍
    07.活动的生命周期
    03.活动Activity
    06.通过意图传递数据
    04.Toast、Menu、销毁活动
    05.显式意图、隐式意图
  • 原文地址:https://www.cnblogs.com/xiashiwendao/p/4278251.html
Copyright © 2020-2023  润新知