欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis的结构和配置

程序员文章站 2023-11-14 09:15:10
概述MyBatis将用户从JDBC的访问中解放出来,用户只需要定义需要操作的SQL语句,无须关注底层的JDBC操作,就可以面向对象的方式进行持久层操作。底层数据库连接的获取、数据访问的实现、事务控制等都无须用户关心,从而将应用层从底层的JDBC API中抽取出来,通过配置文件管理JDBC的连接,使用... ......

概述
mybatis将用户从jdbc的访问中解放出来,用户只需要定义需要操作的sql语句,无须关注底层的jdbc操作,就可以面向对象的方式进行持久层操作。底层数据库连接的获取、数据访问的实现、事务控制等都无须用户关心,从而将应用层从底层的jdbc api中抽取出来,通过配置文件管理jdbc的连接,使用mybatis解决持久化访问的实现。
mybatis的体系结构
mybatis中常用的对象有sqlsessionfactory和sqlsession。
sqlsessionfactory
sqlsessionfactory是mybatis的关键对象,是单个数据库映射关系经过编译后的内存镜像。该对象的实例通过sqlsessionfactorybuilder对象来获得,而sqlsessionfactorybuilder则可以从xml配置文件或一个预先定制的configuration的实例构建出sqlsessionfactory的实例。每一个mybatis的应用程序都以一个sqlsessionfactory对象的实例为核心。
它是线程安全的,sqlsessionfactory一旦被创建,应该在应用执行期间都存在。在应用运行期间不要重复创建,建议使用单例模式。sqlsessionfactory是sqlsession的工厂,使用sqlsessionfactory.opensession()方法创建sqlsession对象(前文连接:)。
sqlsession
sqlsession是mybatis的关键对象,是执行持久化操作的对象,类似于jdbc中的connection。它是应用程序与持久存储层之间执行交互操作的一个单线程对象,也是mybatis执行持久化操作的关键对象。
sqlsession对象完全包含以数据库为背景的所有执行sql操作的方法,它的底层封装了jdbc连接,可以用sqlsession实例来直接执行已经映射的sql语句。每个线程都应该有自己的sqlsession实例。
sqlsession实例不能被共享,也是线程不安全的,绝对不能将sqlsession实例的引用放在任何类型的管理范围中,应该确保使用完sqlsession之后将它关闭。
sqlsession的方法见如下源码程序:

  1 public interface sqlsession extends closeable {
  2     <t> t selectone(string var1);
  3 
  4     <t> t selectone(string var1, object var2);
  5 
  6     <e> list<e> selectlist(string var1);
  7 
  8     <e> list<e> selectlist(string var1, object var2);
  9 
 10     <e> list<e> selectlist(string var1, object var2, rowbounds var3);
 11 
 12     <k, v> map<k, v> selectmap(string var1, string var2);
 13 
 14     <k, v> map<k, v> selectmap(string var1, object var2, string var3);
 15 
 16     <k, v> map<k, v> selectmap(string var1, object var2, string var3, rowbounds var4);
 17 
 18     <t> cursor<t> selectcursor(string var1);
 19 
 20     <t> cursor<t> selectcursor(string var1, object var2);
 21 
 22     <t> cursor<t> selectcursor(string var1, object var2, rowbounds var3);
 23 
 24     void select(string var1, object var2, resulthandler var3);
 25 
 26     void select(string var1, resulthandler var2);
 27 
 28     void select(string var1, object var2, rowbounds var3, resulthandler var4);
 29 
 30     int insert(string var1);
 31 
 32     int insert(string var1, object var2);
 33 
 34     int update(string var1);
 35 
 36     int update(string var1, object var2);
 37 
 38     int delete(string var1);
 39 
 40     int delete(string var1, object var2);
 41 
 42     void commit();
 43 
 44     void commit(boolean var1);
 45 
 46     void rollback();
 47 
 48     void rollback(boolean var1);
 49 
 50     list<batchresult> flushstatements();
 51 
 52     void close();
 53 
 54     void clearcache();
 55 
 56     configuration getconfiguration();
 57 
 58     <t> t getmapper(class<t> var1);
 59 
 60     connection getconnection();
 61 }
 62 


具体解释,此处不做记录,使用时查询即可。
注意:
实际应用中很少直接使用drivermanager来获取数据库连接,通常使用datasource来获取数据库连接,sqlsessionfactory底层封装了datasource。

mybatis的配置文件
此处回顾前文的test测试类文件代码:

  1 public class test {
  2     public static void main(string[] args) throws ioexception {
  3         inputstream inputstream = resources.getresourceasstream("mybatis-config.xml");
  4         sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream);
  5         sqlsession sqlsession = sqlsessionfactory.opensession();
  6         user user = new user("snow","男",20);
  7         sqlsession.insert("com.snow.dcl.mapper.usermapper.saveuser",user);
  8         sqlsession.commit();
  9         sqlsession.close();
 10     }
 11 }


首先,读取mybatis-config.xml配合文件:

  1 inputstream inputstream = resources.getresourceasstream("mybatis-config.xml");


然后初始化mybatis,创建sqlsessionfactory的实例:

  1 sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream);


最后获取sqlsession对象,执行sql语句:

  1 sqlsession sqlsession = sqlsessionfactory.opensession();
  2 ...
  3 sqlsession.insert("com.snow.dcl.mapper.usermapper.saveuser",user);


由此可见,mybatis的初始化过程要经过以下步骤:
1.调用sqlsessionfactorybuilder对象的build(inputstream)方法。
2.sqlsessionfactorybuilder会根据输入流inputstream等信息创建xmlconfigbuilder对象。
3.sqlsessionfactorybuilder调用xmlconfigbuilder对象的parse()方法。
4.xmlconfigbuilder对象解析xml配置文件返回configuration对象。
5.sqlsessionfactorybuilder根据configuration对象创建一个defaultsessionfactory对象。
6.sqlsessionfactorybuilder返回defaultsessionfactory对象给客户端,供客户端使用。
配置文件属性
mybatis的配置文件包含了如下结构:
1.properties属性
properties中的属性都是可外部配置且可动态替换的,既可以在典型的java属性文件中配置,也可以通过properties元素的子元素来传递。
2.settings设置
settings是mybatis中非常重要的设置,会改变mybatis的运行时行为,settings元素示例如下:

  1 <settings>
  2     <!--指定mybatis所用日志的具体实现,开启日志-->
  3     <setting name="logimpl" value="log4j"/>
  4     <!--开启二级缓存-->
  5     <setting name="cacheenabled" value="true"/>
  6 </settings>


其他选项,开发项目时可以按需查询使用,下面列出部分参数:

参数 描述 有效值
cacheenabled 该配置影响所有映射器缓存的全局开关 true/false
lazyloadingenabled 延迟加载的全局开关 true/false
usegenaratedkeys 允许jdbc支持自动生成主键 true/false
logimpl 指定mybatis所用日志的具体实现,未指定时自动查找 slf4j/log4j/log4j2

1.tpyealiases类型命名
类型别名为java类型设置一个简短的别名,只和xml配置有关,存在的意义仅在于减少类完全限定名的冗余。
  1 <typealiases>
  2     <typealias type="user" alias="com.snow.dcl.domain.user"/>
  3 </typealiases>

这样配置时,user可以用在任何使用com.snow.dcl.domain.user的地方。
  1 <typealiases>
  2     <package name="com.snow.dcl.domain"/>
  3 </typealiases>

这样配置时,每一个在com.snow.dcl.domain包中的java bean,在没有注解的情况下,会使用bean的首字母小写的非限定类名来作为别名,例如:com.snow.dcl.domain.user别名为user。
  1 @alias("user")
  2 public class user {
  3     ...
  4 }

若有注解,则别名为注解值。
1.typehandlers类型处理器
无论是mybatis在预处理语句(preparedstatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成java类型。
2.objectfactory对象工厂
mybatis每次创建结果对象的新实例时,都会使用一个对象工厂实例来完成。
3.plugins插件
4.environments环境
   environment环境变量
   transactionmanager事务管理器
   datasource数据源
mybatis的环境配置实际就是数据源的配置。mybatis可以配置多种环境,这种机制使得mybatis可以将sql映射应用于多种数据库中。
注意:
尽管可以配置多个环境,但是每个sqlsessionfactory实例只能选择一个环境。所以若想连接两个数据库,需要创建两个sqlsessionfactory实例。

前文配置内容如下:
  1 <!--环境配置,连接的数据库-->
  2 <environments default="mysql">
  3     <environment id="mysql">
  4         <!--指定事务管理的类型,这里简单使用java的jdbc的提交和回滚设置-->
  5         <transactionmanager type="jdbc"></transactionmanager>
  6         <!--datasource 指连接源配置,pooled是jdbc连接对象的数据源连接池的实现-->
  7         <datasource type="pooled">
  8             <property name="driver" value="com.mysql.jdbc.driver"></property>
  9             <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useunicode=true&amp;characterencoding=utf-8"></property>
 10             <property name="username" value="root"></property>
 11             <property name="password" value="****"></property>
 12         </datasource>
 13     </environment>
 14 </environments>

默认的环境id(default="mysql")。
每个environment元素定义的环境id(id="mysql")。
事务管理器配置( type="jdbc")。
数据源的配置(type="pooled")。
环境id可以随意命名,默认环境id一定要匹配定义的其中一个环境id。
1.databaseidprovider数据库厂商标识
2.mappers映射器
mybatis开着需要自己写sql语句,mapper映射器配置告诉mybatis到哪里去找映射文件,进而找到这些sql语句:
  1 <mappers>
  2     <!--告诉mybatis持久化类的映射文件路径-->
  3     <mapper resource="mapping/usermapper.xml"></mapper>
  4 </mappers>

以上就是对mybatis的结构和配置文件记录。