用了一段時間的springboot,想著百度一下自動生成代碼的方式,包括后面如何生成動態sql方法的方式。 摸索了幾天,整理一下: **
1 自動生成代碼方式:com.baomidou.mybatisplus
**
mvn配置:
<!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.6</version></dependency>
創建包路徑:com.cbe.generator 在com.cbe.generator下創建CodeGenerator類: 一言不合就上代碼
import com
. baomidou
. mybatisplus
. core
. exceptions
. MybatisPlusException
;
import com
. baomidou
. mybatisplus
. core
. toolkit
. StringPool
;
import com
. baomidou
. mybatisplus
. core
. toolkit
. StringUtils
;
import com
. baomidou
. mybatisplus
. generator
. AutoGenerator
;
import com
. baomidou
. mybatisplus
. generator
. InjectionConfig
;
import com
. baomidou
. mybatisplus
. generator
. config
. *
;
import com
. baomidou
. mybatisplus
. generator
. config
. po
. TableInfo
;
import com
. baomidou
. mybatisplus
. generator
. config
. rules
. NamingStrategy
;
import com
. baomidou
. mybatisplus
. generator
. engine
. FreemarkerTemplateEngine
; import java
. util
. ArrayList
;
import java
. util
. List
;
import java
. util
. Scanner
;
public class CodeGenerator { public static String
scanner ( String tip
) { Scanner scanner
= new Scanner ( System
. in
) ; StringBuilder help
= new StringBuilder ( ) ; help
. append ( "請輸入" + tip
+ ":" ) ; System
. out
. println ( help
. toString ( ) ) ; if ( scanner
. hasNext ( ) ) { String ipt
= scanner
. next ( ) ; if ( StringUtils
. isNotEmpty ( ipt
) ) { return ipt
; } } throw new MybatisPlusException ( "請輸入正確的" + tip
+ "!" ) ; } public static void main ( String
[ ] args
) { AutoGenerator mpg
= new AutoGenerator ( ) ; GlobalConfig gc
= new GlobalConfig ( ) ; String projectPath
= System
. getProperty ( "user.dir" ) ;
gc
. setOutputDir ( projectPath
+ "/src/main/java" ) ; gc
. setAuthor ( "liuyuzhu" ) ; gc
. setOpen ( false ) ; gc
. setFileOverride ( true ) ; gc
. setActiveRecord ( true ) ; gc
. setEnableCache ( false ) ; gc
. setBaseResultMap ( true ) ; gc
. setBaseColumnList ( true ) ; mpg
. setGlobalConfig ( gc
) ; DataSourceConfig dsc
= new DataSourceConfig ( ) ; dsc
. setUrl ( "jdbc:mysql://x.x.x.x:3306/xxxx?useUnicode=true&useSSL=false&characterEncoding=utf8" ) ; dsc
. setDriverName ( "com.mysql.jdbc.Driver" ) ; dsc
. setUsername ( "xxxxxx" ) ; dsc
. setPassword ( "xxxxx" ) ; mpg
. setDataSource ( dsc
) ; PackageConfig pc
= new PackageConfig ( ) ; pc
. setModuleName ( scanner ( "模塊名" ) ) ; pc
. setParent ( "com.cbe" ) ; mpg
. setPackageInfo ( pc
) ; InjectionConfig cfg
= new InjectionConfig ( ) { @Override public void initMap ( ) { } } ; String templatePath
= "/templates/mapper.xml.ftl" ;
List
< FileOutConfig> focList
= new ArrayList < > ( ) ; focList
. add ( new FileOutConfig ( templatePath
) { @Override public String
outputFile ( TableInfo tableInfo
) { return projectPath
+ "/src/main/resources/mapper/" + pc
. getModuleName ( ) + "/" + tableInfo
. getEntityName ( ) + "Mapper" + StringPool
. DOT_XML
; } } ) ; cfg
. setFileOutConfigList ( focList
) ; mpg
. setCfg ( cfg
) ; TemplateConfig templateConfig
= new TemplateConfig ( ) ; templateConfig
. setXml ( null
) ; mpg
. setTemplate ( templateConfig
) ; StrategyConfig strategy
= new StrategyConfig ( ) ; strategy
. setNaming ( NamingStrategy
. underline_to_camel
) ; strategy
. setColumnNaming ( NamingStrategy
. underline_to_camel
) ; strategy
. setRestControllerStyle ( true ) ; strategy
. setInclude ( scanner ( "表名" ) ) ; strategy
. setSuperEntityColumns ( "id" ) ; strategy
. setControllerMappingHyphenStyle ( true ) ; strategy
. setTablePrefix ( pc
. getModuleName ( ) + "_" ) ; mpg
. setStrategy ( strategy
) ; mpg
. setTemplateEngine ( new FreemarkerTemplateEngine ( ) ) ; mpg
. execute ( ) ; } }
執行方法如下:執行main方法 輸入模塊包名test,回車;在輸入表名test_case;之后回車就直接生成了代碼了。前提需要建好表。
到這里并沒有結束: 生成類似的結構如下: 其中mapper包中需要給相關Mapper類添加注解@Mapper,給service和impl類添加注解 @Service。這樣便可以不報錯了。
2,關于注入動態代碼模塊: 注明一下:本人不喜歡配置xml,能注解的都注解。個人喜好而已。 首先,完成上述工作后通用的一些增刪改查都是有的。此處生成的是有額外需要的sql; 下面為在mapper接口層注入動態sql,有些sql可以直接寫完注入,有些則需要配置Provider單獨生成。SelectProvider,UpdateProvider等。
@Mapper
public interface TestWorksheetMapper extends BaseMapper < TestWorksheet> { @SelectProvider ( method
= "selectByTaskNoAppName" , type
= WorksheetProvider
. class ) int selectByTaskNoAppName ( @Param ( "taskNo" ) String taskNo
, @Param ( "appName" ) String appName
) ; @UpdateProvider ( method
= "updateByTaskNoAndAppName" , type
= WorksheetProvider
. class ) Boolean
updateByTaskNoAndAppName ( TestWorksheet sheet
, String taskNo
, String appName
) ; @Select ( "SELECT addAppTime, taskNo,taskName,appName, STATUS,genbranchUser, testersStr,bugsNum, producerStr FROM TEST_WORKSHEET WHERE status not in ('合并主干完成','作廢') ORDER BY addAppTime DESC ;" ) List
< TestWorksheet> queryWorkSheetUnDone ( ) ; @Select ( "SELECT addAppTime, taskNo,taskName,appName, STATUS,genbranchUser, testersStr,bugsNum, producerStr FROM TEST_WORKSHEET WHERE status ='合并主干完成' and status !='作廢' ORDER BY addAppTime DESC limit 20;" ) List
< TestWorksheet> queryWorkSheetDone ( ) ; }
method = “updateByTaskNoAndAppName”, type = WorksheetProvider.class method 的值 對應WorksheetProvider 類中的方法名。 接下來我們看WorksheetProvider類; 以最復雜的update為例:
import org
. apache
. ibatis
. jdbc
. SQL
; import com
. cbe
. worksheet
. entity
. TestWorksheet
; public class WorksheetProvider { public String
selectByTaskNoAppName ( String taskNo
, String appName
) { String sql
= "select count(*) from test_worksheet where taskNo='" + taskNo
+ "'" + " and appName='" + appName
+ "' and status!='作廢';" ; return sql
; } public String
updateByTaskNoAndAppName ( TestWorksheet sheet
, String taskNo
, String appName
) {
String sql
= new SQL ( ) { { UPDATE ( "test_worksheet" ) ; if ( sheet
. getAddAppTime ( ) != null
) { SET ( "addAppTime='" + sheet
. getAddAppTime ( ) + "'" ) ; } if ( sheet
. getPtype ( ) != null
) { SET ( "ptype='" + sheet
. getPtype ( ) + "'" ) ; } if ( sheet
. getTeamDesc ( ) != null
) { SET ( "teamDesc='" + sheet
. getTeamDesc ( ) + "'" ) ; } if ( sheet
. getCasesNum ( ) != null
) { SET ( "casesNum='" + sheet
. getCasesNum ( ) + "'" ) ; } if ( sheet
. getExpectedOnlineTime ( ) != null
) { SET ( "expectedOnlineTime='" + sheet
. getExpectedOnlineTime ( ) + "'" ) ; } if ( sheet
. getMaoyanNum ( ) != null
) { SET ( "maoyanNum='" + sheet
. getMaoyanNum ( ) + "'" ) ; } if ( sheet
. getTaskNo ( ) != null
) { SET ( "taskNo='" + sheet
. getTaskNo ( ) + "'" ) ; } if ( sheet
. getActualOnlineTime ( ) != null
) { SET ( "actualOnlineTime='" + sheet
. getActualOnlineTime ( ) + "'" ) ; } if ( sheet
. getExpectedTestDoneTime ( ) != null
) { SET ( "expectedTestDoneTime='" + sheet
. getExpectedTestDoneTime ( ) + "'" ) ; } if ( sheet
. getMergeTime ( ) != null
) { SET ( "mergeTime='" + sheet
. getMergeTime ( ) + "'" ) ; } if ( sheet
. getTestNum ( ) != null
) { SET ( "testNum='" + sheet
. getTestNum ( ) + "'" ) ; } if ( sheet
. getExpectedPutTestTime ( ) != null
) { SET ( "expectedPutTestTime='" + sheet
. getExpectedPutTestTime ( ) + "'" ) ; } if ( sheet
. getPname ( ) != null
) { SET ( "pname='" + sheet
. getPname ( ) + "'" ) ; } if ( sheet
. getAppName ( ) != null
) { SET ( "appName='" + sheet
. getAppName ( ) + "'" ) ; } if ( sheet
. getGenbranchTime ( ) != null
) { SET ( "genbranchTime='" + sheet
. getGenbranchTime ( ) + "'" ) ; } if ( sheet
. getGenbranchUser ( ) != null
) { SET ( "genbranchUser='" + sheet
. getGenbranchUser ( ) + "'" ) ; } if ( sheet
. getPutMergeTime ( ) != null
) { SET ( "putMergeTime='" + sheet
. getPutMergeTime ( ) + "'" ) ; } if ( sheet
. getTestingTime ( ) != null
) { SET ( "testingTime='" + sheet
. getTestingTime ( ) + "'" ) ; } if ( sheet
. getRqtId ( ) != null
) { SET ( "rqtId='" + sheet
. getRqtId ( ) + "'" ) ; } if ( sheet
. getTestersStr ( ) != null
) { SET ( "testersStr='" + sheet
. getTestersStr ( ) + "'" ) ; } if ( sheet
. getBugsNum ( ) != null
) { SET ( "bugsNum='" + sheet
. getBugsNum ( ) + "'" ) ; } if ( sheet
. getTestWorkLoad ( ) != null
) { SET ( "testWorkLoad='" + sheet
. getTestWorkLoad ( ) + "'" ) ; } if ( sheet
. getProducerStr ( ) != null
) { SET ( "producerStr='" + sheet
. getProducerStr ( ) + "'" ) ; } if ( sheet
. getInTime ( ) != null
) { SET ( "inTime='" + sheet
. getInTime ( ) + "'" ) ; } if ( sheet
. getDevelopersStr ( ) != null
) { SET ( "developersStr='" + sheet
. getDevelopersStr ( ) + "'" ) ; } if ( sheet
. getActualPutTestTime ( ) != null
) { SET ( "actualPutTestTime='" + sheet
. getActualPutTestTime ( ) + "'" ) ; } if ( sheet
. getActualTestDoneTime ( ) != null
) { SET ( "actualTestDoneTime='" + sheet
. getActualTestDoneTime ( ) + "'" ) ; } if ( sheet
. getMergedTime ( ) != null
) { SET ( "mergedTime='" + sheet
. getMergedTime ( ) + "'" ) ; } if ( sheet
. getRqter ( ) != null
) { SET ( "rqter='" + sheet
. getRqter ( ) + "'" ) ; } if ( sheet
. getTaskName ( ) != null
) { SET ( "taskName='" + sheet
. getTaskName ( ) + "'" ) ; } if ( sheet
. getFixNum ( ) != null
) { SET ( "fixNum='" + sheet
. getFixNum ( ) + "'" ) ; } if ( sheet
. getStatus ( ) != null
) { SET ( "status='" + sheet
. getStatus ( ) + "'" ) ; } WHERE ( "taskNo='" + taskNo
+ "' and appName='" + appName
+ "'" ) ; } } . toString ( ) ;
return sql
; } }
其中update部分 是自動打印生成的,只是復制過來使用。避免手工編寫。
if ( sheet
. getAddAppTime ( ) != null
) { SET ( "addAppTime='" + sheet
. getAddAppTime ( ) + "'" ) ; }
使用到的工具類如下:
public class SqlProvider { public static String
upperCase ( String str
) { return str
. substring ( 0 , 1 ) . toUpperCase ( ) + str
. substring ( 1 ) ;
} static void update ( String tabname
) { CreUpSql sql
= new CreUpSql ( ) ; String
[ ] [ ] string
= sql
. getFieldsNames ( tabname
) ; for ( int i
= 0 ; i
< string
. length
; i
++ ) { String parm
= string
[ i
] [ 0 ] ;
System
. out
. println ( " if(sheet.get" + upperCase ( parm
) + "() != null){SET(\"" + parm
+ "='\"+sheet.get" + upperCase ( parm
) + "()+\"'\"); }" ) ; } }
public static void main ( String
[ ] args
) { update ( "test_case" ) ;
}
里面用到CreUpSql;
public class CreUpSql { public String
[ ] [ ] getFieldsNames ( String tabname
) { Connection conn
= null
; try { conn
= ConnUtil
. getConn ( ) ; } catch ( Exception e1
) { e1
. printStackTrace ( ) ; } Statement stat
= null
; ResultSet rs
= null
; ResultSetMetaData data
= null
; String
[ ] [ ] resultStrs
= null
; int coloumCount
= 0 ; try { stat
= conn
. createStatement ( ) ; String sql
= "select * from " + tabname
; rs
= stat
. executeQuery ( sql
) ; data
= rs
. getMetaData ( ) ; coloumCount
= data
. getColumnCount ( ) ; resultStrs
= new String [ coloumCount
] [ 2 ] ; for ( int i
= 0 ; i
< coloumCount
; i
++ ) { resultStrs
[ i
] [ 0 ] = data
. getColumnName ( i
+ 1 ) ; resultStrs
[ i
] [ 1 ] = data
. getColumnTypeName ( i
+ 1 ) ; } if ( rs
!= null
) { rs
. close ( ) ; } if ( conn
!= null
) { conn
. close ( ) ; } } catch ( SQLException e
) { e
. printStackTrace ( ) ; } return resultStrs
; } }
這里用到了ConnUtil ;
public class ConnUtil { private final static String DRIVER
= "com.mysql.jdbc.Driver" ; private final static String URL
= "jdbc:mysql://x.x.x.x:3306/xxxx?useUnicode=true&characterEncoding=utf-8" ; private final static String USERNAME
= "xxxx" ; private final static String PASSWORD
= "xxxxxx" ; private static Connection conn
; public static Connection
getConn ( ) throws Exception
{ try { Class
. forName ( DRIVER
) ; conn
= DriverManager
. getConnection ( URL
, USERNAME
, PASSWORD
) ; } catch ( Exception e
) { throw new Exception ( "數據庫連接異常!" ) ; } return conn
; } public void CloseConnection ( ) { if ( null
!= conn
) { try { conn
. close ( ) ; } catch ( SQLException e
) { e
. printStackTrace ( ) ; } } } }
按著步驟就可以執行。親測可用。有問題可以隨時聯系我;歡迎指教。
總結
以上是生活随笔 為你收集整理的MyBatisPlus自动生成代码springboot+mybatis+mysql 以及动态sql生成方法(测试可用版) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。