多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php框架 > 框架設(shè)計(jì) > 深入淺出Mybatis-sql自動(dòng)生成

深入淺出Mybatis-sql自動(dòng)生成

來源:程序員人生   發(fā)布時(shí)間:2017-03-04 08:59:00 閱讀次數(shù):9024次

本文提供了1種自動(dòng)生成sql語句的方法,它針對(duì)的對(duì)象是有主鍵或唯1索引的單表,提供的操作有增、刪、改、查4種。理解本文和本文的提供的代碼需要有java注解的知識(shí),由于本文是基于注解生成sql的。本文適配的mybatis版本是3.2.2。

準(zhǔn)備

為何在StatementHandler攔截

深入淺出MyBatis-Sqlsession章節(jié)介紹了1次sqlsession的完全履行進(jìn)程,從中可以知道sql的解析是在StatementHandler里完成的,所以為了自動(dòng)生成sql需要攔截StatementHandler。

MetaObject簡介

在我的實(shí)現(xiàn)里大量使用了MetaObject這個(gè)對(duì)象,因此有必要先介紹下它。MetaObjectMybatis提供的1個(gè)的工具類,通過它包裝1個(gè)對(duì)象后可以獲得或設(shè)置該對(duì)象的本來不可訪問的屬性(比如那些私有屬性)。它有個(gè)3個(gè)重要方法常常用到:

1)       MetaObject forObject(Object object,ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory)

2)       Object getValue(String name)

3)       void setValue(String name, Object value)

方法1)用于包裝對(duì)象;方法2)用于獲得屬性的值(支持OGNL的方法);方法3)用于設(shè)置屬性的值(支持OGNL的方法);

插件的原理

參見深入淺出Mybatis-插件原理。

 

有了上面這些基礎(chǔ)知識(shí)的準(zhǔn)備后,就能夠我們的主題了。

攔截器簽名

[java] view plain copy
  1. @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class})})  
  2. public class AutoMapperInterceptor implements Interceptor {  
  3. ...  
  4. }  

從簽名里可以看出,要攔截的目標(biāo)類型是StatementHandler(注意:type只能配置成接口類型),攔截的方法是名稱為prepare參數(shù)為Connection類型的方法。

intercept的實(shí)現(xiàn)

[java] view plain copy
  1. @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class})})  
  2. public class AutoMapperInterceptor implements Interceptor {  
  3.     private static final Log logger = LogFactory.getLog(AutoMapperInterceptor.class);  
  4.     private static final ObjectFactory DEFAULT_OBJECT_FACTORY = new DefaultObjectFactory();  
  5.     private static final ObjectWrapperFactory DEFAULT_OBJECT_WRAPPER_FACTORY = new DefaultObjectWrapperFactory();  
  6.   
  7.     @Override  
  8.     public Object intercept(Invocation invocation) throws Throwable {  
  9.         StatementHandler statementHandler = (StatementHandler) invocation.getTarget();  
  10.         MetaObject metaStatementHandler = MetaObject.forObject(statementHandler, DEFAULT_OBJECT_FACTORY,  
  11.                 DEFAULT_OBJECT_WRAPPER_FACTORY);  
  12.         // 分離代理對(duì)象鏈  
  13.         while (metaStatementHandler.hasGetter("h")) {  
  14.             Object object = metaStatementHandler.getValue("h");  
  15.             metaStatementHandler = MetaObject.forObject(object, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY);  
  16.         }  
  17.         // 分離最后1個(gè)代理對(duì)象的目標(biāo)類  
  18.         while (metaStatementHandler.hasGetter("target")) {  
  19.             Object object = metaStatementHandler.getValue("target");  
  20.             metaStatementHandler = MetaObject.forObject(object, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY);  
  21.         }  
  22.         String originalSql = (String) metaStatementHandler.getValue("delegate.boundSql.sql");  
  23.         Configuration configuration = (Configuration) metaStatementHandler.getValue("delegate.configuration");  
  24.         Object parameterObject = metaStatementHandler.getValue("delegate.boundSql.parameterObject");  
  25.         if (null == originalSql || "".equals(originalSql)) {  
  26.             String newSql = "";  
  27.             MappedStatement mappedStatement = (MappedStatement) metaStatementHandler  
  28.                     .getValue("delegate.mappedStatement");  
  29.             // 根據(jù)ID生成相應(yīng)類型的sql語句(id需剔除namespace信息)  
  30.             String id = mappedStatement.getId();  
  31.             id = id.substring(id.lastIndexOf(".") + 1);  
  32.             if ("insert".equals(id)) {  
  33.                 newSql = SqlBuilder.buildInsertSql(parameterObject);  
  34.             } else if ("update".equals(id)) {  
  35.                 newSql = SqlBuilder.buildUpdateSql(parameterObject);  
  36.             } else if ("delete".equals(id)) {  
  37.                 newSql = SqlBuilder.buildDeleteSql(parameterObject);  
  38.             } else if ("select".equals(id)) {  
  39.                 newSql = SqlBuilder.buildSelectSql(parameterObject);  
  40.             }  
  41.             logger.debug("Auto generated sql:" + newSql);  
  42.             //  
  43.             SqlSource sqlSource = buildSqlSource(configuration, newSql, parameterObject.getClass());  
  44. &n
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 欧美stockingssexxxx| 伊人网站在线观看 | 欧美成人免费观看国产 | 久久精品国产国语对白 | 国产片免费看 | 午夜影院在线观看视频 | 免费在线中文字幕 | 欧美综合在线视频 | 午夜91理论片| 久久99欧美 | 99成人在线视频 | 国产一区二区三区四区 | 亚洲精品专区 | 色77777| 久久久久一区二区三区 | 国产精品乱码免费一区二区 | 久久久精品国产 | 亚洲精品天堂在线观看 | 最近中文字幕完整国语视频 | 欧美日韩一区二区三区色综合 | 亚洲日本1区2区3区二区 | 日本中文字幕一区二区有码在线 | 欧美日韩1区 | 女人18一级特级毛片免费看 | 亚州黄色网址 | 亚洲视频福利 | xxxxx性欧美hd另类 | 在线综合亚洲欧美网站天堂 | 国产精品99久久久久久www | 久久国产高清一区二区三区 | 成人交性视频免费看 | 亚洲精品嫩草研究院久久 | 国产欧美二区 | 最近中文字幕无吗免费视频 | 亚洲午夜免费视频 | 久久精品这里是免费国产 | 一区二区在线视频 | 黄色欧美一级片 | 日本欧美一区二区三区在线 | 日本免费色视频 | 欧美孕妇乱大交xxxxx |