一、什么是 MyBatis ?
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
简单来说,MyBatis 框架最大特点就是:几乎避免了所有JDBC代码、手动设置参数和获取结果集。这将大大简化开发过程。
二、MyBatis开发步骤
在开发前,先建立数据库表。(oracle为例)
-- Create table
create table COURSE
(
course_id NVARCHAR2(50) not null,
course_name NVARCHAR2(50) not null,
course_score NUMBER not null,
start_date DATE not null
)
alter table COURSE
add constraint PK_COURSE primary key (COURSE_ID);
alter table COURSE
add constraint UQ_COURSE_NAME unique (COURSE_NAME);
为数据库表添加一条数据
INSERT INTO course(course_id,course_name,course_score,start_date)
VALUES(course001,'mybatis',3,sysdate);
然后正式开始开发:
1. 新建一个java web工程或java工程( 以java web工程为例 );
在eclipse javaEE 中新建一个web项目,项目名为mybatisdemo
新建mybatis工程的java package包,分别为:bean,dao,config,test
2. 把mybatis框架的jar包及其依赖包copy到项目工程中;
3. 编写数据实体类,与数据库表进行对应 - 为orm做准备
package com.djomega.mybatisdemo.bean;
import java.util.Date;
public class Course {
private String courseId;
private String courseName;
private Integer courseScore;
private Date startDate;
public Course() {
super();
}
public Course(String courseId, String courseName, Integer courseScore, Date startDate) {
super();
this.courseId = courseId;
this.courseName = courseName;
this.courseScore = courseScore;
this.startDate = startDate;
}
public String getCourseId() {
return courseId;
}
public void setCourseId(String courseId) {
this.courseId = courseId;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public Integer getCourseScore() {
return courseScore;
}
public void setCourseScore(Integer courseScore) {
this.courseScore = courseScore;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
}
4. 定义数据操作接口,并在接口中定义数据操作
package com.djomega.mybatisdemo.dao;
import java.util.List;
import com.djomega.mybatisdemo.bean.Course;
//接口用于定义数据库的操作
public interface ICourseDao {
//查询所有课程
public List<Course> findAll();
}
5. 在dao包下编写一个接口映射文件(ICourseDao.xml),对接口的数据操作进行映射
<?xml version="1.0" encoding="UTF-8"?>
<!-- mybatis接口映射文件,用于映射接口操作,
mybatis会根据配这文件的配置实现数据库操作 -->
<!-- 注意:mybatis有两个配置文件,一个是全局配置文件,一个是接口映射文件
接口映射文件需要使用接口文档映射定义-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 在mapper映射文件中,使用mapper便签进行实现接口映射,使用namespace指定要映射的接口;
即namespace配置的是接口的名称,一般的一个映射文件实现(映射)一个接口,
在运行过程中,mybatis的代理类会根据配置实现数据操作接口定义的数据库操作(相当于由mybatis编写了一个接口实现类)
-->
<mapper namespace="com.djomega.mybatisdemo.dao.ICourseDao">
<!-- resultMap用于配置查询结果的映射关系 -->
<resultMap type="Course" id="courseMap">
<!-- id用于配置数据库的主键列或唯一键列 -->
<!-- orm框架可以完成数据库表的列与java类的属性的映射关系- ojdbc mapping对象映射,relation mapping关系映射 -->
<id column="course_id" property="courseId"/>
<result column="course_name" property="courseName"/>
<result column="course_score" property="courseScore"/>
<result column="start_date" property="startDate"/>
</resultMap>
<!-- 在以上标签中,使用id配置接口的方法名称,courseMap用于配置自定义的结果映射关系 -->
<select id="findAll" resultMap="courseMap">
select * from course
</select>
<!-- 注意使用mybatis进行配置,id不能重名,即接口方法不能重载 -->
<!-- 如果接口方法有参数,需要使用parameterType配置参数的类型(原始数据类型或对象类型),多个参数使用parameterMap进行配置(集合类型) -->
<select id="findById" resultMap="courseMap" parameterType="String">
<!-- 可以使用#{}获取参数值 -->
select * from course where course_id=#{id}
</select>
</mapper>
6. 在config包下编写mybatis全局配置文件(mybatis-config.xml),配置数据库连接参数,配置映射文件或数据操作接口...
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这是mybatis全局配置文件,用于进行mybatis配置 -->
<!-- dtd: -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties>
<property name="p_driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="p_url" value="jdbc:oracle:thin://localhost:1521/orcl"/>
<property name="p_username" value="djomega"/>
<property name="p_password" value="123456"/>
</properties>
<typeAliases>
<!-- 针对pojo类可以在全局配置文件中配置类型别名,在接口映射文件中可以使用别名简化配置 -->
<!-- 在mybatis对多个java类型提供内建别名,查看mybatis编程手册(api) -->
<!-- mybatis的别名使用通过类型处理类进行类型转换的,mybatis提供了赋值类型的人自定义转换接口进行类型扩展 -->
<!-- <typeAlias type="com.djomega.mybatisdemo.bean.Course" alias="Course"/> -->
<!-- 如果要配置的别名很多,可以使用package进行简化配置,配置pojo类所在的package包即可 -->
<package name="com.djomega.mybatisdemo.bean"/>
</typeAliases>
<!-- typeHandlers用于配置类型转换器,别名是通过类型转换类把java类型互换成数据库类型 -->
<typeHandlers>
</typeHandlers>
<environments default="development">
<environment id="development">
<!-- 配置事务管理器 -->
<transactionManager type="JDBC"/>
<!-- 配置jdbc的四个参数 -->
<dataSource type="POOLED">
<property name="driver" value="${p_driver}"/>
<property name="url" value="${p_url}"/>
<property name="username" value="${p_username}"/>
<property name="password" value="${p_password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.djomega.mybatisdemo.dao"/>
</mappers>
</configuration>
7. 编写测试类,测试mybatis开发框架:
四个步骤:获取mybatis环境-->实例化数据操作接口-->调用接口方法-->处理操作数据结果
package test;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.djomega.mybatisdemo.bean.Course;
import com.djomega.mybatisdemo.dao.ICourseDao;
public class TestICourseDao {
private Logger logger = Logger.getLogger(TestICourseDao.class);
private SqlSession session = null;
@Test
public void testFindAll() {
try {
// 1.加载mybatis环境
String resource = "config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2.通过mybatis实例化数据访问接口
session = sqlSessionFactory.openSession();
ICourseDao courseDao = session.getMapper(ICourseDao.class);
// 3.调用数据访问接口,进行数据操作
List<Course> list = courseDao.findAll();
// 4.处理数据操作的结果
for (Course course : list) {
logger.info(course.getCourseId() + course.getCourseName() + course.getCourseScore()
+ course.getStartDate());
}
} catch (IOException e) {
logger.warn("发生了异常", e);
}
}