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