首页 > 其他分享 >MyBatis知识

MyBatis知识

时间:2023-10-04 15:12:53浏览次数:26  
标签:对象 数据库 知识 -- 参数 SQL MyBatis

MyBatis

MyBatis 是一款优秀的半自动的ORM持久层框架,它支持自定义 SQL、存储过程以及高级映射。

MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

持久层:可以立即保存在磁盘上,在这里可以理解为与数据库相关操作。

1.什么是ORM

OBject Relation Mapping 对象关系映射,对象指的是面向面向对象,关系指的是数据库中的表,例如:Java语言中的POJO类与数据库模型之间的对应关系。

 2.为什么MyBatis是半自动ORM框架

public class User(){
    private long id;
    private String realname;
}
User user = user .getById(3);
SELECT `id`,`realname` FROM `user` WHERE `id` = 3;

以上用例为ORM框架部分执行代码,发现在ORM框架中不需要使用SQL语句,大大减少了程序员学习成本和SQL语句维护成本,另外当数据库产品更换的之后无需重新编写项目中的SQL语句。

MyBaits工作原理

JDBC核心对象

1.DriverManager,数据库驱动管理对象
2.Connection,数据库连接对象
3.Statement | PrepareStatement ,操作数据库SQL语句对象
4.ResultSet,结果集对象

MyBaits核心对象

1.SqlSession对象,该对象包含了执行SQL语句的所有方法,例如JDBC里面Connection

2.Executor接口,将传递过来的参数动态生成SQL语句,负责查询缓存。

3.MappedStatement对象,该对象负责对SQL封装,用于存储需要映射的SQL语句及参数等信息

4.ResultHandler对象,用户返回结果集合,封装成最红想要的数据类型,可以自定义返回类型

Mybatis完整核心配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--
        这些属性可以在外部进行配置,并可以进行动态替换。
        你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置
    -->
    <properties resource="config.properties"/>
    <settings>
        <!-- 驼峰命名与下划线自动转换 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!-- log日志 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!-- 延迟加载 -->
        <!-- lazyLoadingEnabled     延迟加载总开关 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--
            true    侵入式延迟  访问主对象及主对象里面的属性时,不光会加载主对象(即从数据库中查询主对象的信息),还会一同加载关联对象。 积极加载
            false    深度延迟    访问主对象属性时,只加载主,只有当访问关联对象的属性时,才会去加载关联对象。 按需加载
            默认值为false
        -->
        <!--<setting name="aggressiveLazyLoading" value="true"/>-->
        <setting name="aggressiveLazyLoading" value="false"/>
        <!--开启缓存-->
        <!--<setting name="cacheEnabled" value="true" />-->
    </settings>
    <typeAliases>
        <!--
          别名
          type    类的完全限定名
          alias    别名
        -->
        <!--为某个类指定别名-->
        <!--<typeAlias alias="login" type="com.lihaozhe.pojo.Login"/>-->
        <!--为某个包下的所有类指定别名 别名默认为类的首字母小写之后的字符串-->
        <package name="com.lihaozhe.pojo"/>
        <package name="com.lihaozhe.vo"/>
    </typeAliases>
    <plugins>
        <!-- com.github.pagehelper为PageHelper类所在包名 -->
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!--
                1. helperDialect :分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置 helperDialect 属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:
                oracle , mysql , mariadb , sqlite , hsqldb , postgresql , db2 , sqlserver , informix , h2 , sqlserver2012 , derby
                特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012 ,否则会使用 SqlServer2005 的方式进行分页。 你也可以实现 AbstractHelperDialect ,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。
                2. offsetAsPageNum :默认值为 false ,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。
                3. rowBoundsWithCount :默认值为 false ,该参数对使用 RowBounds 作为分页参数时有效。当该参数设置为 true 时,使用 RowBounds 分页会进行 count 查询。   
                4. pageSizeZero :默认值为 false ,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。
                5. reasonable :分页合理化参数,默认值为 false 。当该参数设置为 true 时, pageNum<=0 时会查询第一页, pageNum>pages (超过总数时),会查询最后一页。默认 false 时,直接根据参数进行查询。
                6. params :为了支持 startPage(Object params) 方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable ,不配置映射的用默认值, 默认值为 pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero= pageSizeZero 。
                7. supportMethodsArguments :支持通过 Mapper 接口参数来传递分页参数,默认值 false ,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest 。
                8. autoRuntimeDialect :默认值为 false 。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择 sqlserver2012 ,只能使用 sqlserver ),用法和注意事项参考下面的场景五。
                9. closeConn :默认值为 true 。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认 true 关闭,设置为 false 后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。
            -->
            <!-- 方言 -->
            <property name="helperDialect" value="mysql"/>
            <!--
                默认值为 false,当该参数设置为 true 时, 如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果
                (相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。
            -->
            <property name="pageSizeZero" value="true"/>
            <!--
               分页合理化参数,默认值为false。当该参数设置为 true 时, pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。
               默认false 时,直接根据参数进行查询
            -->
            <property name="reasonable" value="true" />
        </plugin>
    </plugins>
    <!--
        MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。
        例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。
    -->
    <!--默认使用的环境 ID(比如:default="development")。-->
    <environments default="development">
        <!--每个 environment 元素定义的环境 ID(比如:id="development")。-->
        <environment id="development">
            <!--事务管理器的配置(比如:type="JDBC")。-->
            <!--
                事务管理器(transactionManager)
                在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):
                JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
                MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。
                默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
                如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
                这两种事务管理器类型都不需要设置任何属性。它们其实是类型别名,换句话说,你可以用 TransactionFactory 接口实现类的全限定名或类型别名代替它们。
            -->
            <transactionManager type="JDBC"/>
            <!--数据源的配置(比如:type="POOLED")-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--
        既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。
        但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。
        在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。
        你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。
    -->
    <mappers>
        <!-- 使用相对于类路径的资源引用 -->
        <!--<mapper resource="com/lihaozhe/mapper/PersonMapper.xml"/>-->
        <!-- 使用完全限定资源定位符(URL) -->
        <!--<mapper url="file:///home/lhz/ideaproject/mybatis/src/main/resources/com/lihaozhe/mapper/PersonMapper.xml" />-->
        <!-- 将包内的映射器接口实现全部注册为映射器 -->
        <package name="com.lihaozhe.mapper"/>
    </mappers>
</configuration>

 

标签:对象,数据库,知识,--,参数,SQL,MyBatis
From: https://www.cnblogs.com/qizhiwei/p/17742272.html

相关文章

  • 两种方法获取电话区号,检验我们对Excel基础知识储备的反应能力!
    1职场实例小伙伴们大家好,今天我们专门拿出一个篇幅讲解一下如何在Excel中提取座机电话的区号。如下图所示:是一张各个单位的联系信息,其中的B列为座机电话号码,座机电话号码有一个特点:就是有一个间隔符“-”将一串数字分成了左右两段,左段数字为区号,右段数字为号码。现在我们需要在C列......
  • 建造机器人农场需要哪些知识储备?
    建造机器人农场需要的知识储备主要包括以下几个方面:农业科学:了解农作物和动物的生长周期、生长环境、养分需求等方面的知识,以便为机器人农场的设计和管理提供科学依据。机器人技术:掌握机器人技术的基本原理和设计方法,包括机器人机械结构、传感器、控制系统等方面的知识,以便设计和制......
  • mybatis项目启动报错:reader entry: ���� = v
    问题再现在SSM项目中,启动程序时控制台会报乱码,如下图所示:解决方案一去掉mybatis配置文件中关于别名的配置,然后在mapper.xml文件中使用完整的类名。待删除的示例代码如下:<typeAliases><packagename="com.tiku.domain.entity"/></typeAliases>解决方案二添加新的依赖......
  • 网络基础知识
    ==============================掩码位变长24掩码位/22借2位1变4  主机1024-2        /21借3位1变8  主机2048-2        /20 借4位1变16 主机4096-2十进制掩码    掩码长度   主机数目   0    ......
  • Java语言基础知识全总结
    一.Java的优点1.      跨平台性。一次编译,到处运行。Java编译器会将Java代码编译成能在JVM上直接运行的字节码文件,C++会将源代码编译成可执行的二进制代码文件,所以C++执行速度快2.      纯面向对象。Java所有的代码都必须在类中书写。C++兼具面向对象和面向过程的特......
  • Mybatis - 通过中间表查询表A和表B
    中间表中间表存储了表A的id和表B的id,除此之外还存储了自身需要的字段,如创建时间、id。xml很简单,通过多个子查询获取数据就可以了,将中间表的字段传递给子查询的column,子查询获取这个参数进行where条件查询。<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmappe......
  • 对 cozyhosting 的学习到的新知识
    分段反向shell然后还学习到一个新姿势,查了一些资料。首先使用如下命令来创建一个与攻击者的tcp连接,并将标准输入(0)重定向到这个连接,sh是一个子shell的标记,用来在括号内执行命令。;`(sh)0>/dev/tcp/ip/9999`之后执行如下将标准输出(1)和标准错误(2)都重定向到标准输入(......
  • Mybatis查询报错 foreach 子查询 (invalid comparison)
    Mybatis查询报错invalidcomparison:java.lang.Stringand[Ljava.lang.String;原因去掉黄色部分<iftest="null!=businessTypeand''!=businessType">  andt.businessTypein     <foreachcollection="businessType"......
  • MyBatis 注解写 SQL 判断空字符串 或 判断为空
    XXXXMapper接口:这里判断数据不能为空@Select("<script>" +"select*fromgs_store" +"<where>" +" <iftest='storeTel!=null'>" +" andstore_tel=#{storeTel}" +" <......
  • mybatis出现错误 java lang NumberFormatException:For input string:A1
    使用mybatis,当使用map传参并且在iftest判断时使用map中所传的参数时,可能会产生如题的报错,具体报错信息见下图:分析这个错误,自己调试也找过度娘,“坚信”自己代码并没问题,但是问题始终无法解决。最后在一个帖子看到说iftest判断时,传入的参数跟匹配的值类型必须一致,于是调整了自己代......