iBatis简单入门教程

iBatis 简介:

iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快。如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了。

官网为:http://www.mybatis.org/

 

搭建iBatis 开发环境:

1 、导入相关的jar 包,ibatis-2.3.0.677.jar 、mysql-connector-java-5.1.6-bin.jar

2 、编写配置文件:

Jdbc 连接的属性文件

总配置文件, SqlMapConfig.xml

关于每个实体的映射文件(Map 文件)

 

Demo 

Student.java:

  1. package org.eztx.cn.entity;
  2. import java.sql.Date;
  3. public class Student {
  4.  // 注意这里需要保证有一个无参构造方法,因为包括Hibernate在内的映射都是使用反射的,如果没有无参构造可能会出现问题
  5.  private int id;
  6.  private String name;
  7.  private Date birthday;
  8.  private float score;
  9.  public int getId() {
  10.   return id;
  11.  }
  12.  public void setId(int id) {
  13.   this.id = id;
  14.  }
  15.  public String getName() {
  16.   return name;
  17.  }
  18.  public void setName(String name) {
  19.   this.name = name;
  20.  }
  21.  public Date getBirthday() {
  22.   return birthday;
  23.  }
  24.  public void setBirthday(Date birthday) {
  25.   this.birthday = birthday;
  26.  }
  27.  public float getScore() {
  28.   return score;
  29.  }
  30.  public void setScore(float score) {
  31.   this.score = score;
  32.  }
  33.  @Override
  34.  public String toString() {
  35.   return “id=” + id + “\tName=” + name + “\tBirthday=” + birthday + “\tScore=”
  36.     + score + “\n”;
  37.  }
  38. }


 

SqlMap.properties :

  1. driver=com.mysql.jdbc.Driver
  2. url=jdbc:mysql://mysql.sql47.cdncenter.net:3306/sq_maenze?useUnicode=true&characterEncoding=UTF-8
  3. username=sq_maenze
  4. password=mez199023

 

Student.xml :

<?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=”org.eztx.cn.entity.Student”/>
<!– 这样以后改了sql,就不需要去改java代码了 –>
<!– id表示select里的sql语句,resultClass表示返回结果的类型 –>
<select id=”selectAllStudent” resultClass=”Student”>
select
*
from
student
</select>

<!– parameterClass表示参数的内容 –>
<!– #表示这是一个外部调用的需要传进的参数,可以理解为占位符 –>
<select id=”selectStudentById” parameterClass=”int” resultClass=”Student”>
select
*
from
student
where
id=#id#
</select>

<!– 注意这里的resultClass类型,使用Student类型取决于queryForList还是queryForObject –>
<select id=”selectStudentByName” parameterClass=”String” resultClass=”Student”>
select
*
from
student
where
`name` like ‘%$name$%’
</select>

<insert id=”addStudent” parameterClass=”Student”>
insert into
student(name,birthday,score)
values
(#name#,#birthday#,#score#)
<selectKey resultClass=”int” type=”post” keyProperty=”id”>
select LAST_INSERT_ID() AS VALUE
<!– 这里需要说明一下不同的数据库主键的生成,对各自的数据库有不同的方式: –>
<!– mysql:SELECT LAST_INSERT_ID() AS VALUE –>
<!– mssql:select @@IDENTITY as value –>
<!– oracle:SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL –>
<!– 还有一点需要注意的是不同的数据库生产商生成主键的方式不一样,有些是预先生成 (pre-generate)主键的,如Oracle和PostgreSQL。
有些是事后生成(post-generate)主键的,如MySQL和SQL Server。所以如果是Oracle数据库,则需要将selectKey写在insert之前
预先的情况下type为pre,否则为post
–>
</selectKey>
</insert>

<delete id=”deleteStudentById” parameterClass=”int”>
<!– #id#里的id可以随意取,但是上面的insert则会有影响,因为上面的name会从Student里的属性里去查找 –>
<!– 我们也可以这样理解,如果有#占位符,则ibatis会调用parameterClass里的属性去赋值 –>
delete from
student
where
id=#id#
</delete>

<update id=”updateStudent” parameterClass=”Student”>
update
student
set
name=#name#,birthday=#birthday#,score=#score#
where
id=#id#
</update>
</sqlMap>

 

说明:

如果xml 中没有ibatis 的提示,则window –> Preference–> XML–>XML Catalog—> 点击add

选择uri URI: 请选择本地文件系统上

iBatisDemo1/WebContent/WEB-INF/lib/sql-map-config-2.dtd 文件;

Key Type: 选择Schema Location;

Key: 需要联网的,不建议使用;

 

SqlMapConfig.xml :

<?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>
<!– 引用JDBC属性的配置文件 –>
<properties resource=”org/eztx/cn/xml/SqlMap.properties”/>

<!– 使用JDBC的事务管理 –>
<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=”org/eztx/cn/xml/Student.xml”/>
</sqlMapConfig>

 

StudentDao :

  1. package org.eztx.cn.services;
  2. import java.util.List;
  3. import org.eztx.cn.entity.Student;
  4. public interface StudentDao {
  5.  /**
  6.   * 添加学生信息
  7.   *
  8.   * @param student
  9.   *            学生实体
  10.   * @return 返回是否添加成功
  11.   */
  12.  public boolean addStudent(Student student);
  13.  /**
  14.   * 根据学生id删除学生信息
  15.   *
  16.   * @param id
  17.   *            学生id
  18.   * @return 删除是否成功
  19.   */
  20.  public boolean deleteStudentById(int id);
  21.  /**
  22.   * 更新学生信息
  23.   *
  24.   * @param student
  25.   *            学生实体
  26.   * @return 更新是否成功
  27.   */
  28.  public boolean updateStudent(Student student);
  29.  /**
  30.   * 查询全部学生信息
  31.   *
  32.   * @return 返回学生列表
  33.   */
  34.  public List<Student> selectAllStudent();
  35.  /**
  36.   * 根据学生姓名模糊查询学生信息
  37.   *
  38.   * @param name
  39.   *            学生姓名
  40.   * @return 学生信息列表
  41.   */
  42.  public List<Student> selectStudentByName(String name);
  43.  /**
  44.   * 根据学生id查询学生信息
  45.   *
  46.   * @param id
  47.   *            学生id
  48.   * @return 学生对象
  49.   */
  50.  public Student selectStudentById(int id);
  51. }


StudentDaoImpl :

  1. package org.eztx.cn.services.impl;
  2. import java.io.IOException;
  3. import java.io.Reader;
  4. import java.sql.SQLException;
  5. import java.util.List;
  6. import org.eztx.cn.entity.Student;
  7. import org.eztx.cn.services.StudentDao;
  8. import com.ibatis.common.resources.Resources;
  9. import com.ibatis.sqlmap.client.SqlMapClient;
  10. import com.ibatis.sqlmap.client.SqlMapClientBuilder;
  11. public class StudentDaoImpl implements StudentDao {
  12.  private static SqlMapClient sqlMapClient = null;
  13.  // 读取配置文件
  14.  static {
  15.   try {
  16.    Reader reader = Resources
  17.      .getResourceAsReader(“org/eztx/cn/xml/SqlMapConfig.xml”);
  18.    sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
  19.    reader.close();
  20.   } catch (IOException e) {
  21.    e.printStackTrace();
  22.   }
  23.  }
  24.  public boolean addStudent(Student student) {
  25.   Object object = null;
  26.   boolean flag = false;
  27.   try {
  28.    object = sqlMapClient.insert(“addStudent”, student);
  29.    System.out.println(“添加学生信息的返回值:” + object);
  30.   } catch (SQLException e) {
  31.    e.printStackTrace();
  32.   }
  33.   if (object != null) {
  34.    flag = true;
  35.   }
  36.   return flag;
  37.  }
  38.  public boolean deleteStudentById(int id) {
  39.   boolean flag = false;
  40.   Object object = null;
  41.   try {
  42.    object = sqlMapClient.delete(“deleteStudentById”, id);
  43.    System.out.println(“删除学生信息的返回值:” + object + “,这里返回的是影响的行数”);
  44.   } catch (SQLException e) {
  45.    e.printStackTrace();
  46.   }
  47.   if (object != null) {
  48.    flag = true;
  49.   }
  50.   return flag;
  51.  }
  52.  public boolean updateStudent(Student student) {
  53.   boolean flag = false;
  54.   Object object = false;
  55.   try {
  56.    object = sqlMapClient.update(“updateStudent”, student);
  57.    System.out.println(“更新学生信息的返回值:” + object + “,返回影响的行数”);
  58.   } catch (SQLException e) {
  59.    e.printStackTrace();
  60.   }
  61.   if (object != null) {
  62.    flag = true;
  63.   }
  64.   return flag;
  65.  }
  66.  public List<Student> selectAllStudent() {
  67.   List<Student> students = null;
  68.   try {
  69.    students = sqlMapClient.queryForList(“selectAllStudent”);
  70.   } catch (SQLException e) {
  71.    e.printStackTrace();
  72.   }
  73.   return students;
  74.  }
  75.  public List<Student> selectStudentByName(String name) {
  76.   List<Student> students = null;
  77.   try {
  78.    students = sqlMapClient.queryForList(“selectStudentByName”, name);
  79.   } catch (SQLException e) {
  80.    e.printStackTrace();
  81.   }
  82.   return students;
  83.  }
  84.  public Student selectStudentById(int id) {
  85.   Student student = null;
  86.   try {
  87.    student = (Student) sqlMapClient.queryForObject(
  88.      “selectStudentById”, id);
  89.   } catch (SQLException e) {
  90.    e.printStackTrace();
  91.   }
  92.   return student;
  93.  }
  94. }


 

TestIbatis.java :

  1. package org.eztx.cn;
  2. import java.sql.Date;
  3. import java.util.List;
  4. import org.eztx.cn.entity.Student;
  5. import org.eztx.cn.services.impl.StudentDaoImpl;
  6. public class testMyBatis {
  7.  public static void main(String[] args) {
  8.   //add();
  9.   //delete();
  10.   select();
  11.   // update();
  12.  }
  13.  /**
  14.   * 添加
  15.   */
  16.  private static void add() {
  17.   StudentDaoImpl studentDaoImpl = new StudentDaoImpl();
  18.   System.out.println(“==============================”);
  19.   System.out.println(“测试插入”);
  20.   Student addStudent = new Student();
  21.   addStudent.setName(“李四”);
  22.   addStudent.setBirthday(Date.valueOf(“2011-09-02”));
  23.   addStudent.setScore(88);
  24.   System.out.println(studentDaoImpl.addStudent(addStudent));
  25.   System.out.println(“==============================”);
  26.   System.out.println(“测试根据id查询”);
  27.   System.out.println(studentDaoImpl.selectStudentById(1));
  28.   System.out.println(“==============================”);
  29.   System.out.println(“测试模糊查询”);
  30.   List<Student> mohuLists = studentDaoImpl.selectStudentByName(“李”);
  31.   for (Student student : mohuLists) {
  32.    System.out.println(student);
  33.   }
  34.  }
  35.  /**
  36.   * 删除
  37.   */
  38.  private static void delete() {
  39.   StudentDaoImpl studentDaoImpl = new StudentDaoImpl();
  40.   System.out.println(“根据id删除学生信息”);
  41.   System.out.println(studentDaoImpl.deleteStudentById(1));
  42.  }
  43.  /**
  44.   * 更新
  45.   */
  46.  private static void update() {
  47.   StudentDaoImpl studentDaoImpl = new StudentDaoImpl();
  48.   System.out.println(“测试更新学生信息”);
  49.   Student updateStudent = new Student();
  50.   updateStudent.setId(1);
  51.   updateStudent.setName(“李四1”);
  52.   updateStudent.setBirthday(Date.valueOf(“2011-08-07”));
  53.   updateStudent.setScore(21);
  54.   System.out.println(studentDaoImpl.updateStudent(updateStudent));
  55.  }
  56.  /**
  57.   * 查询
  58.   */
  59.  private static void select() {
  60.   StudentDaoImpl studentDaoImpl = new StudentDaoImpl();
  61.   System.out.println(“测试查询所有”);
  62.   List<Student> students = studentDaoImpl.selectAllStudent();
  63.   for (Student student : students) {
  64.    System.out.println(student);
  65.   }
  66.  }
  67. }