MyBatis是支持普通sql查询,存储过程和高级映射的优秀持久层框架,封装了几乎所有的jdbc代码和参数的手工设置以及结果集的检索,mybatis使用简单的xml或者注解做配置和定义映射关系
mybatis体系结构:
加载配置:(配置方式:xml配置文件,java代码的注解),mybatis把sql的配置信息加载成为一个个的mappedStatement对象(包括传入参数映射配置、执行的sql语句、结果映射配置),并将其存储在内存中
sql解析:当API接口层接收到调用请求的时候,会收到传入sql的ID和传入对象(可是Map、JJavaBean或者基本数据类型),MyBatis会根据sql的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的Sql语句和参数
sql执行:将最终得到的sql和参数拿到数据库进行执行,得到操作数据库的结果
结果映射:将操作数据库的结果按照配置进行转换,可以转换成HaspMap、JavaBean或者基本数据类型,并最终结果返回

原始方法:Mybatis图片的过程:
使用Mybatis:先配置pom.xml
(使用了JDBC事务管理器,并交给了MyBatis进行处理,JDBC事务管理器默认情况下是进行自动提交的,但是交给MyBatis处理之后,就变成了手动提交,所以在MyBatis中,进行CRUD操作的时候,只有查找是不需要自己进行提交的,其他三种操作都需要进行提交。)
映射文件:SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN""http://ibatis.apache.org/dtd/ibatis-3-config.dtd"><configuration><environments default="environment"><environment id="environment"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"/><property name="driver" value="com.mysql.jdbc.Driver"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!--引入mapper文件 --><mappers><mapper resource="EmpMapper.xml"/><mapper resource="EmpMapper2.xml"/><mapper resource="DeptMapper.xml"/></mappers></configuration>//各标签含义environments:环境们,mybatis可以配置多种环境 ,default指定使用某种环境。可以达到快速切换环境。environment:配置一个具体的环境信息;必须有两个标签;id代表当前环境的唯一标识transactionManager:事务管理器;type:事务管理器的类型;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory)自定义事务管理器:实现TransactionFactory接口.type指定为全类名dataSource:数据源;type:数据源类型;UNPOOLED(UnpooledDataSourceFactory)|POOLED(PooledDataSourceFactory)|JNDI(JndiDataSourceFactory)自定义数据源:实现DataSourceFactory接口,type是全类名
EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<!--命名空间需要和Dao的命名一致 -->
<mapper namespace="com.zhiyou100.dao.EmpDao">
<!--resultType:返回的结果类型 -->
<select id="findAll" resultType="com.zhiyou100.entity.Emp">
select * from emp
</select>
<!--在mybatis中#和$的区别 -->
<!--根据id查找 -->
<select id="findById" parameterType="integer" resultType="com.zhiyou100.entity.Emp">
select * from emp where empno=#{id}
</select>
<!--添加 -->
<insert id="save" parameterType="com.zhiyou100.entity.Emp" >
insert into emp values(
null,#{ename},#{mgr},#{comm},#{deptno}
)
</insert>
<!--修改员工的信息 -->
<update id="update" parameterType="com.zhiyou100.entity.Emp">
update emp set ename=#{ename},mgr=#{mgr},comm=#{comm},deptno=#{deptno}
where empno=#{empno}
</update>
<!--删除员工信息 -->
<delete id="delete" parameterType="integer">
delete from emp where empno=#{id}
</delete>
<!--根据部门号查询员工的信息 -->
<select id="findByDeptno" parameterType="int" resultType="map">
select *from emp where deptno=#{deptno}
</select>
</mapper>
工具类映射:MyBatisUtil
package com.zhiyou100.util;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import junit.framework.TestCase;
/**
* 获取连接
* @author zyw
*
*/
public class MyBatisUtil {
private static SqlSessionFactory sf;
static {
//加载配置文件
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
sf = builder.build(TestCase.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml"));
}
/*
* 创建连接
*/
public static SqlSession getSession(){
return sf.openSession();
}
public static void main(String[] args) {
SqlSession session = MyBatisUtil.getSession();
System.out.println(session);
session.close();
}
}
test:
package com.zhiyou100.test;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import com.zhiyou100.dao.EmpDao;
import com.zhiyou100.entity.Emp;
public class TestCase {
private static EmpDao dao =new EmpDao();
//查找所有
@Test
public void test01(){
List<Emp> list = dao.findAll();
for(Emp emp:list){
System.out.println(emp.getEname());
}
}
//根据Id查找信息
@Test
public void test02(){
Emp emp = dao.findById(2);
System.out.println(emp.getEname());
}
//保存
@Test
public void test03(){
Emp emp=new Emp();
emp.setEname("wuzhi");
emp.setMgr(1);
emp.setComm(555.0);
emp.setDeptno(2);
dao.save(emp);
}
//编辑
@Test
public void test04(){
Emp emp = dao.findById(2);
emp.setEname("wu");
emp.setMgr(0);
emp.setComm(55.0);
emp.setDeptno(1);
dao.update(emp);
}
//删除
@Test
public void test05(){
dao.delete(1);
}
//根据deptno查找
@Test
public void test06(){
List<Map<String, Object>> list = dao.findByDeptno(1);
for(Map<String, Object> emp:list){
System.out.println(emp.toString());
}
}
}
(使用了JDBC事务管理器,并交给了MyBatis进行处理,JDBC事务管理器默认情况下是进行自动提交的,但是交给MyBatis处理之后,就变成了手动提交,所以在MyBatis中,进行CRUD操作的时候,只有查找是不需要自己进行提交的,其他三种操作都需要进行提交。
package com.zhiyou100.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import com.zhiyou100.dao.EmpMapper;
import com.zhiyou100.entity.Emp;
import com.zhiyou100.util.MyBatisUtil;
public class TestCase2 {
private static SqlSession session = MyBatisUtil.getSession();
private static EmpMapper mapper = session.getMapper(EmpMapper.class);
/*
* 使用mapper映射器
*/
//查找所有
@Test
public void test01(){
List<Emp> list = mapper.findAll();
for(Emp emp:list){
System.out.println(emp.toString());
}
}
//增加
@Test
public void test02(){
Emp emp=new Emp();
emp.setEname("张");
emp.setMgr(0);
emp.setComm(123.0);
emp.setDeptno(1);
mapper.save(emp);
session.commit();
}
//编辑
@Test
public void test03(){
Emp emp = mapper.findById(2);
emp.setEname("张");
emp.setMgr(0);
emp.setComm(123.0);
emp.setDeptno(2);
mapper.update(emp);
session.commit();
}
}
mybatis数据源引用属性文件的值。
db.properties
mybatis-conf.xml

在mybatis中添加日志信息。
1. 引入一个日志jar文件。
2. 加入日志的配置文件log4j.xml
Mybatis的CRUD
添加:
mybatis的映射文件。

测试代码:

修改:
映射文件:
测试
删除
映射文件
测试文件:
查询所有的记录。
测试:
mybatis基于接口与映射文件的写法:
映射文件:
接口:

测试:
mybatis处理参数。 单个参数&多个参数&命名参数
多个参数:
1. 映射文件: 2. 接口中的方法 ![]() |
|---|
命名参数:
映射文件.![]() 接口中方法: ![]() |
|---|
map参数:
映射文件:![]() 接口: 测试: |
|---|
Mybatis中特殊字符:
1. 使用HTML中处理特殊字符。
2. <![CDATA[sql]]>
模糊查询
接口:

测试:
分页:
接口:
回顾:
1. 优化.1.引入属性文件,2.添加日志
2. crud增删改查
3. mybatis基于接口和映射文件。
4. mybatis处理参数(单参,多参)
1.Mybatis自动封装到map paramX
2.命名参数@Param
3.使用Map




