日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > 框架設計 > 深入淺出Mybatis-sql自動生成

深入淺出Mybatis-sql自動生成

來源:程序員人生   發布時間:2017-03-04 08:59:00 閱讀次數:9045次

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

準備

為何在StatementHandler攔截

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

MetaObject簡介

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

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

2)       Object getValue(String name)

3)       void setValue(String name, Object value)

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

插件的原理

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

 

有了上面這些基礎知識的準備后,就能夠我們的主題了。

攔截器簽名

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

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

intercept的實現

[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.         // 分離代理對象鏈  
  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個代理對象的目標類  
  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.             // 根據ID生成相應類型的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
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 在线视频国产一区 | 国产精品久久久久久影视 | 精品欧美一区二区三区 | 国产精品免费视频观看 | 日本久久中文字幕 | 日韩欧美国产高清 | 一级毛片成人 | 久久艹人人 | 自拍欧美日韩 | 精品视频在线免费看 | 久久精品国产清自在天天线 | 免费成人黄色 | 三级在线播放 | 一区二区福利 | а√最新版天堂中文在线 | 久久综合成人精品亚洲另类欧美 | 黄色成人在线电影 | 高清日韩av | 最新国产露脸在线观看 | 国产天堂av | 久久一级精品 | 国产激情精品一区二区三区 | 中文字幕+乱码+中文乱码图片 | 国产二区在线播放 | 欧美日韩国产精品一区二区 | 不卡视频一区二区三区 | 日韩中文字幕在线播放 | 一区二区三区免费 | 欧美日韩视频在线 | 99久久免费精品视频 | 日本在线精品 | 欧美黄色免费片 | 在线麻豆 | 国产激情一区二区三区 | 国产精品一区二区三区在线 | 玖玖在线播放 | 久久久久国产一区二区三区 | av三级在线播放 | 黄色精品 | 国产精品二区一区二区aⅴ污介绍 | 欧美日产国产成人免费图片 |