mybatis Summary - contents

1. mybatis is a persistence framework to achieve the encapsulation of JDBC simplifies JDBC development process.

2. mybatis Works and Process

 

mybatis architecture

SqlSession : 

  Receiving developers Statement Id and parameters . And returns the operation result

Executor:

MyBatis actuator is MyBatis core scheduling, responsible SQL statement and generate query cache maintenance

 StatementHandler:

It encapsulates the JDBC Statement operation, is responsible for the JDBC statement operations, such as setting parameters, Statement The result set into a List collection.

 ParameterHandler:

Responsible for user parameters passed into JDBC Statement required parameters

 ResultSetHandler:

Responsible JDBC returned ResultSet result set of objects into a List collection type

 Type Transfers:

Responsible for java data type and jdbc mapping and conversion between data types

 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值

 

这里存在一些潜在的问题:

  • 为了确保名称空间的唯一性,通常会使用相对较长的、且有一定含义的字符串来作为其值,这样就很难保证我们在代码不出现拼写错误的情况,即使是直接从映射文件拷贝过来的,也存在不经意间被修改的可能性;
  • 从selectXXX方法的签名可以看到,她的第二个参数是Object类型,那么如果我们传入的参数类型与映射文件中由parameterType属性指定的类型不一致时,将会出现不可预知的错误
  • 同样,selectXXX方法返回值使用了泛型,我们须确保用于接收其返回值的变量类型与映射文件中属性resultType指定的类型相一致

7. 什么是动态SQL

  根据用户提供的参数,通过一些标签来动态决定sql语句的内容

  

  <where>可以自动的将第一个条件前面的逻辑运算符(or ,and)去掉 

  <set>会在成功拼接的条件前加上SET单词且最后一个”,”号会被无视掉

8. 拦截器

拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法。Mybatis拦截器设计的一个初衷就是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑

 

Guess you like

Origin www.cnblogs.com/yintingting/p/11748476.html