版本:2.3 说明:此版本是相对比较旧的版本,如今IBatis已经更名为MyBatis,而版本已经更新到3.0.4 以上。
IBatis的jar包:ibatis-2.3.0.677.jar
IBatis的配置文件
主配置文件:SqlMapConfig.xml
而独立的SQL配置文件对应的是每个bean或每一块业务,这些SQL的配置文件是独立于主配置文件的,如果要使用这些SQL的配置文件只需要在主配置文件里面进行引入即可。下面将会详细讲解。
下面做一个Demo做为讲解材料
由于该Demo是使用MySql的数据库,所以需要MySql的jar包:mysql.jar。
建一个Web项目,引入两个jar包:ibatis-2.3.0.677.jar、mysql.jar
建一张数据库表 student_ib
配置主配置文件 SqlMapConfig.xml 的dataSource
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>
<settings useStatementNamespaces = "true"/>
<transactionManager type = "JDBC">
<dataSource type = "SIMPLE">
<property name = "JDBC.Driver" value= "com.mysql.jdbc.Driver" />
<property name = "JDBC.ConnectionURL"
value= "jdbc:mysql://localhost:3306/test" />
<property name = "JDBC.Username" value= "root"/>
<property name = "JDBC.Password" value= "root"/>
</dataSource >
</transactionManager >
<!-- 下面是独立的SQL的配置文件 -->
<sqlMap resource = "com/brothers/ibatis/config/student.xml" />
</ sqlMapConfig>
新建一个student.xml的配置文件,编写独立的SQL
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 namespace= "Student" >
< typeAlias alias= "Student"
type= "com.brothers.ibatis.bean.Student" />
<typeAlias alias = "StudentParam"
type= "com.brothers.ibatis.bean.StudentParam" />
< resultMap id= "StudentResult" class = "Student">
<result property = "id" column= "STID"/>
<result property = "name" column= "STNAME"/>
<result property = "gender" column= "GENDER"/>
<result property = "age" column= "AGE"/>
<result property = "email" column= "EMAIL"/>
<result property = "createTime" column= "CREATETIME"/>
</ resultMap>
< insert id= "addStudent" parameterClass = "Student">
insert into STUDENT_IB(
STID,
STNAME,
GENDER,
AGE,
EMAIL,
CREATETIME) values(
#id:VARCHAR#,
#name:VARCHAR#,
#gender:VARCHAR#,
#age:VARCHAR#,
#email:VARCHAR#,
#createTime:VARCHAR#
)
</ insert>
< select id= "queryStudentByFilter" parameterClass ="StudentParam" resultMap = "StudentResult">
SELECT * From STUDENT_IB
<dynamic prepend = "where">
<isNotNull prepend = "AND" property= "id">
STID like '%'||#id#||'%'
</isNotNull >
<isNotNull prepend = "AND" property= "name">
STNAME like '%'||#name#||'%'
</isNotNull >
<isNotNull prepend = "AND" property= "startTime">
CREATETIME >= #startTime#
</isNotNull >
<isNotNull prepend = "AND" property= "endTime">
#endTime# >= CREATETIME
</isNotNull >
</dynamic >
</ select>
< select id= "queryStudentById" parameterClass = "String" resultMap= "StudentResult" >
SELECT * From STUDENT_IB where STID = #value#;
</ select>
</ sqlMap>
该文件是对应需要操作的bean类,所以需要一个Student的实体类做为结果的映射
Student.java:
package com.brothers.ibatis.bean;
public class Student {
private String id;
private String name;
private String gender;
private String age;
private String email;
private String createTime;
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this. createTime = createTime;
}
public String getId() {
return id;
}
public void setId(String id) {
this. id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this. name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this. gender = gender;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this. age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this. email = email;
}
}
接下来可以直接使用IBatis操作实体和数据库表映射关系,下面主要是获取SqlMapClient ,该对象是IBatis的核心对象,可以操作数据库。
package com.brothers.ibatis.factory;
import java.io.IOException;
import java.io.Reader;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class DBConnection {
private static SqlMapClient instance = null;
private static final String dbPath = "com/brothers/ibatis/config/SqlMapConfig_mysql.xml";
private DBConnection(){
}
public static SqlMapClient getInstance() {
if(instance == null){
try {
Reader reader = Resources.getResourceAsReader(dbPath);
instance = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return instance;
}
public static void setInstance(SqlMapClient instance) {
DBConnection.instance = instance;
}
public static void main(String[] args) {
System.out.println(getInstance());
}
}
接下来可以直接使用该对象操作数据库,所以要编写一个独立的类StudentDaoImpl,作为Dao层操作数据库
StudentDaoImpl.java
package com.brothers.ibatis.dao;
import java.sql.SQLException;
import java.util.List;
import com.brothers.ibatis.bean.Student;
import com.brothers.ibatis.factory.DBConnection;
import com.ibatis.sqlmap.client.SqlMapClient;
public class StudentDaoImpl {
public void add(Student student) throws SQLException{
SqlMapClient scm = DBConnection. getInstance();
scm.startTransaction();
DBConnection. getInstance().insert( "Student.addStudent",student);
DBConnection. getInstance().commitTransaction();
DBConnection. getInstance().endTransaction();
}
public void delete(String id) throws SQLException{
DBConnection. getInstance().startTransaction();
DBConnection. getInstance().insert( "deleteStudent",id);
DBConnection. getInstance().commitTransaction();
DBConnection. getInstance().endTransaction();
}
public List<Student> find(Student student) throws SQLException{
List<Student> list = DBConnection.getInstance ().queryForList("queryStudentByFilter" ,student);
return list;
}
public Student findById(String id) throws SQLException{
Student student = (Student)DBConnection.getInstance().queryForObject( "Student.queryStudentById" ,id);
return student;
}
public static void testAdd() {
StudentDaoImpl dao = new StudentDaoImpl();
Student student = new Student();
student.setAge( "20");
student.setId( "andy");
student.setEmail( "andy@gmail.com");
student.setName( "Andy Lao");
student.setGender( "male");
student.setCreateTime( "2011-01-01 12:12:12" );
try {
dao.add(student);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void testFind(){
StudentDaoImpl dao = new StudentDaoImpl();
try {
Student student = dao.findById( "andy");
System. out.println(student.getName());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
testFind();
}
}
这样就实现了简单的插入和查询。
IBatis的jar包:ibatis-2.3.0.677.jar
IBatis的配置文件
主配置文件:SqlMapConfig.xml
而独立的SQL配置文件对应的是每个bean或每一块业务,这些SQL的配置文件是独立于主配置文件的,如果要使用这些SQL的配置文件只需要在主配置文件里面进行引入即可。下面将会详细讲解。
下面做一个Demo做为讲解材料
由于该Demo是使用MySql的数据库,所以需要MySql的jar包:mysql.jar。
建一个Web项目,引入两个jar包:ibatis-2.3.0.677.jar、mysql.jar
建一张数据库表 student_ib
配置主配置文件 SqlMapConfig.xml 的dataSource
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>
<settings useStatementNamespaces = "true"/>
<transactionManager type = "JDBC">
<dataSource type = "SIMPLE">
<property name = "JDBC.Driver" value= "com.mysql.jdbc.Driver" />
<property name = "JDBC.ConnectionURL"
value= "jdbc:mysql://localhost:3306/test" />
<property name = "JDBC.Username" value= "root"/>
<property name = "JDBC.Password" value= "root"/>
</dataSource >
</transactionManager >
<!-- 下面是独立的SQL的配置文件 -->
<sqlMap resource = "com/brothers/ibatis/config/student.xml" />
</ sqlMapConfig>
新建一个student.xml的配置文件,编写独立的SQL
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 namespace= "Student" >
< typeAlias alias= "Student"
type= "com.brothers.ibatis.bean.Student" />
<typeAlias alias = "StudentParam"
type= "com.brothers.ibatis.bean.StudentParam" />
< resultMap id= "StudentResult" class = "Student">
<result property = "id" column= "STID"/>
<result property = "name" column= "STNAME"/>
<result property = "gender" column= "GENDER"/>
<result property = "age" column= "AGE"/>
<result property = "email" column= "EMAIL"/>
<result property = "createTime" column= "CREATETIME"/>
</ resultMap>
< insert id= "addStudent" parameterClass = "Student">
insert into STUDENT_IB(
STID,
STNAME,
GENDER,
AGE,
EMAIL,
CREATETIME) values(
#id:VARCHAR#,
#name:VARCHAR#,
#gender:VARCHAR#,
#age:VARCHAR#,
#email:VARCHAR#,
#createTime:VARCHAR#
)
</ insert>
< select id= "queryStudentByFilter" parameterClass ="StudentParam" resultMap = "StudentResult">
SELECT * From STUDENT_IB
<dynamic prepend = "where">
<isNotNull prepend = "AND" property= "id">
STID like '%'||#id#||'%'
</isNotNull >
<isNotNull prepend = "AND" property= "name">
STNAME like '%'||#name#||'%'
</isNotNull >
<isNotNull prepend = "AND" property= "startTime">
CREATETIME >= #startTime#
</isNotNull >
<isNotNull prepend = "AND" property= "endTime">
#endTime# >= CREATETIME
</isNotNull >
</dynamic >
</ select>
< select id= "queryStudentById" parameterClass = "String" resultMap= "StudentResult" >
SELECT * From STUDENT_IB where STID = #value#;
</ select>
</ sqlMap>
该文件是对应需要操作的bean类,所以需要一个Student的实体类做为结果的映射
Student.java:
package com.brothers.ibatis.bean;
public class Student {
private String id;
private String name;
private String gender;
private String age;
private String email;
private String createTime;
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this. createTime = createTime;
}
public String getId() {
return id;
}
public void setId(String id) {
this. id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this. name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this. gender = gender;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this. age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this. email = email;
}
}
接下来可以直接使用IBatis操作实体和数据库表映射关系,下面主要是获取SqlMapClient ,该对象是IBatis的核心对象,可以操作数据库。
package com.brothers.ibatis.factory;
import java.io.IOException;
import java.io.Reader;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class DBConnection {
private static SqlMapClient instance = null;
private static final String dbPath = "com/brothers/ibatis/config/SqlMapConfig_mysql.xml";
private DBConnection(){
}
public static SqlMapClient getInstance() {
if(instance == null){
try {
Reader reader = Resources.getResourceAsReader(dbPath);
instance = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return instance;
}
public static void setInstance(SqlMapClient instance) {
DBConnection.instance = instance;
}
public static void main(String[] args) {
System.out.println(getInstance());
}
}
接下来可以直接使用该对象操作数据库,所以要编写一个独立的类StudentDaoImpl,作为Dao层操作数据库
StudentDaoImpl.java
package com.brothers.ibatis.dao;
import java.sql.SQLException;
import java.util.List;
import com.brothers.ibatis.bean.Student;
import com.brothers.ibatis.factory.DBConnection;
import com.ibatis.sqlmap.client.SqlMapClient;
public class StudentDaoImpl {
public void add(Student student) throws SQLException{
SqlMapClient scm = DBConnection. getInstance();
scm.startTransaction();
DBConnection. getInstance().insert( "Student.addStudent",student);
DBConnection. getInstance().commitTransaction();
DBConnection. getInstance().endTransaction();
}
public void delete(String id) throws SQLException{
DBConnection. getInstance().startTransaction();
DBConnection. getInstance().insert( "deleteStudent",id);
DBConnection. getInstance().commitTransaction();
DBConnection. getInstance().endTransaction();
}
public List<Student> find(Student student) throws SQLException{
List<Student> list = DBConnection.getInstance ().queryForList("queryStudentByFilter" ,student);
return list;
}
public Student findById(String id) throws SQLException{
Student student = (Student)DBConnection.getInstance().queryForObject( "Student.queryStudentById" ,id);
return student;
}
public static void testAdd() {
StudentDaoImpl dao = new StudentDaoImpl();
Student student = new Student();
student.setAge( "20");
student.setId( "andy");
student.setEmail( "andy@gmail.com");
student.setName( "Andy Lao");
student.setGender( "male");
student.setCreateTime( "2011-01-01 12:12:12" );
try {
dao.add(student);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void testFind(){
StudentDaoImpl dao = new StudentDaoImpl();
try {
Student student = dao.findById( "andy");
System. out.println(student.getName());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
testFind();
}
}
这样就实现了简单的插入和查询。