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:


package com.iflytek.entity;


import java.sql.Date;

/**

* @author xudongwang 2011-12-31

*

* Email:xdwangiflytek@gmail.com

*

*/

public class Student {

// 注意这里需要保证有一个无参构造方法,因为包括Hibernate在内的映射都是使用反射的,如果没有无参构造可能会出现问题

private int id;

private String name;

private Date birth;

private float score;


public int getId() {

    return id;

}


public void setId(int id) {

    this.id = id;

}


public String getName() {

    return name;

}


public void setName(String name) {

    this.name = name;

}


public Date getBirth() {

    return birth;

}


public void setBirth(Date birth) {

    this.birth = birth;

}


public float getScore() {

    return score;

}


public void setScore(float score) {

    this.score = score;

}


@Override

public String toString() {

    return "id=" + id + "\tname=" + name + "\tmajor=" + birth + "\tscore="

    + score + "\n";

}


}

 


SqlMap.properties :


driver=com.mysql.jdbc.Driver

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

username=root

password=123

 


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="com.iflytek.entity.Student" />


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

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

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

select * from

tbl_student

</select>


<!-- parameterClass表示参数的内容 -->

<!-- #表示这是一个外部调用的需要传进的参数,可以理解为占位符 -->

<select id="selectStudentById" parameterClass="int" resultClass="Student">

select * from tbl_student where id=#id#

</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="addStudent" 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)主键的,如Oracle和PostgreSQL。

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

</selectKey>

</insert>


<delete id="deleteStudentById" 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>

 

说明:

如果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="com/iflytek/entity/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="com/iflytek/entity/Student.xml" />

</sqlMapConfig>

 

StudentDao 

package com.iflytek.dao;


import java.util.List;


import com.iflytek.entity.Student;


/**

* @author xudongwang 2011-12-31

*

* Email:xdwangiflytek@gmail.com

*

*/

public interface StudentDao {

/**

* 添加学生信息

*

* @param student

* 学生实体

* @return 返回是否添加成功

*/

public boolean addStudent(Student student);

/**

* 根据学生id删除学生信息

*

* @param id

* 学生id

* @return 删除是否成功

*/

public boolean deleteStudentById(int id);

/**

* 更新学生信息

*

* @param student

* 学生实体

* @return 更新是否成功

*/

public boolean updateStudent(Student student);

/**

* 查询全部学生信息

*

* @return 返回学生列表

*/

public List<Student> selectAllStudent();

/**

* 根据学生姓名模糊查询学生信息

*

* @param name

* 学生姓名

* @return 学生信息列表

*/

public List<Student> selectStudentByName(String name);

/**

* 根据学生id查询学生信息

*

* @param id

* 学生id

* @return 学生对象

*/

public Student selectStudentById(int id);

}

StudentDaoImpl 

  1. package com.iflytek.daoimpl;


  2. import java.io.IOException;

  3. import java.io.Reader;

  4. import java.sql.SQLException;

  5. import java.util.List;


  6. import com.ibatis.common.resources.Resources;

  7. import com.ibatis.sqlmap.client.SqlMapClient;

  8. import com.ibatis.sqlmap.client.SqlMapClientBuilder;

  9. import com.iflytek.dao.StudentDao;

  10. import com.iflytek.entity.Student;


  11. /**

  12. * @author xudongwang 2011-12-31

  13. *

  14. * Email:xdwangiflytek@gmail.com

  15. *

  16. */

  17. public class StudentDaoImpl implements StudentDao {


  18. private static SqlMapClient sqlMapClient = null;


  19. // 读取配置文件

  20. static {

  21. try {

  22. Reader reader = Resources

  23. .getResourceAsReader("com/iflytek/entity/SqlMapConfig.xml");

  24. sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);

  25. reader.close();

  26. catch (IOException e) {

  27. e.printStackTrace();

  28. }

  29. }


  30. public boolean addStudent(Student student) {

  31. Object object = null;

  32. boolean flag = false;

  33. try {

  34. object = sqlMapClient.insert("addStudent", student);

  35. System.out.println("添加学生信息的返回值:" + object);

  36. catch (SQLException e) {

  37. e.printStackTrace();

  38. }

  39. if (object != null) {

  40. flag = true;

  41. }

  42. return flag;

  43. }


  44. public boolean deleteStudentById(int id) {

  45. boolean flag = false;

  46. Object object = null;

  47. try {

  48. object = sqlMapClient.delete("deleteStudentById", id);

  49. System.out.println("删除学生信息的返回值:" + object + ",这里返回的是影响的行数");

  50. catch (SQLException e) {

  51. e.printStackTrace();

  52. }

  53. if (object != null) {

  54. flag = true;


  55. }

  56. return flag;


  57. }


  58. public boolean updateStudent(Student student) {

  59. boolean flag = false;

  60. Object object = false;

  61. try {

  62. object = sqlMapClient.update("updateStudent", student);

  63. System.out.println("更新学生信息的返回值:" + object + ",返回影响的行数");

  64. catch (SQLException e) {

  65. e.printStackTrace();

  66. }

  67. if (object != null) {

  68. flag = true;

  69. }

  70. return flag;

  71. }


  72. public List<Student> selectAllStudent() {

  73. List<Student> students = null;

  74. try {

  75. students = sqlMapClient.queryForList("selectAllStudent");

  76. catch (SQLException e) {

  77. e.printStackTrace();

  78. }

  79. return students;

  80. }


  81. public List<Student> selectStudentByName(String name) {

  82. List<Student> students = null;

  83. try {

  84. students = sqlMapClient.queryForList("selectStudentByName",name);

  85. catch (SQLException e) {

  86. e.printStackTrace();

  87. }

  88. return students;

  89. }


  90. public Student selectStudentById(int id) {

  91. Student student = null;

  92. try {

  93. student = (Student) sqlMapClient.queryForObject(

  94. "selectStudentById", id);

  95. catch (SQLException e) {

  96. e.printStackTrace();

  97. }

  98. return student;

  99. }

  100. }

 

TestIbatis.java 

  1. package com.iflytek.test;


  2. import java.sql.Date;

  3. import java.util.List;


  4. import com.iflytek.daoimpl.StudentDaoImpl;

  5. import com.iflytek.entity.Student;


  6. /**

  7. * @author xudongwang 2011-12-31

  8. *

  9. * Email:xdwangiflytek@gmail.com

  10. *

  11. */

  12. public class TestIbatis {


  13. public static void main(String[] args) {

  14. StudentDaoImpl studentDaoImpl = new StudentDaoImpl();


  15. System.out.println("测试插入");

  16. Student addStudent = new Student();

  17. addStudent.setName("李四");

  18. addStudent.setBirth(Date.valueOf("2011-09-02"));

  19. addStudent.setScore(88);

  20. System.out.println(studentDaoImpl.addStudent(addStudent));


  21. System.out.println("测试根据id查询");

  22. System.out.println(studentDaoImpl.selectStudentById(1));


  23. System.out.println("测试模糊查询");

  24. List<Student> mohuLists = studentDaoImpl.selectStudentByName("李");

  25. for (Student student : mohuLists) {

  26. System.out.println(student);

  27. }


  28. System.out.println("测试查询所有");

  29. List<Student> students = studentDaoImpl.selectAllStudent();

  30. for (Student student : students) {

  31. System.out.println(student);

  32. }


  33. System.out.println("根据id删除学生信息");

  34. System.out.println(studentDaoImpl.deleteStudentById(1));


  35. System.out.println("测试更新学生信息");

  36. Student updateStudent = new Student();

  37. updateStudent.setId(1);

  38. updateStudent.setName("李四1");

  39. updateStudent.setBirth(Date.valueOf("2011-08-07"));

  40. updateStudent.setScore(21);

  41. System.out.println(studentDaoImpl.updateStudent(updateStudent));


  42. }

  43. }

 

iBatis 的优缺点:

优点:

1、 减少代码量,简单;

2、 性能增强;

3、 Sql 语句与程序代码分离;

4、 增强了移植性;

缺点:

1、 Hibernate 相比,sql 需要自己写;

2、 参数数量只能有一个,多个参数时不太方便;