Ibatis

来源:互联网 发布:域名在哪里购买 编辑:程序博客网 时间:2024/06/05 21:50


http://www.cnblogs.com/ycxyyzw/archive/2012/10/13/2722567.html


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

 

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. <sqlMap>
  5. <!-- 通过typeAlias使得我们在下面使用Student实体类的时候不需要写包名 -->
  6. <typeAliasalias="Student"type="com.iflytek.entity.Student"/>
  7. <!-- 这样以后改了sql,就不需要去改java代码了 -->
  8. <!-- id表示select里的sql语句,resultClass表示返回结果的类型 -->
  9. <selectid="selectAllStudent"resultClass="Student">
  10. select * from 
  11. tbl_student 
  12. </select>
  13. <!-- parameterClass表示参数的内容 -->
  14. <!-- #表示这是一个外部调用的需要传进的参数,可以理解为占位符 -->
  15. <selectid="selectStudentById"parameterClass="int"resultClass="Student">
  16. select * from tbl_student where id=#id# 
  17. </select>
  18. <!-- 注意这里的resultClass类型,使用Student类型取决于queryForList还是queryForObject -->
  19. <selectid="selectStudentByName"parameterClass="String"
  20. resultClass="Student">
  21. select name,birth,score from tbl_student where name like 
  22. '%$name$%' 
  23. </select>
  24. <insertid="addStudent"parameterClass="Student">
  25. insert into 
  26. tbl_student(name,birth,score) values 
  27. (#name#,#birth#,#score#)
  28. <selectKeyresultClass="int"keyProperty="id">
  29. select @@identity as inserted 
  30. <!-- 这里需要说明一下不同的数据库主键的生成,对各自的数据库有不同的方式: -->
  31. <!-- mysql:SELECT LAST_INSERT_ID() AS VALUE -->
  32. <!-- mssql:select @@IDENTITY as value -->
  33. <!-- oracle:SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL -->
  34. <!-- 还有一点需要注意的是不同的数据库生产商生成主键的方式不一样,有些是预先生成 (pre-generate)主键的,如Oracle和PostgreSQL。 
  35. 有些是事后生成(post-generate)主键的,如MySQL和SQL Server 所以如果是Oracle数据库,则需要将selectKey写在insert之前 -->
  36. </selectKey>
  37. </insert>
  38. <deleteid="deleteStudentById"parameterClass="int">
  39. <!-- #id#里的id可以随意取,但是上面的insert则会有影响,因为上面的name会从Student里的属性里去查找 -->
  40. <!-- 我们也可以这样理解,如果有#占位符,则ibatis会调用parameterClass里的属性去赋值 -->
  41. delete from tbl_student where id=#id# 
  42. </delete>
  43. <updateid="updateStudent"parameterClass="Student">
  44. update tbl_student set 
  45. name=#name#,birth=#birth#,score=#score# where id=#id# 
  46. </update>
  47. </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. <sqlMapConfig>
  5. <!-- 引用JDBC属性的配置文件 -->
  6. <propertiesresource="com/iflytek/entity/SqlMap.properties"/>
  7. <!-- 使用JDBC的事务管理 -->
  8. <transactionManagertype="JDBC">
  9. <!-- 数据源 -->
  10. <dataSourcetype="SIMPLE">
  11. <propertyname="JDBC.Driver"value="${driver}"/>
  12. <propertyname="JDBC.ConnectionURL"value="${url}"/>
  13. <propertyname="JDBC.Username"value="${username}"/>
  14. <propertyname="JDBC.Password"value="${password}"/>
  15. </dataSource>
  16. </transactionManager>
  17. <!-- 这里可以写多个实体的映射文件 -->
  18. <sqlMapresource="com/iflytek/entity/Student.xml"/>
  19. </sqlMapConfig>

 

StudentDao :

  1. package com.iflytek.dao; 
  2. import java.util.List; 
  3. import com.iflytek.entity.Student; 
  4. /** 
  5. * @author xudongwang 2011-12-31 
  6. * Email:xdwangiflytek@gmail.com 
  7. */
  8. publicinterface StudentDao { 
  9. /** 
  10. * 添加学生信息 
  11. * @param student 
  12. * 学生实体 
  13. * @return 返回是否添加成功 
  14. */
  15. publicboolean addStudent(Student student); 
  16. /** 
  17. * 根据学生id删除学生信息 
  18. * @param id 
  19. * 学生id 
  20. * @return 删除是否成功 
  21. */
  22. publicboolean deleteStudentById(int id); 
  23. /** 
  24. * 更新学生信息 
  25. * @param student 
  26. * 学生实体 
  27. * @return 更新是否成功 
  28. */
  29. publicboolean updateStudent(Student student); 
  30. /** 
  31. * 查询全部学生信息 
  32. * @return 返回学生列表 
  33. */
  34. public List<Student> selectAllStudent(); 
  35. /** 
  36. * 根据学生姓名模糊查询学生信息 
  37. * @param name 
  38. * 学生姓名 
  39. * @return 学生信息列表 
  40. */
  41. public List<Student> selectStudentByName(String name); 
  42. /** 
  43. * 根据学生id查询学生信息 
  44. * @param id 
  45. * 学生id 
  46. * @return 学生对象 
  47. */
  48. 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. * Email:xdwangiflytek@gmail.com 
  14. */
  15. publicclass StudentDaoImpl implements StudentDao { 
  16. privatestatic SqlMapClient sqlMapClient = null
  17. // 读取配置文件 
  18. static { 
  19. try { 
  20. Reader reader = Resources 
  21. .getResourceAsReader("com/iflytek/entity/SqlMapConfig.xml"); 
  22. sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader); 
  23. reader.close(); 
  24. catch (IOException e) { 
  25. e.printStackTrace(); 
  26. publicboolean addStudent(Student student) { 
  27. Object object = null
  28. boolean flag = false
  29. try { 
  30. object = sqlMapClient.insert("addStudent", student); 
  31. System.out.println("添加学生信息的返回值:" + object); 
  32. catch (SQLException e) { 
  33. e.printStackTrace(); 
  34. if (object != null) { 
  35. flag = true
  36. return flag; 
  37. publicboolean deleteStudentById(int id) { 
  38. boolean flag = false
  39. Object object = null
  40. try { 
  41. object = sqlMapClient.delete("deleteStudentById", id); 
  42. System.out.println("删除学生信息的返回值:" + object + ",这里返回的是影响的行数"); 
  43. catch (SQLException e) { 
  44. e.printStackTrace(); 
  45. if (object != null) { 
  46. flag = true
  47. return flag; 
  48. publicboolean updateStudent(Student student) { 
  49. boolean flag = false
  50. Object object = false
  51. try { 
  52. object = sqlMapClient.update("updateStudent", student); 
  53. System.out.println("更新学生信息的返回值:" + object + ",返回影响的行数"); 
  54. catch (SQLException e) { 
  55. e.printStackTrace(); 
  56. if (object != null) { 
  57. flag = true
  58. return flag; 
  59. public List<Student> selectAllStudent() { 
  60. List<Student> students = null
  61. try { 
  62. students = sqlMapClient.queryForList("selectAllStudent"); 
  63. catch (SQLException e) { 
  64. e.printStackTrace(); 
  65. return students; 
  66. public List<Student> selectStudentByName(String name) { 
  67. List<Student> students = null
  68. try { 
  69. students = sqlMapClient.queryForList("selectStudentByName",name); 
  70. catch (SQLException e) { 
  71. e.printStackTrace(); 
  72. return students; 
  73. public Student selectStudentById(int id) { 
  74. Student student = null
  75. try { 
  76. student = (Student) sqlMapClient.queryForObject( 
  77. "selectStudentById", id); 
  78. catch (SQLException e) { 
  79. e.printStackTrace(); 
  80. return student; 
 

 

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. * Email:xdwangiflytek@gmail.com 
  9. */
  10. publicclass TestIbatis { 
  11. publicstaticvoid main(String[] args) { 
  12. StudentDaoImpl studentDaoImpl = new StudentDaoImpl(); 
  13. System.out.println("测试插入"); 
  14. Student addStudent = new Student(); 
  15. addStudent.setName("李四"); 
  16. addStudent.setBirth(Date.valueOf("2011-09-02")); 
  17. addStudent.setScore(88); 
  18. System.out.println(studentDaoImpl.addStudent(addStudent)); 
  19. System.out.println("测试根据id查询"); 
  20. System.out.println(studentDaoImpl.selectStudentById(1)); 
  21. System.out.println("测试模糊查询"); 
  22. List<Student> mohuLists = studentDaoImpl.selectStudentByName("李"); 
  23. for (Student student : mohuLists) { 
  24. System.out.println(student); 
  25. System.out.println("测试查询所有"); 
  26. List<Student> students = studentDaoImpl.selectAllStudent(); 
  27. for (Student student : students) { 
  28. System.out.println(student); 
  29. System.out.println("根据id删除学生信息"); 
  30. System.out.println(studentDaoImpl.deleteStudentById(1)); 
  31. System.out.println("测试更新学生信息"); 
  32. Student updateStudent = new Student(); 
  33. updateStudent.setId(1); 
  34. updateStudent.setName("李四1"); 
  35. updateStudent.setBirth(Date.valueOf("2011-08-07")); 
  36. updateStudent.setScore(21); 
  37. System.out.println(studentDaoImpl.updateStudent(updateStudent)); 
 

 

iBatis 的优缺点:

优点:

1、减少代码量,简单;

2、性能增强;

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

4、增强了移植性;

缺点:

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

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

0 0
原创粉丝点击