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+"\tsname:"+sname+"\tmajor:"+major+"\tbirth:"+birth+"\tscore:"+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
   版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段说明,且在文章明显位置给出原文链接,否则保留追究法律责任的权利。

 

posted on 2014-08-30 22:29  itRed  阅读(1120)  评论(4编辑  收藏  举报

导航