MyBatis是一个简化和实现了Java数据持久化层的开源框架,它抽象了大量的JDBC冗余代码,并提供了一个简单易用的API和数据库交互。
MyBatis的前身是iBATIS。MyBatis流行的主要原因在于它的简单性和易用性。在Java应用程序中,数据可持久化层涉及到的工作有:
将从数据库查询到的数据生成所需要的Java对象
将Java对象中的数据通过SQL持久化到数据库中
mybatis在github中的地址
https://github.com/mybatis/mybatis-3
最新版本的mybatis的下载地址
https://github.com/mybatis/mybatis-3/releases
doc文档
http://www.mybatis.org/mybatis-3/
StudentMapper.xml
insert into students(id,name,age)
values(#{id},#{name},#{age})
创建一个StudentMapper接口
public interface StudentMapper{
void insertStudent(Student student);
}
编写Java代码完成插入操作
SqlSession session = getSqlSessionFactory().openSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
mapper.insertStudent(student);
MyBatis还提供了其他一些特性来简化持久化逻辑的实现。
它支持复杂的SQL结果集数据映射到嵌套的对象结构
它支持一对一和一对多的结果集和Java对象的映射
多表级联查询
它支持根据输入的数据构建
动态的SQL语句
2.低的学习曲线
取决于Java和SQL方面的知识。
3.它能很好的与传统数据库协同工作
4.可以接受SQL语句
5.提供了与spring框架的集成支持
6.提供了与第三方缓存类库的集成支持
MyBatis内建的SqlSession级别的缓存机制,用于缓存Select语句查询出来的结果,除此之外,还有EHCache,OSCache,Hazelacst等
7.MyBatis框架中一般需要两种文件
第一种
mybatis的配置文件:mybatis-config.xml,其中包括数据库连接信息,类型别名等等。
例:
第二种
mybatis的映射文件:XxxxMapper.xml,这个文件中包括Xxxx类所对应的数据库表的各种增删改查sql语句
INSERT INTO STUDENTS(ID,NAME,EMAIL)
VALUES(#{id },#{name},#{email})
8.mybatis中的映射接口XxxxMapper.java(对XxxxMapper.xml中的sql语句进行映射)
mybatis中除了必须的jar包,各种xml配置文件之外,一般还需要有调用sql语句执行的接口XxxxMapper.java
例:
public interface StudentMapper{
List findAllStudents();
Student findStudentById(Integer id);
void insertStudent(Student student);
}
注意:接口中的方法的名字和XML文件定义的SQL映射语句的名称要相同。同时我们不需要去实现该接口,因为mybatis中提供了相应的方式在运行期间动态生成该接口的实现类对象。
8.mybatis中的SqlSession接口和SqlSessionFactory接口
//产生SqlSessionFactory
SqlSessionFactroyBuilder.build();
SqlSession接口的实现类对象是mybatis中最重要的一个对象,我们可以使用改对象动态获得XxxxMapper.java接口的实现类对象,然后就可以调用到XxxxMapper.java接口中方法所映射的sql语句。
例:
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//第一种执行sql语句的方式 通过XxxxMapper接口的实现类对象来调用
//动态获得XxxxMapper接口的实现类
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
studentMapper.insertStudent(new Student(1,"tom","[email protected]"));
//第二种执行sql语句的方式 执行调用XxxxMapper.xml中写好的sql语句
//也可以【不通过】Mapper接口执行映射的SQL
//然而,使用 Mapper接口是最佳实践
//sqlSession.selectOne("com.pojo.StudentMapper.findStudentById",1);
dataSource的类型type属性可以配置成其内置类型之一,如UNPOOLED,POOLED,JNDI.
transactionManager元素 :事务管理器
MyBatis支持两种类型的事务管理器:JDBC和MANAGED。
注意:Managed是托管的意思,即我们编写的应用程序本身不去管理事务,而是把事务管理交给应用所在的服务器进行管理。
4.properties元素
属性配置元素properties可以将配置值写死到mybatis-config.xml中,也可以具体到一个属性文件中,并且使用属性文件的key名作为占位符。
将数据库连接属性配置到application.properties文件中,并且driver,url等属性使用了占位符。
application.properties:
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:XE
jdbc.username=username
jdbc.password=password
在mybatis-config.xml文件中,为属性使用application.properties文件中定义的占位符。
5.typeAliases元素:类型别名
在SQLMapper配置文件中,对于resultType和parameterType属性值,我们需要使用javaBean的完全限定名。
例如:
UPDATE STUDENTS
SET NAME=#{name}, EMAIL=#{email}, DOB=#{dob}
WHERE STUD_ID=#{id}
注意:
我们可以为完全限定名取一个别名(alias),然后就可以在需要使用完全限定名的地方使用别名,而不是到处使用完全限定名。
UPDATE STUDENTS
SET NAME=#{name}, EMAIL=#{email}, DOB=#{dob}
WHERE STUD_ID=#{id}
还可以为配置出需要取别名的类的所在的包,mybatis会自动扫描包内定义的类 ,然后分别为每个类注册一个小写字母开头的简单类名形式的别名。
例:
如果Student.java和 Teacher.java 定义在com.pojo包中,则 com.pojo.Student的别名会被注册为student。而com.pojo.Teacher别名将会被注册为teacher。
还有另外一种方式为JavaBeans起别名,使用注解 @Alias
注:@Alias注解将会覆盖配置文件中的定义。
@Alias("stu")
public class Student{
....
}
6.typeHandlers元素:类型处理器
当MyBatis将一个Java对象作为输入参数执行INSERT语句操作时,他会创建一个PreparedStatement对象,并且使用setXXX()方法对占位符设置相应的参数值。这里XXX可以是int,String,Date等Java对象属性类型的任意一个。
自定义类型处理器:
package com.test;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import com.bean.BriupName;
//类型处理器
public class MyTypeHandler
extends BaseTypeHandler{
@Override
public BriupName getNullableResult(ResultSet set, String columnName) throws SQLException {
String value = set.getString(columnName);
System.out.println("值 : "+value);
BriupName n = new BriupName();
n.setFirstName(value.substring(0, 1));
n.setLastName(value.substring(1));
return n;
}
@Override
public BriupName getNullableResult(ResultSet set, int columnindex) throws SQLException {
String value = set.getString(columnindex);
System.out.println("值 : "+value);
BriupName n = new BriupName();
n.setFirstName(value.substring(0, 1));
n.setLastName(value.substring(1));
return n;
}
@Override
public BriupName getNullableResult(CallableStatement arg0, int arg1) throws SQLException {
return null;
}
@Override
public void setNonNullParameter(
PreparedStatement ps,
int index,
BriupName name,
JdbcType jdbcType)throws SQLException {
ps.setString(index, name.getFirstName()+"--"+name.getLastName());
}
}
配置文件中配置类型处理器信息:
映射文件
测试类
7.settings元素:全局参数设置
大多数情况下,这些参数使用它们的默认值即可。MyBatis默认的全局参数设置可以被覆盖掉。
!-- 设置超时时间,它决定驱动等待一个数据库响应的时间 -->
8.mappers元素:SQL映射
SQLMapper文件中包含的SQL映射语句将会被应用通过使用其标签中的id值来执行。我们需要在mybatis-config.xml文件中配置SQLMapper文件的位置。
mapper标签都可以从不同类型的资源中加载映射mapper。