它是一个半自动的ORM框架,可以自定义SQL,所以是半自动。
ORM叫对象关系模型,作用是把数据映射成程序中的POJO(entity),也可以把程序中的对象映射成数据库中的数据行。就不需要程序员编写烦琐的JDBC,可重用。简化工作。
缺点:MyBites的缺点是因为自定义SQL。所以数据库兼容性不好。如果要更改数据库,则要改:驱动,数据库连接字符串(driver,url),还有部分SQL指令。
1.导入MyBites的Jar包,
2.添加主配置文件。文件名建议用:mybatis-config.xml。
3.添加映射文件。
4.创建MyBites的相关API对象。
5.通过这些对象来操作数据。
主配置文件常用的节点有:属性文件,自身的配置节点,别名,环境,映射文件配置,节点名是固定的,顺序也是固定的。
这两种文件都可以来约束xml文件的节点(名称,属性名,顺序,数量,数据类型).
XSD是DTD替代者的原因,一是据将来的条件可扩展,二是比DTD丰富和有用,三是用XML书写,四是支持数据类型,五是支持命名空间。
映射文件的作用是:封装SQL指令,这些指令根据它们的作用写在 insert,update,delete,select顶级元素里面。
Namespace:命名空间,给这个映射文件中的元素做区分。需要与数据持久层接口一致。
Id:每个元素都有一个ID值,这些值与数据持久层接口的方法名一致。
parameterType:此属性表示传递进去的参数,类型是别名,int,string,list,map, 或实体.
resultType:表示指令执行完毕之后的返回类型,如果是对象,则自动封装成实体对象。
resultMap:如果数据行中的列名与对象属性名不一同,则需要resultMap来映射。
insert into smbms_user
(userCode,userName,userPassword,
userRole,gender,birthday,phone,address,creationDate,createdBy)
values(#{userCode},#{userName},#{userPassword},#{role.id}
,#{gender},#{birthday},#{phone},#{address},#{creationDate},#{createdBy})
delete from smbms_user
where id=#{delId}
update smbms_user
userName=#{userName},
gender=#{gender},
birthday=#{birthday},
phone=#{phone},
address=#{address},
userRole=#{user.id},
modifyBy=#{modifyBy},
modifyDate=#{modifyDate},
where id = #{id}
update smbms_user set userPassword= #{pwd} where id =
#{id}
delete from smbms_user where id in (1,2,7,8)
#{i}
SqlSessionFactoryBuild对象:此对象会根据主配置文件的流来创建SqlSessionFactory工厂对象。它只需要加载一次就行了。
SqlSessionFactory:此对象可以创建SqlSession对象。因为是工厂,在应用程序中只需要一个就行,所以,我们把做成单例模式。
SqlSession:此对象是一个会话对象,类似于Servlet中的Session内置对象。是一个连接,它的作用就是操作数据了。注意,此对象占资源,必须在操作结束后关闭此对象。数据操作时,查询不需要提交事务,而增,删,改必须提交事务 : sqlSession.commit();
这些对象太多的地方需要使用,所有把它们写在一个工具类中。
package cn.smbms.tools;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
MyBatis的工具类,用于创建MyBatis相关的API SqlSessionFactory对象
@author Administrator *
/
public class MybatisUtil {
static SqlSessionFactory factory = null;
/*
// 返回一个会话对象
public static SqlSession getSqlSession() {
return getSessionFactory().openSession();
}
}
业务层处理操作数据:
@Override
public boolean deleteUserById(Integer delId) {
//调用工具类获取会话对象。
SqlSession session = MybatisUtil.getSqlSession();
boolean flag = false;
try {
//getMapper表示创建此接口的代理对象,代理对象的创建采用了反射机制。
//对象存储在父类的类型中,运用里氏替换原则。
UserDao dao = session.getMapper(UserDao.class);
//调用代理的对象的方法时,则自动找到映射文件对应的元素。
if(dao.deleteUserById(delId) > 0)
flag = true;
session.commit(); //增,删,改 必须提交事务
} catch (Exception e) {
e.printStackTrace();
}finally{
session.close();//关闭会话,释放资源。
}
return flag;
}
动态SQL是MyBites最强大的地方,可以简化复杂的SQL指令的拼接工作。
If :如果条件,则把里面的SQL指令拼接外部的SQL指令中。
Where:会自动在SQL上添加where关键字,并去掉最前面的多余的and或or。
Set:用于修改的语句上,自动加上set关键字,并把最后多余的逗号去掉。
Trim
Foreach:当传入的参数是list时,则用它把list中的元素一个个迭代出来,拼接到SQL指令中,通常用于in这种模糊查询中。
Choose -> when ->otherwise:如果只有一个when,则表示一个if->else结构块,如果有多个,则是一个多重if结构块。
这些与JSTL中的标签使用方式非常类似。
MyBites中有一级缓存和二级缓存。
一级缓存是基于SQLSession 级别,默认已经开启。
二级缓存是超出 SqlSession级别,需要在settings配置添加配置,并在映射文件中添加,
并且要求缓存的对象必须要可以序列化。
public class Role implements Serializable