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 连接的属性文件
关于每个实体的映射文件(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