MyBatis部分基础知识

MyBatis:

MyBatis
    简介:
        MyBatis实际上是IBatis3.0版本以后的持久化层框架【也就是和数据库打交道的框架】,IBatis2.0之前统称为IBatis、IBatis3.0之后
        统称为:MyBatis
        
    MyBatis框架和原生JDBC、JDBCTemplate相比的优势:
        1.MyBatis是一个框架,包含缓存、逆向工程等
        2.包含动态sql
        3.java代码【处理业务逻辑】和sql语句【数据交互】分离开来
            java---->编译
            sql---->编译
        4.直接将数据库中表之间的关系映射为java类对象之间的关系
        5.MyBatis是一个半自动化的ORM【Object Relationship Mapping】的框架    
    
    MyBatis工作原理:
    1.配置MyBatis的环境变量:mybatisConfig.xml(全局配置文件),配置了mybatis的运行环境信息mapper.xml文件即sql映射文件
    2.创建接口类及对应的映射文件
    3.创建SqlSessionFactory
    4.根据SqlSessionFactory创建会话SqlSession
    5.通过mapper.xml映射文件,对应接口中相应的方法,并将参数映射到sql中
    6.通过mapper.xml将sql执行的结果返回
    
    #{}和${}的区别:
        #{}:相当于sql语句中的占位符,不会出现sql注入的问题,相当于javaweb中的preparestatement预编译
        ${}:会把参数直接拼入sql语句中,会出现sql注入的问题,相当于javaweb中的statement,
            但对于不支持预编译的获取表名、排序字段、模糊查询的使用这个
    
    创建Mapper接口,修改Mapper.xml文件
    1.如何绑定:
        以前的sql配置文件的namespace可以随便写,现在不能随便写,需要指定为接口的全限类名,然后此时接口和sql配置文件做了绑定,
        然后还要将select标签的id和方法名进行绑定
    2.总结:
        1.接口式编程:
            原生:dao ------> DaoImpl
            MyBatis:xxMapper ------> xxMapper.xml
        2.SqlSession代表和数据库的一次会话,用完必须关闭
        3.SqlSession和Connection一样,都是非线程安全的,每次使用都是去获取新的连接对象,不要将这对象定义在类变量中使用
        4.mapper借口没有实现类,但是MyBatis这个接口生成一个代理对象
        5.两个重要的配置文件:
            MyBatis的全局配置文件:包含数据库连接池信息,事务管理器信息等...系统运行环境信息
            sql映射文件:保存了每一个sql语句的映射信息
            
    MyBatis全局配置文件:
        MyBatis的配置文件包含了影响MyBatis行为甚深的设置(setting)和属性(properties)信息。文档的顶层结构如下:
        configuration配置
        properties属性:可以加载properties配置文件的信息
            可以使用properties来引入外部properties配置文件的内容
                resources:引入类路径下的资源
                url:引入网路路径或者磁盘路径下的资源文件
        setting设置:可以设置MyBatis的全局属性
            包含很多重要的设置项:
            setting:用来设置每一个设置
                name:设置项名
                value:设置项取值
                如:驼峰式命名
                .mapUnderscopeToCameICase:自动完成数据表标准列名和持久化类标准属性名之间的映射
        typeAliases:类型命名
            作用: A type alias is simply a shorter name for a Java type
            typeAliases:别名处理器,可以为我们的java类型起别名,别名不区分大小写
            typeAlias:为某个java类型起别名
                type:指定要起别名的类型全类名;默认别名就是类名小写
                alias:执行新的别名
                package:为某个包下的所有类批量起别名
                name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名[类名小写])
                不建议使用别名,建议使用全类名,看sql语句是怎么被封装为java对象是较为简单
        typeHandlers:类型处理器
            负责如何将数据库的类型和java对象类型之间转换的工具类
            如:将数据库中的varchar类型和java类对象的String数据类型转换
        plugins插件
        environments环境变量
            用于配置MyBatis的开发环境,MyBatis可以配置多种环境,default指定使用某种环境。可以达到快速切换环境
            environment:配置一个具体的环境信息,必须有两个标签,id代表环境的唯一表示
        transactionManager事务管理器
            type:事物管理器的类型,type="[JDBC|MANAGED]",这两个都是别名
            在Configuration类中的可以查看具体类!但是Spring对事务的控制才是最终的管理方案!
                JDBC:这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务
                MANAGED:这个配置几乎没做什么,他从来不提交和回滚一个连接,而是让容器来管理事务的整个生命周期
            综上:如果要配置事务管理器,就配置为JDBC。表示使用本地的JDBC事务。
            当然也可以自定义事务管理器:只需要和人家一样实现TransationFactory接口
                type:指定为全类名
                        
        dataSource数据源
        
            type:type="[UNPOOLED|POOLED|JNDI]"
                    unpooled:无数据库连接池
                    pooled:有数据库连接池
                    JNDI:
                自定义数据源:实现DataSourceFactory接口,type也是全类名
                
            引申:如何自定义第三方数据源,参考Configuration中的POOLED类实现
            需要自定义一个类继承UnpooledDataSourceFactory类,然后在构造器中初始化该对应的dataSource属性
            
        databaseIdProvider数据库厂商标识
            MyBatis is able to execute different statements depending on your database vendor
            MyBatis可以根据不同的数据库厂商执行不同的语句
            
            这样在执行不同数据库的时候、就会执行不同数据库的语句了!优点:在service层值需要调用一个
            mybatis的方法,而不需要关注底层选择使用的数据库

        mappers映射器
            Mappers:将sql映射注册到全局配置文件中
            mapper:注册一个sql映射
                注册配置文件:
                    resources:引用类路径下的sql映射文件
                        mybatis/mapper/EmployeeMapper.xml
                    url:引用网路路径或者磁盘路径下的sql映射文件
                        url="file://var/mappers/AuthorMapper.xml"
        
        注册接口:
            class:引用(注册)接口
                1.有sql映射文件,映射文件名必须和接口同名,并且与接口放在同一个目录下
                2.没有sql映射文件,所有的sql都是利用注解写在接口上
            推荐:
                比较重要的,复杂的Dao接口我们来写sql映射文件
                不重要,简单的Dao接口为了开发快速可以使用注解
                
        最后是全局配置文件中标签实际上是有顺序的!
        
        
    MyBatis的接口方法参数
        参数类型为一个参数
        参数类型为两个参数或者多个参数
        参数类型为Map
        参数类型为POJO
        参数类型为Collection和List,不能为set
        
    MyBatis查看发送的sql语句:
        1.需要导入log4j的jar包或者maven依赖
        2.需要在类路径下加入log4j.xml文件
        
    MyBatis各种返回值类型:
        返回值类型为:Integer/Long/Boolean
        返回值类型为POJO
        返回值类型为List列表
        返回值类型为Map
            一条记录
            多条记录
        返回为一个ResultMap:自定义结果集映射规则
        
    MyBatis的关联关系:
        一对一,多对一,一对多,多对多
        
        对一关联关系[三种解决方案]:
            1.resultMap的result标签连缀的方式
            2.使用association标签,一步到位
            3.使用association标签,分步查询
            
        对于第三种存在懒加载机制[按需加载,也叫懒加载]:
            对多关联关系[两种解决方案]:
                2.使用association标签,一步到位
                2.使用association标签,分步查询
    
    动态sql:
        if:字符判断
        choose(when otherwise):分支选择
        trim(where,set):字符串截取,其中where标签封装查询条件,set标签封装修改条件
        foreach
        
    MyBatis缓存机制:
    缓存是为了加快查询效率
        一级缓存:sqlSession级别的缓存,默认是开启的,无法关闭
        myBatis一级缓存:sqlSession级别的缓存,自动开启
        一级缓存的四种情况:
            1.sqlSession对象不同
            2.sqlSession对象相同,但是查询条件不同
            3.sqlSession对象、查询条件相同,但是在两次查询之间,对数据表进行了增删改查操作
            4.sqlSession对象、查询条件相同,但是在两次查询之间,手动清空
        二级缓存:Mapper接口级别[namesoace],默认是关闭的,需要手动开启
            1.在MaBatis的全局配置文件中开启二级缓存
            2.在对应的sql用社文件中加入<cache>标签
            3.必须是在一级缓存关闭的情况下,二级缓存才能使用
            4.放入到二级缓存中的对象所在的类必须是实现了序列化接口

 

posted @ 2019-11-08 09:08  LadyGodiva  阅读(124)  评论(0编辑  收藏  举报