zoukankan      html  css  js  c++  java
  • ibatis轻松入门

      近日,由于公司项目应用开发的逻辑层使用的是iBatis。上网查了些资料,自己写了点demo入门。感觉良好。iBatis实在是比Hibernate很容易入门,贡献出来与各路菜鸟分享(后文附源码),希望得到大神指教。转载请保留本文出处:http://itred.cnblogs.com ; 作者:itRed

      ORM框架中操作数据库的逻辑层中,Hibernate和iBatis相对来说是比较受欢迎的。Hibernate是“全自动”的,能够完全生成SQL语句;而iBatis是“半自动化”的,需要程序员根据自己的应用程序写相应的SQL语句。但是,在实际的开发过程中还是应根据实际情况进行选择。(iBatis的优缺点比较)

                                                       优点                                              缺点

    与JDBC相比减少了很多的代码量;入门简单;架构级性能较强;

    Sql语句和程序代码的分离;简化项目中的分工;

    增强了移植性。

    Sql语句需要程序员自己写;

    参数数量只能一个,但是如果需要多个参数时,

    需要将参数打包封装成Map等;

     

      

     

     在进行iBatis应用程序开发之前首先需要对iBatis这个技术有一定的了解。iBatis是apache下的一个开源项目,因为其小巧,上手很快深受程序员的喜爱。iBatis的核心是SqlMap。

      本案例将详细介绍iBatis操作MySQL数据库。 利用iBatis对数据库中的记录进行简单的增删改查操作。测试方法main,显示结果到控制台。部分结果直接查看数据库信息。虽然demo比较简单,但是很能起到抛砖引玉的作用。

      数据准备:

    数据库名称:ibatis

    表名称:student

     

    本人数据库中的数据信息:

    案例解析及源码:

    在正式操作数据库之前需要做一些准备工作,部分备注详见源码注释中:

    首先需要导入ibatis的相关jar包,以及连接数据库的驱动jar包;在新建的项目文件下建一个Student的实体Bean。

    package com.red;
    
    import java.util.Date;
    /**
     * Student实体类
     * @author Red
     *
     */
    public class Student {
    //保证一个无参数方法。反射机制
        private int sid=0;
        private String sname=null;
        private String major=null;
        private Date birth=null;
        private int score=0;
        
        public int getSid() {
            return sid;
        }
        public void setSid(int sid) {
            this.sid = sid;
        }
        public String getSname() {
            return sname;
        }
        public void setSname(String sname) {
            this.sname = sname;
        }
        public String getMajor() {
            return major;
        }
        public void setMajor(String major) {
            this.major = major;
        }
        public Date getBirth() {
            return birth;
        }
        public void setBirth(Date birth) {
            this.birth = birth;
        }
        public int getScore() {
            return score;
        }
        public void setScore(int score) {
            this.score = score;
        }
        @Override
        public String toString() { //重写toString方法,方便控制台显示
            String content="sid="+sid+"	sname:"+sname+"	major:"+major+"	birth:"+birth+"	score:"+score;
            return content;
        }
        
    }
    Student.java

    建一个接口以及它的实现类,为了测试方便直接将main方法放到该接口实现类中;

    package com.red;
    
    import java.util.List;
    /**
     * 接口
     * @author Red
     *
     */
    public interface IStudentDAO {
        public void addStudent(Student student);
        public void deleteStudentById(int id);
        public void updateStudentById(Student studnet);
        public List<Student> queryAllStudent();
        public List<Student> queryStudentByName(String name);
        public Student queryStudentById(int id);
    }
    IStudentDAO
    package com.red;
    
    import java.io.Reader;
    import java.sql.SQLException;
    import java.util.List;
    
    import com.ibatis.common.resources.Resources;
    import com.ibatis.sqlmap.client.SqlMapClient;
    import com.ibatis.sqlmap.client.SqlMapClientBuilder;
    
    public class IStudentDAOImpl implements IStudentDAO {
    
        private static SqlMapClient sqlMapClient=null;
        static{
            try{
            Reader reader=Resources.getResourceAsReader("com/red/SqlMapConfig.xml");
            sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
            reader.close();
        }catch (Exception e) {
            e.printStackTrace();
        }
        }
        
        public void addStudent(Student student) {
            try {
                sqlMapClient.insert("insertStudent", student);
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
        }
    
        public void deleteStudentById(int id) {
            try {
                sqlMapClient.delete("deleteStudentById",id);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
        public List<Student> queryAllStudent() {
            List<Student>     studentList=null;;
            try {
                studentList=sqlMapClient.queryForList("selectAllStudent");
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return studentList;
        }
    
        public Student queryStudentById(int id) {
            Student student=null;
            try {
                student=(Student) sqlMapClient.queryForObject("selectStudentById",id);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return student;
        }
    
        /**
         * 模糊查询
         */
        public List<Student> queryStudentByName(String name) {
            List<Student> studentList=null;
            try {
                studentList=sqlMapClient.queryForList("selectStudentByName", name);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return studentList;
        }
    
        public void updateStudentById(Student student) {
            try {
                sqlMapClient.update("updateStudentById", student);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            
        }
    
        public static void main(String[] args) {
            IStudentDAO dao=new IStudentDAOImpl();
            /**
             * 查询所有的学生对象*/
            for(Student student:dao.queryAllStudent()){//遍历student对象
                System.out.println(student);
            }
            
            /**
             * 查询指定id的学生对象
            Student student=dao.queryStudentById(1);
            System.out.println(student);
            //以上两行代码可缩写为:
            System.out.println(dao.queryStudentById(1));
            */
            
            /**
             * 插入学生对象数据
            Student student=new Student();
            student.setSid(3);
            student.setSname("小明");
            student.setMajor("应用化学");
            student.setBirth(Date.valueOf("2013-09-09"));
            student.setScore(88);
            dao.addStudent(student);
            */
            
            /**
             * 删除指定id的学生数据
            dao.deleteStudentById(1);
            */
            
            /**
             * 修改数据对象
            
            Student student=new Student();
            student.setSid(3);
            student.setSname("朱小明");
            student.setMajor("嵌入式开发");
            student.setBirth(Date.valueOf("2013-09-09"));
            student.setScore(68);
            dao.updateStudentById(student);
             */
            
            /**
             * 模糊查询
             
            for(Student student:dao.queryStudentByName("t")){
                System.out.println(student);
            }
            */
        }
    }
    IStudentDAOImpl

    建立一个SqlMap.properties的文件,该属性文件主要负责数据库的链接

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/ibatis
    username=root
    password=123456
    SqlMap.properies

    建立一个SqlMapConfig.xml文件,主要负责ibatis的配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE sqlMapConfig 
            PUBLIC "-//ibatis.apache.org//DTD SQLL Map Config 2.0//EN"
            "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
            
    <sqlMapConfig>
        <properties resource="com/red/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="com/red/Student.xml"/>
    </sqlMapConfig>
    SqlMapConfig.xml

    建立实体类的映射文件(SQL语句就在其中)

    <?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 alias="student" type="com.red.Student"/>
        <!-- 配置表和实体之间的映射关系 -->
        <resultMap class="com.red.Student" id="student">
            <result property="sname" column="SNAME"/>
            <result property="major" column="MAJOR"/>
            <result property="birth" column="BIRTH"/>
            <result property="score" column="SCORE"/>
        </resultMap>
        
        <select id="selectAllStudent" resultClass="student">
            SELECT SID,SNAME,MAJOR,BIRTH,SCORE FROM `ibatis`.`student`
        </select>
        
        <select id="selectStudentById" parameterClass="int" resultClass="student">
            SELECT SID,SNAME,MAJOR,BIRTH,SCORE FROM `ibatis`.`student`
            WHERE SID=#sid#
        </select>
        
        <insert id="insertStudent" parameterClass="student">
            INSERT INTO `ibatis`.`student`(SID,SNAME,MAJOR,BIRTH,SCORE)
            values(#sid#,#sname#,#major#,#birth#,#score#)
        </insert>
        
        <delete id="deleteStudentById" parameterClass="int">
            DELETE FROM `ibatis`.`student`
            WHERE sid=#sid#
        </delete>
        
        <update id="updateStudentById" parameterClass="student">
            UPDATE `ibatis`.`student` SET
            SNAME=#sname#,MAJOR=#major#,BIRTH=#birth#,SCORE=#score#
            WHERE sid=#sid#
        </update>
        
        <select id="selectStudentByName" parameterClass="String" resultClass="student">
            SELECT SID,SNAME,MAJOR,BIRTH,SCORE FROM `ibatis`.`student`
            WHERE SNAME LIKE '%$sname$%'
        </select>
    </sqlMap>
    Student.xml

     

     ibatis查询数据库所有数据(重点解析本查询案例,另外的几个操作很简单,源码附注释,很容易看懂。不懂可以Email我。)

    1 public List<Student> queryAllStudent() {
    2         List<Student>     studentList=null;;
    3         try {
    4             studentList=sqlMapClient.queryForList("selectAllStudent");
    5         } catch (SQLException e) {
    6             e.printStackTrace();
    7         }
    8         return studentList;
    9     }

    Student中的SQL语句:

    前几日刚在公司学到的经验,程序员在写SQL语句中的字段和关键字时尽量大写,显得专业,而且提高数据库的查询效率。

    <select id="selectAllStudent" resultClass="student">
            SELECT SID,SNAME,MAJOR,BIRTH,SCORE FROM `ibatis`.`student`
        </select>

    Main方法中的测试代码:

    IStudentDAO dao=new IStudentDAOImpl();
    for(Student student:dao.queryAllStudent()){//遍历student对象
                System.out.println(student);
            }

     

    运行结果:

    iBatis 模糊查询

    iBatis 添加数据记录

    iBatis 修改数据记录

    iBatis 删除数据记录

    这些操作都可以依葫芦画瓢,后文附本DEMO的源码,欢迎各位来邮交流学习心得。E-mail: it_red@sina.com

    测试时,只需要去除要运行部分的注释。右击测试main方法就可顺利在控制台看到运行结果。

    本文源码下载链接

       作者:itRed
       出处:http://itred.cnblogs.com
       版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段说明,且在文章明显位置给出原文链接,否则保留追究法律责任的权利。

     

  • 相关阅读:
    html知识点
    BFC的布局规则以及触发条件
    父元素与子元素之间的margin-top问题(css hack)
    加overflow-hidden就可以解决高度塌陷问题,overflow-触发BFC
    子元素margin-top为何会影响父元素?
    子div设置margin-top使得父div也跟着向下移动
    vue 之 mongodb安装问题
    vue 之 nginx原理(webpack环境下配置)
    vue 之 PC端项目配置
    ASP.NET CORE (一)
  • 原文地址:https://www.cnblogs.com/itred/p/3947038.html
Copyright © 2011-2022 走看看