MyBatis是支持普通sql查询,存储过程和高级映射的优秀持久层框架,封装了几乎所有的jdbc代码和参数的手工设置以及结果集的检索,mybatis使用简单的xml或者注解做配置和定义映射关系
    mybatis体系结构:

    1. 加载配置:(配置方式:xml配置文件,java代码的注解),mybatis把sql的配置信息加载成为一个个的mappedStatement对象(包括传入参数映射配置、执行的sql语句、结果映射配置),并将其存储在内存中

    2. sql解析:当API接口层接收到调用请求的时候,会收到传入sql的ID和传入对象(可是Map、JJavaBean或者基本数据类型),MyBatis会根据sql的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的Sql语句和参数

    3. sql执行:将最终得到的sql和参数拿到数据库进行执行,得到操作数据库的结果

    4. 结果映射:将操作数据库的结果按照配置进行转换,可以转换成HaspMap、JavaBean或者基本数据类型,并最终结果返回

    mybatis执行过程 - 图1

    原始方法:Mybatis图片的过程:
    使用Mybatis:先配置pom.xml
    (使用了JDBC事务管理器,并交给了MyBatis进行处理,JDBC事务管理器默认情况下是进行自动提交的,但是交给MyBatis处理之后,就变成了手动提交,所以在MyBatis中,进行CRUD操作的时候,只有查找是不需要自己进行提交的,其他三种操作都需要进行提交。)
    mybatis执行过程 - 图2

    映射文件:SqlMapConfig.xml

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
    3. "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
    4. <configuration>
    5. <environments default="environment">
    6. <environment id="environment">
    7. <transactionManager type="JDBC"/>
    8. <dataSource type="POOLED">
    9. <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8"/>
    10. <property name="driver" value="com.mysql.jdbc.Driver"/>
    11. <property name="username" value="root"/>
    12. <property name="password" value="123456"/>
    13. </dataSource>
    14. </environment>
    15. </environments>
    16. <!--引入mapper文件 -->
    17. <mappers>
    18. <mapper resource="EmpMapper.xml"/>
    19. <mapper resource="EmpMapper2.xml"/>
    20. <mapper resource="DeptMapper.xml"/>
    21. </mappers>
    22. </configuration>
    23. //各标签含义
    24. environments:环境们,mybatis可以配置多种环境 ,default指定使用某种环境。可以达到快速切换环境。
    25. environment:配置一个具体的环境信息;必须有两个标签;id代表当前环境的唯一标识
    26. transactionManager:事务管理器;
    27. type:事务管理器的类型;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory)
    28. 自定义事务管理器:实现TransactionFactory接口.type指定为全类名
    29. dataSource:数据源;
    30. type:数据源类型;UNPOOLED(UnpooledDataSourceFactory)
    31. |POOLED(PooledDataSourceFactory)
    32. |JNDI(JndiDataSourceFactory)
    33. 自定义数据源:实现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执行过程 - 图3

    mybatis-conf.xml
    mybatis执行过程 - 图4

    在mybatis中添加日志信息。
    1. 引入一个日志jar文件。mybatis执行过程 - 图5

    2. 加入日志的配置文件log4j.xml


    Mybatis的CRUD
    添加:
    mybatis的映射文件。mybatis执行过程 - 图6
    mybatis执行过程 - 图7

    测试代码:
    mybatis执行过程 - 图8

    修改:
    映射文件:mybatis执行过程 - 图9

    测试mybatis执行过程 - 图10

    删除
    映射文件mybatis执行过程 - 图11

    测试文件:mybatis执行过程 - 图12


    查询所有的记录。mybatis执行过程 - 图13

    测试:
    mybatis执行过程 - 图14




    mybatis基于接口与映射文件的写法:
    映射文件:
    mybatis执行过程 - 图15

    接口:
    mybatis执行过程 - 图16

    测试:
    mybatis执行过程 - 图17


    mybatis处理参数。 单个参数&多个参数&命名参数

    多个参数:

    1. 映射文件:
    mybatis执行过程 - 图18
    2. 接口中的方法
    mybatis执行过程 - 图19



    命名参数:

    映射文件.
    mybatis执行过程 - 图20
    接口中方法:mybatis执行过程 - 图21



    map参数:

    映射文件:mybatis执行过程 - 图22

    接口:
    mybatis执行过程 - 图23
    测试:
    mybatis执行过程 - 图24

    Mybatis中特殊字符:
    1. 使用HTML中处理特殊字符。
    mybatis执行过程 - 图25
    2. <![CDATA[sql]]>
    模糊查询
    mybatis执行过程 - 图26
    接口:
    mybatis执行过程 - 图27

    测试:mybatis执行过程 - 图28


    分页:mybatis执行过程 - 图29

    接口:mybatis执行过程 - 图30






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