MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类—-Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。
功能架构讲解:
我们把Mybatis的功能架构分为三层:
(1)API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
(2)数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
(3)基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
引用百度百科的图片
环境的搭建(基于maven的):
1.新建maven工程
2.在依赖中加入mybatis的依赖,数据库驱动的依赖
3.在资源文件中创建mybatis.xml配置文件,并配置好数据库的配置(根据不同的数据库来搭建)
4.测试连接
在依赖中加入mybatis的依赖,数据库驱动的依赖:
<!--引入mybatis的依赖包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<!-- 引入数据库的驱动包 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>oracle_drive</artifactId>
<version>oracle_11G</version>
</dependency>
mybatis.xml的配置(以oracle的为列):
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 数据库链接环境
default:默认使用的环境
-->
<environments default="development">
<!-- 可以配置多个环境,id数据库环境的编号 -->
<environment id="development">
<!-- 数据事务处理
type处理方式:jdbc:数据库自己处理
manager:交给容器处理:如spring
-->
<transactionManager type="JDBC" />
<!-- 数据源-->
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
<property name="username" value="yyt" />
<property name="password" value="a" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/CourseMapper.xml"/>
</mappers>
</configuration>
测试连接:
@Test
public void testConn() {
/**
* 1.加载配置文件mybatis.xml
* 2.通过配置文件创建一个SqlSessionFactory 工厂对象
* 3.通过工厂对象生产一个SqlSession对象
* 4.通过SqlSession对象获得数据库链接
* 5.测试数据库连接是不是为空的
* 断言在外面进行操作,防止出现异常被捕获
*/
Connection conn=null;
try {
InputStream in = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession();
conn = session.getConnection();
} catch (IOException e) {
e.printStackTrace();
}
assertNotNull("数据库链接失败", conn);
}
使用mybatis进行增删改查:
我们是对表进行增删改查的,所以首先建好表,我这里以course表为例,然后对数据库中的表,添加实体类,再在文件夹里面添加一个映射文件(基本的头信息,可以直接在copy),(注意要在mybatis.xml的里面添加一个节点,配置创建的映射文件,再对映射文件进行编写,然后在编写测试的方法;
数据库表:
CREATE TABLE course (
id number(11) primary key,
courseCode varchar2(20) NOT NULL ,
courseName varchar2(50) NOT NULL
);
实体类:
public class Course {
private int id;// 课程编号
private String courseCode;// 课程代码
private String courseName;// 课程名称
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCourseCode() {
return courseCode;
}
public void setCourseCode(String courseCode) {
this.courseCode = courseCode;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public Course(int id, String courseCode, String courseName) {
this.id = id;
this.courseCode = courseCode;
this.courseName = courseName;
}
public Course() {
super();
}
@Override
public String toString() {
return "Course [id=" + id + ", courseCode=" + courseCode + ", courseName=" + courseName + "]";
}
}
映射文件CourseMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace:命名空间用来区分 -->
<mapper namespace="com.yyt.mybatis.CourseMapper">
<!--
insert :表示插入映射
id:表示插入映射的名字
parameterType:要插入的数据类型
-->
<insert id="inserCourse" parameterType="com.yyt.entity.Course">
<!-- 插入操作,#{id}相当于getId() -->
insert into course values(#{id},#{courseCode},#{courseName})
</insert>
<!-- 查询
使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
resultType="com.yyt.entity.Course"就表示将查询结果封装成一个User类的对象返回
-->
<select id="selectCourse" parameterType="int" resultType="com.yyt.entity.Course" >
select * from course where id=#{id}
</select>
<!-- 删除
按照id删除 参数就是int
-->
<delete id="deleteCourse" parameterType="int" >
delete from course where id=#{id}
</delete>
<!-- 更新
parameterType:要更新的数据类型
-->
<update id="updateCourse" parameterType="com.yyt.entity.Course">
update course set courseCode=#{courseCode},courseName=#{courseName} where id=#{id}
</update>
</mapper>
测试类:
package com.yyt.MyBatis_Hello;
import static org.junit.Assert.*;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
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.junit.Test;
import com.yyt.entity.Course;
public class ConnTest {
// 测试mybatis框架与数据库的连接
@Test
public void testConn() {
/**
* 1.加载配置文件mybatis.xml
* 2.通过配置文件创建一个SqlSessionFactory 工厂对象
* 3.通过工厂对象生产一个SqlSession对象
* 4.通过SqlSession对象获得数据库链接
* 5.测试数据库连接是不是为空的
* 在外面进行操作,防止出现异常被捕获
*/
Connection conn=null;
try {
InputStream in = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession();
conn = session.getConnection();
} catch (IOException e) {
e.printStackTrace();
}
assertNotNull("数据库链接失败", conn);
}
/**
* 数据库操作: 增(插入): 删(删除): 改(修改): 查(查询): 读取数据:
*/
// 增
@Test
public void testInsert() {
SqlSession session=null;
int result=0;
try {
// 操作之前数据库与程序之前需要把操作的表与类对应起来
InputStream in=Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
session=factory.openSession();
Course course=new Course(2,"yc0023","java培训");
//第一个参数是mapper中的namespace.操作的id 第二个参数插入的参数
result=session.insert("com.yyt.mybatis.CourseMapper.inserCourse", course);
session.commit();//提交
} catch (IOException e) {
e.printStackTrace();
}finally{
if(session!=null){
session.close();//关闭
}
}
assertEquals("插入失败", 1, result);
}
//查询
@Test
public void testSelect(){
SqlSession session=null;
Course courseq=null;
try {
// 操作之前数据库与程序之前需要把操作的表与类对应起来
InputStream in=Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
session=factory.openSession();
//第一个参数是mapper中的namespace.操作的id 第二个参数插入的参数
courseq=session.selectOne("com.yyt.mybatis.CourseMapper.selectCourse", 2);
System.out.println(courseq);
} catch (IOException e) {
e.printStackTrace();
}finally{
if(session!=null){
session.close();//关闭
}
}
assertNotNull("对象为空", courseq);
}
//更新
@Test
public void testUpdate(){
SqlSession session=null;
int result=0;
try {
// 操作之前数据库与程序之前需要把操作的表与类对应起来
InputStream in=Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
session=factory.openSession();
Course course=new Course(2,"yc0024","mybatis培训");
//第一个参数是mapper中的namespace.操作的id 第二个参数插入的参数
result=session.delete("com.yyt.mybatis.CourseMapper.updateCourse", course);
session.commit();//提交
} catch (IOException e) {
e.printStackTrace();
}finally{
if(session!=null){
session.close();//关闭
}
}
assertEquals("更新失败", 1, result);
}
//更新
@Test
public void testDelete(){
SqlSession session=null;
int result=0;
try {
// 操作之前数据库与程序之前需要把操作的表与类对应起来
InputStream in=Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
session=factory.openSession();
//第一个参数是mapper中的namespace.操作的id 第二个参数插入的参数
result=session.delete("com.yyt.mybatis.CourseMapper.deleteCourse", 2);
session.commit();//提交
} catch (IOException e) {
e.printStackTrace();
}finally{
if(session!=null){
session.close();//关闭
}
}
assertEquals("更新失败", 1, result);
}
}