1. mybatis是一个持久层框架,实现了对JDBC的封装,简化了JDBC的开发流程。
2. mybatis工作原理与流程
mybatis架构
SqlSession :
接收开发人员提供Statement Id 和参数.并返回操作结果
Executor:
MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
StatementHandler:
封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。
ParameterHandler:
负责对用户传递的参数转换成JDBC Statement 所需要的参数
ResultSetHandler:
负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
TypeHandler:
负责java数据类型和jdbc数据类型之间的映射和转换
MappedStatement:
维护了一条<select|update|delete|insert>节点的封装
SqlSource:
负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回BoundSql表示动态生成的SQL语句以及相应的参数信息
Configuration:
MyBatis所有的配置信息都维持在Configuration对象之中
3. 核心配置文件
3.1 properties : 引入外部属性文件内容,如jdbc.properties
3.2 settings : 开启二级缓存、延迟加载
3.3 typeAliases : 对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。
<typeAlias type="com.test.User" alias="User" />
<package name="com.test" /> 别名就是当前类的简单名称
3.4 environments : 配置多种环境,每个数据库对应一个sqlSessionFactory. 如果你想连接两个数据库,你需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
3.5 mappers : 指定sql映射文件的位置
<mapper resource="sql/UserMapper.xml" /> 相对于类路径下的目录
<mapper class="com.test.UserMapper" /> mapper接口名称和映射文件名称必须相同,且放在同一目录中
<package name="com.test" /> mapper接口名称和映射文件名称必须相同,且放在同一目录中
Mybatis中接口和对应的mapper文件不一定要放在同一个包下,放在一起的目的是为了Mybatis进行自动扫描,并且要注意此时java接口的名称和mapper文件的名称要相同,否则会报异常,由于此时Mybatis会自动解析对应的接口和相应的配置文件,所以就不需要配置mapper文件的位置了。
如果在工程中使用了maven构建工具,那么就会出现一个问题:我们知道在典型的maven工程中,目录结构有:src/main/java和src/main/resources,前者是用来存放java源代码的,后者则是存放一些资源文件,比如配置文件等,在默认的情况下maven打包的时候,对于src/main/java目录只打包源代码,而不会打包其他文件。所以此时如果把对应的mapper文件放到src/main/java目录下时,不会打包到最终的jar文件夹中
为了实现在maven默认环境下打包时,Mybatis的接口和mapper文件在同一包中,可以通过将接口文件放在src/main/java某个包中,而在src/main/resources目录中建立同样的包,这是一种约定优于配置的方式,这样在maven打包的时候就会将src/main/java和src/main/resources相同包下的文件合并到同一包中。
如果不想将接口和mapper文件分别放到src/main/java和src/main/resources中,而是全部放到src/main/java,那么在构建的时候需要指定maven打包需要包括xml文件,具体配置如下:
3.6 typeHandlers : 每当MyBatis 设置参数到PreparedStatement 或者从ResultSet 结果集中取得值时,就会使用TypeHandler 来处理数据库类型与java 类型之间转换
4.
#{} : 采用预编译方式,可以防止SQL注入
${}: 采用直接赋值方式,无法阻止SQL注入攻击
5. resultMap
如果出现了实体类属性名与表中字段名不一致的情况,则无法自动进行对应.此时可以使用resultMap来重新建立实体类与字段名之间对应关系.
6. 为什么要用接口编程?
在Mybatis接口式编程之前,我们先回忆一下前面是如何调用映射文件中的SQL代码的。通常情况下,都是使用SqlSession实例的selectXXX(selectOne, selectList, selectMap)方法来执行映射文件中相应的SQL语句的,这些方法都有一个共同的特征,那就是第一个参数都是String类型的,我们需要使用这个参数明确告之Mybatis我们是需要执行映射文件的哪一个元素下的SQL语句,所以这个参数内容应该是映射文件的名称空间加上相应元素的id值
这里存在一些潜在的问题:
7. 什么是动态SQL
根据用户提供的参数,通过一些标签来动态决定sql语句的内容
<where>可以自动的将第一个条件前面的逻辑运算符(or ,and)去掉
<set>会在成功拼接的条件前加上SET单词且最后一个”,”号会被无视掉
8. 拦截器
拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法。Mybatis拦截器设计的一个初衷就是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑
原文:https://www.cnblogs.com/yintingting/p/11748476.html