[转] iBatis入门教程

iBatis 简介:

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

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

 

搭建iBatis 开发环境:

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

        2 、编写配置文件:

              Jdbc 连接的属性文件

              总配置文件, SqlMapConfig.xml

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

Demo

Student.java:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.iflytek.entity;
 
import java.sql.Date;
 
/**
  * @author xudongwang 2011-12-31
  *
  *         Email:[email protected]
  *
  */
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

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

Student.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<? 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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<? 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

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

TestIbatis.java

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

iBatis 的优缺点:

优点:

1、减少代码量,简单;

2、性能增强;

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

4、增强了移植性;

缺点:

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

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

From: http://www.open-open.com/lib/view/open1325414956437.html

猜你喜欢

转载自107x.iteye.com/blog/2112207