0
点赞
收藏
分享

微信扫一扫

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:
Java代码 复制代码 收藏代码

package com.iflytek.entity; 

 import java.sql.Date; 

 /** 

 * @author xudongwang 2011-12-31 

 * 

 * Email:xdwangiflytek@gmail.com 

 * 

 */ 

 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 :
Properties代码 复制代码 收藏代码

driver=com.mysql.jdbc.Driver 

 url=jdbc:mysql://localhost:3306/ibatis 

 username=root 

 password=123





Student.xml :
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> 

 <!-- 通过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 :
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> 

 <!-- 引用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 :
Java代码 复制代码 收藏代码

package com.iflytek.dao; 

 import java.util.List; 

 import com.iflytek.entity.Student; 

 /** 

 * @author xudongwang 2011-12-31 

 * 

 * Email:xdwangiflytek@gmail.com 

 * 

 */ 

 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 :
Java代码 复制代码 收藏代码

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:xdwangiflytek@gmail.com 

 * 

 */ 

 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 :
Java代码 复制代码 收藏代码

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:xdwangiflytek@gmail.com 

 * 

 */ 

 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、 参数数量只能有一个,多个参数时不太方便;

举报

相关推荐

0 条评论