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 com.iflytek.entity;
  2.  
  3. import java.sql.Date;
  4.  
  5. /**
  6. * @author xudongwang 2011-12-31
  7. *
  8. * Email:xdwangiflytek@gmail.com
  9. *
  10. */
  11. publicclass Student {
  12. // 注意这里需要保证有一个无参构造方法,因为包括Hibernate在内的映射都是使用反射的,如果没有无参构造可能会出现问题
  13. privateint id;
  14. private String name;
  15. private Date birth;
  16. privatefloat score;
  17.  
  18. publicint getId() {
  19. return id;
  20. }
  21.  
  22. publicvoid setId(int id) {
  23. this.id = id;
  24. }
  25.  
  26. public String getName() {
  27. return name;
  28. }
  29.  
  30. publicvoid setName(String name) {
  31. this.name = name;
  32. }
  33.  
  34. public Date getBirth() {
  35. return birth;
  36. }
  37.  
  38. publicvoid setBirth(Date birth) {
  39. this.birth = birth;
  40. }
  41.  
  42. publicfloat getScore() {
  43. return score;
  44. }
  45.  
  46. publicvoid setScore(float score) {
  47. this.score = score;
  48. }
  49.  
  50. @Override
  51. public String toString() {
  52. return"id=" + id + "\tname=" + name + "\tmajor=" + birth + "\tscore="
  53. + score + "\n";
  54. }
  55.  
  56. }
 

 

SqlMap.properties :

  1. driver=com.mysql.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/ibatis
  3. username=root
  4. password=123
 

 

Student.xml :

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
  3. "http://ibatis.apache.org/dtd/sql-map-2.dtd">
  4.  
  5. <sqlMap>
  6. <!-- 通过typeAlias使得我们在下面使用Student实体类的时候不需要写包名 -->
  7. <typeAliasalias="Student"type="com.iflytek.entity.Student"/>
  8.  
  9. <!-- 这样以后改了sql,就不需要去改java代码了 -->
  10. <!-- id表示select里的sql语句,resultClass表示返回结果的类型 -->
  11. <selectid="selectAllStudent"resultClass="Student">
  12. select * from
  13. tbl_student
  14. </select>
  15.  
  16. <!-- parameterClass表示参数的内容 -->
  17. <!-- #表示这是一个外部调用的需要传进的参数,可以理解为占位符 -->
  18. <selectid="selectStudentById"parameterClass="int"resultClass="Student">
  19. select * from tbl_student where id=#id#
  20. </select>
  21.  
  22. <!-- 注意这里的resultClass类型,使用Student类型取决于queryForList还是queryForObject -->
  23. <selectid="selectStudentByName"parameterClass="String"
  24. resultClass="Student">
  25. select name,birth,score from tbl_student where name like
  26. '%$name$%'
  27. </select>
  28.  
  29. <insertid="addStudent"parameterClass="Student">
  30. insert into
  31. tbl_student(name,birth,score) values
  32. (#name#,#birth#,#score#)
  33. <selectKeyresultClass="int"keyProperty="id">
  34. select @@identity as inserted
  35. <!-- 这里需要说明一下不同的数据库主键的生成,对各自的数据库有不同的方式: -->
  36. <!-- mysql:SELECT LAST_INSERT_ID() AS VALUE -->
  37. <!-- mssql:select @@IDENTITY as value -->
  38. <!-- oracle:SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL -->
  39. <!-- 还有一点需要注意的是不同的数据库生产商生成主键的方式不一样,有些是预先生成 (pre-generate)主键的,如Oracle和PostgreSQL。
  40. 有些是事后生成(post-generate)主键的,如MySQL和SQL Server 所以如果是Oracle数据库,则需要将selectKey写在insert之前 -->
  41. </selectKey>
  42. </insert>
  43.  
  44. <deleteid="deleteStudentById"parameterClass="int">
  45. <!-- #id#里的id可以随意取,但是上面的insert则会有影响,因为上面的name会从Student里的属性里去查找 -->
  46. <!-- 我们也可以这样理解,如果有#占位符,则ibatis会调用parameterClass里的属性去赋值 -->
  47. delete from tbl_student where id=#id#
  48. </delete>
  49.  
  50. <updateid="updateStudent"parameterClass="Student">
  51. update tbl_student set
  52. name=#name#,birth=#birth#,score=#score# where id=#id#
  53. </update>
  54.  
  55. </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 :

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
  3. "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
  4.  
  5. <sqlMapConfig>
  6. <!-- 引用JDBC属性的配置文件 -->
  7. <propertiesresource="com/iflytek/entity/SqlMap.properties"/>
  8. <!-- 使用JDBC的事务管理 -->
  9. <transactionManagertype="JDBC">
  10. <!-- 数据源 -->
  11. <dataSourcetype="SIMPLE">
  12. <propertyname="JDBC.Driver"value="${driver}"/>
  13. <propertyname="JDBC.ConnectionURL"value="${url}"/>
  14. <propertyname="JDBC.Username"value="${username}"/>
  15. <propertyname="JDBC.Password"value="${password}"/>
  16. </dataSource>
  17. </transactionManager>
  18. <!-- 这里可以写多个实体的映射文件 -->
  19. <sqlMapresource="com/iflytek/entity/Student.xml"/>
  20. </sqlMapConfig>

 

StudentDao :

  1. package com.iflytek.dao;
  2.  
  3. import java.util.List;
  4.  
  5. import com.iflytek.entity.Student;
  6.  
  7. /**
  8. * @author xudongwang 2011-12-31
  9. *
  10. * Email:xdwangiflytek@gmail.com
  11. *
  12. */
  13. publicinterface StudentDao {
  14.  
  15. /**
  16. * 添加学生信息
  17. *
  18. * @param student
  19. * 学生实体
  20. * @return 返回是否添加成功
  21. */
  22. publicboolean addStudent(Student student);
  23.  
  24. /**
  25. * 根据学生id删除学生信息
  26. *
  27. * @param id
  28. * 学生id
  29. * @return 删除是否成功
  30. */
  31. publicboolean deleteStudentById(int id);
  32.  
  33. /**
  34. * 更新学生信息
  35. *
  36. * @param student
  37. * 学生实体
  38. * @return 更新是否成功
  39. */
  40. publicboolean updateStudent(Student student);
  41.  
  42. /**
  43. * 查询全部学生信息
  44. *
  45. * @return 返回学生列表
  46. */
  47. public List<Student> selectAllStudent();
  48.  
  49. /**
  50. * 根据学生姓名模糊查询学生信息
  51. *
  52. * @param name
  53. * 学生姓名
  54. * @return 学生信息列表
  55. */
  56. public List<Student> selectStudentByName(String name);
  57.  
  58. /**
  59. * 根据学生id查询学生信息
  60. *
  61. * @param id
  62. * 学生id
  63. * @return 学生对象
  64. */
  65. public Student selectStudentById(int id);
  66.  
  67. }
 

StudentDaoImpl :

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

 

TestIbatis.java :

  1. package com.iflytek.test;
  2.  
  3. import java.sql.Date;
  4. import java.util.List;
  5.  
  6. import com.iflytek.daoimpl.StudentDaoImpl;
  7. import com.iflytek.entity.Student;
  8.  
  9. /**
  10. * @author xudongwang 2011-12-31
  11. *
  12. * Email:xdwangiflytek@gmail.com
  13. *
  14. */
  15. publicclass TestIbatis {
  16.  
  17. publicstaticvoid main(String[] args) {
  18. StudentDaoImpl studentDaoImpl = new StudentDaoImpl();
  19.  
  20. System.out.println("测试插入");
  21. Student addStudent = new Student();
  22. addStudent.setName("李四");
  23. addStudent.setBirth(Date.valueOf("2011-09-02"));
  24. addStudent.setScore(88);
  25. System.out.println(studentDaoImpl.addStudent(addStudent));
  26.  
  27. System.out.println("测试根据id查询");
  28. System.out.println(studentDaoImpl.selectStudentById(1));
  29.  
  30. System.out.println("测试模糊查询");
  31. List<Student> mohuLists = studentDaoImpl.selectStudentByName("李");
  32. for (Student student : mohuLists) {
  33. System.out.println(student);
  34. }
  35.  
  36. System.out.println("测试查询所有");
  37. List<Student> students = studentDaoImpl.selectAllStudent();
  38. for (Student student : students) {
  39. System.out.println(student);
  40. }
  41.  
  42. System.out.println("根据id删除学生信息");
  43. System.out.println(studentDaoImpl.deleteStudentById(1));
  44.  
  45. System.out.println("测试更新学生信息");
  46. Student updateStudent = new Student();
  47. updateStudent.setId(1);
  48. updateStudent.setName("李四1");
  49. updateStudent.setBirth(Date.valueOf("2011-08-07"));
  50. updateStudent.setScore(21);
  51. System.out.println(studentDaoImpl.updateStudent(updateStudent));
  52.  
  53. }
  54. }
 

 

iBatis 的优缺点:

优点:

1、减少代码量,简单;

2、性能增强;

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

4、增强了移植性;

缺点:

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

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