一:ibatis简介 ibatis是apache的一个开源的框架,实现了O/R mapping(对象关系映射)。特点:小巧上手比较快。
优点:
1):java代码和sql语句分离,这样在修改sql语句后,无须重新编译java代码
2):ibatis对jdbc进行了封装,使用者无须手动写代码把数据放到对象中
3):简单容易上手
缺点:
1):相对于hibernate来说,ibatis需要手动写sql语句。
2):ibatis在给sql语句传递参数时,只能传递一个参数。
二:ibatis简单使用
步骤: 1):导入相关jar包:ibatis-xxx.jar,mysql-connector-java- xxx-bin.jar(附件中可以下载)
2):总配置文件(SqlMapConfig.xml)
3):实体映射文件(对实体操作的sql语句映射)
三:实例
jdbc.properties文件
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/ibatis username=root password=123
总配置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> <!-- 加载数据库连接信息配置文件 --> <properties resource="jdbc.properties" /> <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/zt/entity/Student.xml" /> </sqlMapConfig>
实体映射文件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 可以看成是Student的别名,这样在下面就不用写类的全限定名 了, 只写别名即可 --> <typeAlias alias="Student" type="com.zt.entity.Student" /> <!-- 查询所有学生信息 --> <select id="queryAllStudents" resultClass="Student"> select * from student </select> <!-- 通过参数查询学生信息 --> <select id="getStudentById" parameterClass="int" resultClass="Student"> select * from student where id=#id# <!-- #id# 类似于占位符--> </select> <!-- 根据参数进行模糊查询 --> <select id="queryStudentsByName" parameterClass="String" resultClass="Student"> select * from student where name like '%$name$%' </select> <!-- 插入操作 --> <insert id="insertStudent" parameterClass="Student"> insert into student (id, name, birthday, password) values (#id#, #name#, #birthday#, #password#) </insert> <!-- 插入操作,主键自动生成 --> <insert id="insertStudent1" parameterClass="Student"> <selectKey resultClass="int" keyProperty="id"> SELECT @@IDENTITY AS ID </selectKey> insert into student (id, name, birthday, password) values (#id#, #name#, #birthday#, #password#) </insert> <!-- 更新操作 --> <update id="updateStudent" parameterClass="Student"> update student set name=#name#,birthday=#birthday#,password=#password# where id=#id# </update> <!-- 删除操作 --> <delete id="deleteById" parameterClass="int"> delete from student where id=#id# </delete> </sqlMap>
实体Student.java
package com.zt.entity;
import java.util.Date;
public class Student {
private int id;
private String name;
private String password;
private Date birthday;
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 String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "id:" + id + " name:" + name + " password:" + password;
}
}
IStudent 接口,定义了对Student的常用操作
package com.zt.entity;
import java.util.List;
/**
* 学生增删改
* @author zt_pc
*
*/
public interface IStudentDao {
/**
* 添加操作
* @param student
* @return
*/
public Integer save(Student student);
/**
* 添加操作主键自动生成
* @param student
* @return Integer
*/
public Integer save1(Student student);
/**
* 更新操作
* @param student
* @return
*/
public void update(Student student);
/**
* 查询所有学生信息
* @param student
* @return List<Student>
*/
public List<Student> queryStudents();
/**
* 根据ID查询学生信息
* @param id
* @return Student
*/
public Student getStudentById(int id);
/**
* 模糊查询
* @param name
* @return
*/
public List<Student> queryStudentsByName(String name);
/**
* 删除操作
* @param id
* @return
*/
public void deleteById(int id);
}
StudentDao 实现了ISudentDao
package com.zt.entity;
import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class StudentDao implements IStudentDao {
private static SqlMapClient sqlMapClient = null;
static {
try {
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (IOException e) {
throw new RuntimeException("文件未找到");
}
}
@Override
public Integer save(Student student) {
Integer id = null;
try {
//queryForList的第一个参数是student.xml文件sql语句的id,第二个参数是要插入的数据
id = (Integer)sqlMapClient.insert("insertStudent", student);
} catch (SQLException e) {
e.printStackTrace();
}
return id;
}
@Override
public Integer save1(Student student) {
Integer id = null;
try {
//queryForList的第一个参数是student.xml文件sql语句的id,第二个参数是要插入的数据
id = (Integer)sqlMapClient.insert("insertStudent1", student);
} catch (SQLException e) {
e.printStackTrace();
}
return id;
}
@Override
public void update(Student student) {
try {
//update的第一个参数是student.xml文件sql语句的id,第二个参数要更新数据
sqlMapClient.update("updateStudent", student);
} catch (SQLException e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
@Override
public List<Student> queryStudents() {
List<Student> students = null;
try {
//queryForList的第一个参数是student.xml文件sql语句的id
students = (List<Student>)sqlMapClient.queryForList("queryAllStudents");
} catch (SQLException e) {
e.printStackTrace();
}
return students;
}
@SuppressWarnings("unchecked")
@Override
public List<Student> queryStudentsByName(String name) {
List<Student> students = null;
try {
//queryForList的第一个参数是student.xml文件sql语句的id,第二个参数是查询条件
students = sqlMapClient.queryForList("queryStudentsByName", name);
} catch (SQLException e) {
e.printStackTrace();
}
return students;
}
@Override
public void deleteById(int id) {
try {
sqlMapClient.delete("deleteById", id);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public Student getStudentById(int id) {
Student student= null;
try {
//queryForObject的第一个参数是student.xml文件sql语句的id,第二个参数是查询条件
student = (Student) sqlMapClient.queryForObject("getStudentById", id);
} catch (SQLException e) {
e.printStackTrace();
}
return student;
}
//测试
public static void main(String[] args) {
IStudentDao studentDao = new StudentDao();
//测试查询所有学生
List<Student> students1 = studentDao.queryStudents();
if(students1 == null) return;
for (Student student : students1) {
System.out.println(student);
}
//测试根据参数查询查询学生
Student student1 = studentDao.getStudentById(1);
if(student1 == null) return;
System.out.println(student1);
//测试模糊查询
List<Student> students2 = studentDao.queryStudentsByName("gs");
if(students2 == null) return;
for (Student student : students2) {
System.out.println(student);
}
// 测试插入操作
Student student2 = new Student();
student2.setId(4);
student2.setName("wangsi");
student2.setBirthday(new Date());
student2.setPassword("123");
Integer id = studentDao.save1(student2);
System.out.println(id);
//测试更新操作
Student student3 = new Student();
student3.setId(4);
student3.setName("wangsi12");
student3.setBirthday(new Date());
student3.setPassword("1234");
studentDao.update(student3);
//测试删除操作
studentDao.deleteById(6);
}
}
总结:ibatis在执行增删改查操作时,首先根据要执行sql语句的ID 去 实体映射文件中查找相应的sql语句。
其中parameterClass 属性表示传递参数的类型,returnClass 表示返回值的类型。