zoukankan      html  css  js  c++  java
  • 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.放入到二级缓存中的对象所在的类必须是实现了序列化接口
  • 相关阅读:
    centos7刚安装解决网络问题
    python matplotlib的常用绘图方法
    python实现最小可编辑距离
    JDBC快速入门
    关于MYSQL常用操作查询语言
    3w字详解java集合
    ELK实时日志分析平台环境部署--完整记录(转)
    ELK简介(转)
    python格式化输出(% & format)
    ElasticSearch查询 搜索 | 更新 | 查询
  • 原文地址:https://www.cnblogs.com/marrycode/p/11818062.html
Copyright © 2011-2022 走看看