https://www.bilibili.com/video/BV1mW411M737
文章目录
- 前言
- 全局配置文件
- 映射文件
- 动态SQL
- 缓存cache
- 整合
- debug记录
-
- Invalid bound statement (not found)
- org.apache.ibatis.executor.ExecutorException: No constructor found in...
- Error querying database. Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for
- Error querying database. Cause: java.lang.NumberFormatException: For input string: xx
前言
连接数据库的工具:
JDBC —> Dbutils(QueryRunner) —> JdbcTemplate
连接数据库主要流程:
- 编写sql
- 预编译
- 设置参数
- 执行sql
- 封装结果
Hibernate:全自动ORM(Object Relation Mapping)框架:旨在消除sql,HQL
缺点:
- 长难复杂SQL,对Hibernate而言处理也不容易
- 难以进行sql优化(sql由框架自动生成)
- 全映射,无法选取部分字段(一些场景,mysql选取部分字段效率更优)
mybatis:半自动化的持久化层框架(轻量级)
- 把sql和java编码分离,sql由开发人员编写
- 原是apache的一个开源项目ibatis(Internet和abatis的组合),后迁移至Google code旗下
全局配置文件
mybatis的配置文件包含了影响mybatis行为甚深的设置(settings)和属性(properties)信息。文档的顶层结构如下:
- configuration
- properties 属性
- settings 设置
- typeAliases 类型命名
- typeHandlers 类型处理器
- objectFactory 对象工厂
- plugins 插件
- environments 环境
- environment 环境变量
- transactionManager 事务管理器
- dataSource 数据源
- databaseIdProvider 数据库厂商标识
- mappers 映射器
<?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>
<!--
1. mybatis可以用properties引入外部properties配置文件的内容
resource引入类路径下的资源 resource="application.properties"
url 引入网络路径或磁盘路径下的资源 url="src/main/resources/application.properties"
-->
<properties resource="application.properties" />
<settings>
<setting name="cacheEnabled" value="false"/>
<setting name="" value=""/>
</settings>
<!--
3. 别名处理器:为java类起别名,不区分大小写
-->
<typeAliases>
<!-- type: java类-->
<!-- alias: 别名,不指定就是默认别名(类名小写)-->
<typeAlias alias="Employee" type="com.km.mpdemo001.pojo.Employee"/>
<!-- package 为某个包下的所有类起批量别名
name: 指定包名(为当前包以及下面所有后代包的每一个类都起一个默认别名(类名小写)
-->
<package name="com.km.mpdemo001.pojo" />
</typeAliases>
<typeHandlers>
<!-- 类型转换器,版本高自动配置-->
<!-- <typeHandler handler="org.apache.ibatis.type.InstantTypeHandler"/>-->
</typeHandlers>
<objectFactory type=""/>
<plugins>
<plugin interceptor="Executor"/>
</plugins>
<!--
可配置多种环境,default: 指定使用环境的id,可以达到快速切换环境的效果
-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<!--
id: 环境的唯一标识
transactionManager type:有两种取值JDBC/MANAGED;
或自定义事务管理器,实现TransactionFactory接口,type指定为全类名
dataSource type: 支持 UNPOOLED / POOLED/ JNDI
-->
<environment id="exclude">
<transactionManager type="MANAGED"/>
<dataSource type="UNPOOLED"/>
</environment>
</environments>
<databaseIdProvider type="DB_VENDOR">
<!-- 为不同的数据库厂商起别名
在sql语句中指定数据库别名 databaseId,当语句的id名相同时,优先选取databaseId对应的
<select id="selectEmployee" resultType="com.km.mpdemo001.pojo.Employee"
databaseId="mysql">
select * from employee where id = #{id}
</select>
-->
<property name="MySQL" value="mysql"/>
<property name="SQL Server" value="sql_server"/>
</databaseIdProvider>
<mappers>
<!-- resource 引用类路径下的sql映射文件-->
<mapper resource="EmployeeMapper.xml"/>
<!-- url 引用网络路径或磁盘路径下的sql映射文件-->
<mapper url="file://c/xxx.xml"/>
<!-- class 注册接口-->
<mapper class="com.km.mpdemo001.pojo.EmployeeImpl" />
<!-- package 批量注册,需要映射文件与类同包下,package写包名-->
<package name=""/>
</mappers>
</configuration>
引入dtd约束
mybatis jar包中有两个dtd文件 (eclipse需要引入,idea添加依赖后自动引入了)
http://mybatis.org/dtd/mybatis-3-config.dtd
http://mybatis.org/dtd/mybatis-3-mapper.dtd
引入会有标签提示。
properties
mybatis可以用properties引入外部properties配置文件的内容
- resource引入类路径下的资源 resource=“application.properties” (当一个文件夹是
- url 引入网络路径或磁盘路径下的资源
当idea中文件夹出现上面root相关的标识时,表示是idea管理下的根目录,那么写类路径的时候可以直接从根目录的下一级目录开始写。
settings
这是mybatis中的极为重要的调整设置
设置参数 | 描述 | 有效值 | 默认值 |
---|---|---|---|
cacheEnabled | 设置影响的所有映射器中设置的缓存的全局开关 | true/false | TRUE |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态 | true/false | FALSE |
useColumnLabel | 使用列标签来代替列名。不同的驱动在这方面会有不同的表现。具体可参考驱动文档或测试这两种不同的模式来观察所用驱动的结果。 | true/false | TRUE |
defaultStatementTimeout | 设置超时时间。它决定驱动等待数据库响应的秒数。 | Any positive integer | Not Set(null) |
mapUnderscoreToCamelCase | 是否开启自动驼峰命名规则 | true/false | FALSE |
typeAliases
别名处理器:对应全类名和别名
<typeAliases>
<!-- type: java类-->
<!-- alias: 别名,不指定就是默认别名(类名小写)-->
<typeAlias alias="Employee" type="com.km.mpdemo001.pojo.Employee"/>
<!-- package 为某个包下的所有类起批量别名
name: 指定包名(为当前包以及下面所有后代包的每一个类都起一个默认别名(类名小写)
-->
<package name="com.km.mpdemo001.pojo"/>
</typeAliases>
也可以使用注解
@Alias("emp")
public class Employee {
}
另外:起别名不要与java默认的重复
int --> _int , byte --> _byte …
Integer --> integer , Byte --> byte …
typeHandlers
解决数据库和java变量数据类型兼容问题
jsr310:时间日期API,mybatis-typehandlers-jsr310.
mybatis3.4以前需要手动注册,之后支持自动注册
objectFactory
plugins
插件可以拦截方法 intercept calls to at certain points with the execution of a mapped statement。
- Executor
- ParameterHandler
- ResultSetHandler
- StatementHandler
environments
可配置多环境
- transactionManager
- type:
- JDBC: 连接数据库
- MANAGED:不提交事务也不回滚,让容器管理transaction的生命周期。e.g. JEE Application Server Context
- 或自定义
- type:
- dataSource type
- UNPOOLED() : 不使用连接池技术
- POOLED
- JNDI(JndiDataSourceFactory):
- 自定义:实现DataSourceFactory接口
databaseIdProvider
驱动getDatabaseProductName() 得到数据库厂商标识
支持多数据库厂商
- DB_VENDOR(VendorDatabaseIdProvider):
<databaseIdProvider type="DB_VENDOR">
<!-- 为不同的数据库厂商起别名
在sql语句中指定数据库别名 databaseId,当语句的id名相同时,优先选取databaseId对应的
<select id="selectEmployee" resultType="com.km.mpdemo001.pojo.Employee"
databaseId="mysql">
select * from employee where id = #{id}
</select>
-->
<property name="MySQL" value="mysql"/>
<property name="SQL Server" value="sql_server"/>
</databaseIdProvider>
mappers
- resource 引用类路径下的sql映射文件
- url 引用网络路径或磁盘路径下的sql映射文件
- class 注册接口
- 若有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下
- 没有sql映射文件,利用注解写在接口上
- package 批量注册
推荐
- 比较重要的和复杂的DAO接口来写sql映射文件
- 不太重要的和简单的可以使用注解来映射。
src和conf都会被加载到bin路径下,bin路径才是类路径 那么当src和conf中存在 相同的包路径,它们将会被合并。
那么使用批量注册时,则不需要sql与java文件放在一起,只须它们的包路径相同即可。
映射文件
-
cache 命名空间的二级缓存配置
-
cache-ref 其它命名空间缓存配置的引用。
-
resultMap 自定义结果集映射
-
parameterMap (已废弃)老式风格的参数映射
-
sql 抽取可重用语句块
-
insert
-
update