ibatis简介
阿帕奇开源项目,一个O/RMapping解决方案,最大特点是小巧,上手很快。如果不需要太复杂的功能,一般都可以满足要求。http://ibatis.apache.org
搭建环境
导入相关jar包
ojdbc6.jar ibatis-core-3.0-sources.jar
配置文件:
jdbc连接的属性文件(db.properties文件)
总配置文件(SqlMapConfig.xml)
关于每个实体的映射文件(map文件)
使用步骤:
1.新建web工程ibatis,在src下新建包dao,保存处理数据库相关的类。首先创建数据库连接属性文件db.properties,内容如下:
driver=oracle.jdbc.OracleDriver url=jdbc:oracle:thin:@localhost:1521:Oracle usr=xxx pwd=xxx |
2.在数据库中创建表student
create table student(id number,name varchar2(20),age number,class varchar2(20)); insert into student values(1,'张三',18,'高一'); insert into student values(2,'张三',19,'高二'); insert into student values(3,'张三',17,'高三'); insert into student values(4,'张三',15,'高一'); insert into student values(5,'张三',17,'高二'); insert into student values(6,'张三',15,'高三'); insert into student values(7,'张三',19,'高一'); insert into student values(8,'张三',15,'高三'); insert into student values(9,'张三',17,'高二'); commit; |
3.根据数据库中表字段创建Student实体类;包名为entity
package entity;
public class Student { private int id; private String name; private int age; private String className; 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 int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", age=" + age + ", className=" + className + "]"; }
} |
4.在dao包下自定义异常类DAOException,继承自Exception,实现查询数据库时抛出自定义异常
package dao;
public class DAOException extends Exception { public DAOException(String message,Throwable couse){ super(message, couse); } } |
5.在dao包下定义IStudentDAO接口,定义抽象方法
package dao;
import java.util.List;
import entity.Student;
public interface IStudentDAO { List<Student> findAll() throws DAOException; } |
5.在dao包下,配置Student实体类的映射文件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> <!-- alias表示type的简写形式 --> <typeAlias alias="Student" type="entity.Student"/> <!-- id代表了该sql语句,resultClass表示返回值的类型 --> <select id="selectAllStudent" resultClass="Student" > select * from student </select> </sqlMap> |
6.在src/dao包下配置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> <!-- 加载数据库属性配置文件db.properties --> <properties resource="dao/db.properties"/> <!-- type="JDBC" 时事务是自动提交的,如果要控制事务不自动提交,如下的配置 --> <transactionManager type="JDBC" commitRequired="false"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="${driver}"/> <property name="JDBC.ConnectionURL" value="${url}"/> <property name="JDBC.Username" value="${usr}"/> <property name="JDBC.Password" value="${pwd}"/> </dataSource> </transactionManager> <!-- 引入映射实体类的配置文件 --> <sqlMap resource="dao/Student.xml"/> </sqlMapConfig> |
7.在dao包下新建实现IStudentDAO的类,StudentDaoImpl
package dao;
import java.io.IOException; import java.io.Reader; import java.sql.SQLException; import java.util.List;
import com.ibatis.sqlmap.client.SqlMapClient;
import entity.Student;
public class StudentDaoImpl implements IStudentDAO {
private static SqlMapClient sqlMapClient = null; private static Reader reader = null; static{ try { //将xml文件转换为一个字符输入流 reader = com.ibatis.common.resources.Resources.getResourceAsReader("dao/sqlMapConfig.xml"); //将字符输入流转换为SqlMapClient sqlMapClient = com.ibatis.sqlmap.client.SqlMapClientBuilder.buildSqlMapClient(reader); } catch (IOException e) { e.printStackTrace(); }finally{ if(reader != null){ try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
public List<Student> findAll() throws DAOException { List<Student> list = null; try { //此处的selectAllStudent对应的是Student.xml映射文件中的select标签的id值,代表了那条sql语句 list = sqlMapClient.queryForList("selectAllStudent"); } catch (SQLException e) { e.printStackTrace(); } return list; }
public static void main(String[] args) throws Exception { IStudentDAO dao = new StudentDaoImpl(); System.out.println(dao.findAll()); } } |
8.测试查看
Student [id=1, name=张三, age=18, className=null] Student [id=2, name=张三, age=19, className=null] Student [id=3, name=张三, age=17, className=null] Student [id=4, name=张三, age=15, className=null] Student [id=5, name=张三, age=17, className=null] Student [id=6, name=张三, age=15, className=null] Student [id=7, name=张三, age=19, className=null] Student [id=8, name=张三, age=15, className=null] Student [id=9, name=张三, age=17, className=null] |
上面实体类Student中的className字段与数据库中的class字段不对应因此查询出的className都是null,修改数据库中的字段名之后就好了。