golang+walk根据数据库表生成java,proto和模板
2017-11-15 20:49
741 查看
这个是连接数据库并根据数据库中的表生成对应的一些java和proto的信息,用到了
walk这个库,目前只能在window上使用,如果在其他平台就要自己看着办了,
需要处理其他相关的,就需要自己再进行特殊修改了
config.xml
.manifest
TemplatePojo.java
Template.proto
ITemplateDao.java
TemplateDaoImpl.java
TemplateDBQueue.java
walk这个库,目前只能在window上使用,如果在其他平台就要自己看着办了,
需要处理其他相关的,就需要自己再进行特殊修改了
package main // go build -ldflags="-H windowsgui" //go get github.com/akavel/rsrc //rsrc -manifest test.manifest -o rsrc.syso import ( "container/list" "database/sql" "encoding/xml" "fmt" "io/ioutil" "log" "os" "strings" _ "github.com/go-sql-driver/mysql" "github.com/lxn/walk" . "github.com/lxn/walk/declarative" ) /* user@unix(/path/to/socket)/dbname?charset=utf8 user:password@tcp(localhost:5555)/dbname?charset=utf8 user:password@/dbname user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname */ //============================================= type SQLInfo struct { columnName string dataType string columnComment string ucolumnName string ssName string } type XmlData struct { XMLName xml.Name `xml:"data"` Name string `xml:"name,attr"` Url string `xml:",innerxml"` } type XmlConfig struct { XMLName xml.Name `xml:"root"` Data []XmlData `xml:"data"` } //============================== // 处理表名字 func ParseTbName(tbName string) string { s := strings.TrimPrefix(tbName, "t_s_") s = strings.TrimPrefix(s, "t_u_") return s } // 替换字符串 func BigFirstName(str string) string { temp := strings.Split(str, "_") var upperStr string for y := 0; y < len(temp); y++ { vv := []rune(temp[y]) for i := 0; i < len(vv); i++ { if i == 0 { nz := vv[i] if nz <= 'z' && nz >= 'a' { vv[i] -= 32 } //vv[i] -= 32 upperStr += string(vv[i]) // + string(vv[i+1]) } else { upperStr += string(vv[i]) } } } return upperStr } func BigFirstField(str string) string { temp := strings.Split(str, "_") var upperStr string for y := 0; y < len(temp); y++ { vv := []rune(temp[y]) if y != 0 { for i := 0; i < len(vv); i++ { if i == 0 { vv[i] -= 32 upperStr += string(vv[i]) // + string(vv[i+1]) } else { upperStr += string(vv[i]) } } } } return temp[0] + upperStr } func ReadStringFile(fn string) string { bs, err := ioutil.ReadFile(fn) if err != nil { fmt.Println(err) return "" } return string(bs) } //============================== // 处理字段名字 //============================== // 处理 //============================================= type EnvModel struct { walk.ListModelBase Items []string } func NewEnvModel() *EnvModel { m := &EnvModel{Items: make([]string, 10)} for i := 0; i < 10; i++ { m.Items[i] = fmt.Sprintf("name:%d", i) } return m } func (m *EnvModel) ItemCount() int { return len(m.Items) } func (m *EnvModel) Value(index int) interface{} { return m.Items[index] } //========================== type DBWalk struct { Mw *walk.MainWindow Name string conTE *walk.LineEdit // 连接数据的位置信息 conBT *walk.PushButton LbDb *walk.ListBox // 数据库对应的库 LbTb *walk.ListBox // 数据库对应的表格 tabWidget *walk.TabWidget DbModel *EnvModel TbModel *EnvModel Db *sql.DB SelectDb string // 选择的数据库的名字 SelectTb string // 选择的数据库表的名字 t_u_ssn uTbName string // 选择的数据库表修改后的名字 Ssn tbColumns *list.List // 当前数据库表的所有字段 protoTE *walk.TextEdit javaTE *walk.TextEdit dbTE *walk.TextEdit DB2PROTO map[string]string DB2JAVA map[string]string ProtoString string TemplatePojo string ITemplateDao string TemplateDaoImpl string TemplateDBQueue string config XmlConfig } func (self *DBWalk) LoadNConfig() bool { dt, err := ioutil.ReadFile("config.xml") if err != nil { log.Fatal("ReadFile xml:", err) return false } fmt.Printf("%s", dt) err = xml.Unmarshal(dt, &self.config) if err != nil { log.Fatal("Unmarshal xml fail:", err) return false } return true } func (self *DBWalk) SaveNConfig(str string) bool { if str != "" 4000 { if len(self.config.Data) > 0 { self.config.Data[0].Url = str } } bs, err := xml.Marshal(&self.config) if err != nil { log.Fatal("Marshal xml fail:", err) return false } err = ioutil.WriteFile("config.xml", bs, os.ModePerm) if err != nil { log.Fatal("WriteFile xml fail:", err) return false } return true } func (self *DBWalk) ConnectDB(txt string) { self.conTE.SetEnabled(false) self.conBT.SetEnabled(false) fmt.Println(self.Name + txt) var err error self.Db, err = sql.Open("mysql", self.conTE.Text()) if err != nil { fmt.Print(err) return } // 保存一下设置 self.SaveNConfig(self.conTE.Text()) //self.Db.Exec("set names utf8;") // 显示所有数据库 rs, err := self.Db.Query("show databases;") if err != nil { fmt.Print(err) return } l := list.New() for rs.Next() { var dbName string err := rs.Scan(&dbName) if err != nil { fmt.Print(err) return } //fmt.Printf("dbName: %s\n", dbName) l.PushBack(dbName) } rs.Close() self.DbModel.Items = make([]string, l.Len()) i := 0 for e := l.Front(); e != nil; e = e.Next() { self.DbModel.Items[i] = e.Value.(string) i = i + 1 } self.LbDb.SetEnabled(true) self.LbDb.SetModel(self.DbModel) } func (self *DBWalk) OnDbCurrentIndexChanged() { i := self.LbDb.CurrentIndex() dbName := self.DbModel.Items[i] self.SelectDb = dbName // 显示所有表格 uStr := fmt.Sprintf("use %s;", dbName) self.Db.Exec(uStr) rs, err := self.Db.Query("show tables;") if err != nil { fmt.Print(err) return } l := list.New() for rs.Next() { var tbName string err := rs.Scan(&tbName) if err != nil { fmt.Print(err) return } l.PushBack(tbName) } rs.Close() self.TbModel.Items = make([]string, l.Len()) j := 0 for e := l.Front(); e != nil; e = e.Next() { self.TbModel.Items[j] = e.Value.(string) j = j + 1 } self.LbTb.SetEnabled(true) self.LbTb.SetModel(self.TbModel) } func (self *DBWalk) OnDbItemActivated() { //tbName := self.DbModel.Items[self.LbDb.CurrentIndex()] //self.SelectTb = tbName // 进行数据的处理 } func (self *DBWalk) OnTbCurrentIndexChanged() { i := self.LbTb.CurrentIndex() if i >= len(self.TbModel.Items) || i < 0 { return } tbName := self.TbModel.Items[i] self.SelectTb = tbName self.uTbName = BigFirstName(ParseTbName(tbName)) // 针对不同的数据库进行处理 sql := fmt.Sprintf("select COLUMN_NAME,DATA_TYPE,COLUMN_COMMENT from information_schema.COLUMNS where table_name = '%s' and table_schema = '%s';", self.SelectTb, self.SelectDb) l := list.New() //self.Db.Exec("use information_schema;") rs, err := self.Db.Query(sql) if err != nil { fmt.Println(err) return } for rs.Next() { var info SQLInfo err := rs.Scan(&info.columnName, &info.dataType, &info.columnComment) if err != nil { fmt.Print(err) return } info.ucolumnName = BigFirstField(info.columnName) info.ssName = BigFirstName(info.columnName) //fmt.Println(info.columnName, info.dataType, info.columnComment) l.PushBack(info) } rs.Close() self.tbColumns = l self.onParseProp() self.OnParseJava() self.OnParseDbImp() } func (self *DBWalk) OnTbItemActivated() { tbName := self.TbModel.Items[self.LbTb.CurrentIndex()] fmt.Println("OnTbItemActivated value: ", tbName) } func (self *DBWalk) openAction_Triggered() { } func (self *DBWalk) Close() { if self.Db != nil { self.Db.Close() } self.Mw.Close() } func (self *DBWalk) aboutAction_Triggered() { walk.MsgBox(self.Mw, "About", "Walk Image Viewer Example", walk.MsgBoxIconInformation) } func TestWalk() { dbwalk := &DBWalk{ Name: "gogo", DbModel: NewEnvModel(), TbModel: NewEnvModel(), DB2PROTO: map[string]string{ "tinyint": "int32", "smallint": "int32", "mediumint": "int32", "int": "int32", "bigint": "int64", "float": "float", "double": "double", "varchar": "string", "tinytext": "string", "text": "string", "date": "int64", "timestamp": "int64", "datetime": "int64", }, DB2JAVA: map[string]string{ "tinyint": "int", "smallint": "int", "mediumint": "int", "int": "int", "bigint": "long", "float": "float", "double": "double", "varchar": "String", "tinytext": "String", "text": "String", "date": "Date", "timestamp": "Date", "datetime": "Date", }, } if !dbwalk.LoadNConfig() { return } dbwalk.ProtoString = ReadStringFile("template/Template.proto") dbwalk.TemplatePojo = ReadStringFile("template/TemplatePojo.java") dbwalk.ITemplateDao = ReadStringFile("template/ITemplateDao.java") dbwalk.TemplateDaoImpl = ReadStringFile("template/TemplateDaoImpl.java") dbwalk.TemplateDBQueue = ReadStringFile("template/TemplateDBQueue.java") var openAction *walk.Action var defHost string if len(dbwalk.config.Data) > 0 { defHost = dbwalk.config.Data[0].Url } MainWindow{ AssignTo: &dbwalk.Mw, Title: "Db Tool", MenuItems: []MenuItem{ Menu{ Text: "&File", Items: []MenuItem{ Action{ AssignTo: &openAction, Text: "&Open", //Image: "../img/open.png", OnTriggered: dbwalk.openAction_Triggered, }, Separator{}, Action{ Text: "Exit", OnTriggered: func() { dbwalk.Close() }, }, }, }, Menu{ Text: "&Help", Items: []MenuItem{ Action{ Text: "About", OnTriggered: dbwalk.aboutAction_Triggered, }, }, }, }, ToolBarItems: []MenuItem{ ActionRef{&openAction}, }, MinSize: Size{600, 400}, Layout: VBox{MarginsZero: true}, Children: []Widget{ GroupBox{ Layout: HBox{MarginsZero: true}, Children: []Widget{ LineEdit{ AssignTo: &dbwalk.conTE, Text: defHost, }, PushButton{ AssignTo: &dbwalk.conBT, Text: "connect", OnClicked: func() { 12cd1 dbwalk.ConnectDB(dbwalk.conTE.Text()) }, }, }, }, HSplitter{ Children: []Widget{ VSplitter{ MaxSize: Size{100, 65535}, Children: []Widget{ ListBox{ Enabled: false, AssignTo: &dbwalk.LbDb, Model: dbwalk.DbModel, OnCurrentIndexChanged: dbwalk.OnDbCurrentIndexChanged, OnItemActivated: dbwalk.OnDbItemActivated, }, ListBox{ Enabled: false, AssignTo: &dbwalk.LbTb, Model: dbwalk.TbModel, OnCurrentIndexChanged: dbwalk.OnTbCurrentIndexChanged, OnItemActivated: dbwalk.OnTbItemActivated, }, }, }, TabWidget{ AssignTo: &dbwalk.tabWidget, Pages: []TabPage{ TabPage{ Title: "proto", Layout: VBox{MarginsZero: true}, Children: []Widget{ TextEdit{ AssignTo: &dbwalk.protoTE, }, }, }, TabPage{ Title: "java", Layout: VBox{MarginsZero: true}, Children: []Widget{ TextEdit{ HScroll: true, VScroll: true, AssignTo: &dbwalk.javaTE, MaxLength: 4096, }, }, }, TabPage{ Title: "db", Layout: VBox{MarginsZero: true}, Children: []Widget{ TextEdit{ HScroll: true, VScroll: true, AssignTo: &dbwalk.dbTE, MaxLength: 4096, }, }, }, }, }, }, }, }, }.Run() } func main() { TestWalk() //tbName := "t_s_refine_amends" //tbName := "t_u_action_count_record" //fmt.Println(BigFirstName(ParseTbName(tbName))) } func (self *DBWalk) OnParseDbImp() { utbName := self.uTbName var data string // 接口 data += strings.Replace(self.ITemplateDao, "{tbName}", utbName, 10) data += "//=======================================\r\n" // DaoImpl daoData := strings.Replace(self.TemplateDaoImpl, "{tbName}", utbName, 100) daoData = strings.Replace(daoData, "{tbFullName}", self.SelectTb, 100) var daoListData string = "" var fieldData string = "" var inFieldData string = "" var setInFieldData string = "" l := self.tbColumns for e := l.Front(); e != nil; e = e.Next() { // 先添加变量 n := e.Value.(SQLInfo) daoListData += fmt.Sprintf(" p.set%s(rs.get%s(\"%s\"));\r\n", n.ucolumnName, BigFirstName(n.dataType), n.columnName) if e == l.Back() { fieldData += fmt.Sprintf("`%s`", n.columnName) inFieldData += fmt.Sprintf(":%s", n.ucolumnName) setInFieldData += fmt.Sprintf("`%s`=:%s", n.columnName, n.columnName) } else { fieldData += fmt.Sprintf("`%s`,", n.columnName) inFieldData += fmt.Sprintf(":%s,", n.ucolumnName) setInFieldData += fmt.Sprintf("`%s`=:%s,", n.columnName, n.columnName) } } daoData = strings.Replace(daoData, "{SETDATA_LIST}", daoListData, 1) daoData = strings.Replace(daoData, "{tbField}", fieldData, 1) daoData = strings.Replace(daoData, "{tbInField}", inFieldData, 1) daoData = strings.Replace(daoData, "{tbSetInField}", setInFieldData, 1) data += daoData data += "//=======================================\r\n" // DaoQueue queueData := strings.Replace(self.TemplateDBQueue, "{tbName}", utbName, 100) data += queueData self.dbTE.SetText(data) } func (self *DBWalk) OnParseJava() { l := self.tbColumns utbName := self.uTbName //====================== // 生成对应的bean,toJson, toNet, fromJson, toNet var ctx string = strings.Replace(self.TemplatePojo, "{tbName}", utbName, 10) var data string = "" var ssdata string = "" var jsonToData string = " public JSONObject toJson(){\r\n JSONObject p = new JSONObject();\r\n" var jsonFromData string = " public void fromJson(JSONObject p){\r\n" var netToData string = " public Net" + utbName + " toNet(){\r\n Net" + utbName + ".Builder p = Net" + utbName + ".newBuilder(); \r\n" var netFromData string = " public void fromNet(Net" + utbName + " p){\r\n" for e := l.Front(); e != nil; e = e.Next() { // 先添加变量 n := e.Value.(SQLInfo) udataType := self.DB2JAVA[n.dataType] data += fmt.Sprintf(" /** %s */\r\n private %s %s;\r\n", n.columnComment, udataType, n.ucolumnName) // 添加set,get ssdata += fmt.Sprintf(" public void set%s(%s p){\r\n this.%s = p;\r\n }\r\n", n.ssName, udataType, n.ucolumnName) ssdata += fmt.Sprintf(" public %s get%s(){\r\n return this.%s;\r\n }\r\n", udataType, n.ssName, n.ucolumnName) // 添加toJson 添加FromJson if udataType == "String" { jsonToData += fmt.Sprintf(" if (this.get%s() != null){\r\n p.set%s(this.get%s());\r\n }\r\n", n.ssName, n.ssName, n.ssName) //jsonFromData += fmt.Sprintf(" if (this.get%s() != null){\r\n this.set%s(p.get%s());\r\n }\r\n", n.ssName, n.ssName, n.ssName) } else { jsonToData += fmt.Sprintf(" p.set%s(this.get%s());\r\n", n.ssName, n.ssName) } jsonFromData += fmt.Sprintf(" this.set%s(p.get%s());\r\n", n.ssName, n.ssName) // 添加toNet, 添加FromNet if udataType == "String" { netToData += fmt.Sprintf(" if (this.get%s() != null){\r\n p.set%s(this.get%s());\r\n }\r\n", n.ssName, n.ssName, n.ssName) // netFromData += fmt.Sprintf(" if (this.get%s() != null){\r\n this.set%s(p.get%s());\r\n }\r\n", n.ssName, n.ssName, n.ssName) } else { netToData += fmt.Sprintf(" p.set%s(this.get%s());\r\n", n.ssName, n.ssName) } netFromData += fmt.Sprintf(" this.set%s(p.get%s());\r\n", n.ssName, n.ssName) } data += ssdata jsonToData += " return p; \r\n }\r\n" jsonFromData += " }\r\n" data += jsonToData data += jsonFromData netToData += " return p; \r\n }\r\n" netFromData += " }\r\n" data += netToData data += netFromData //======================= // outdata := strings.Replace(ctx, "{content}", data, 10) self.javaTE.SetText(outdata) } func (self *DBWalk) onParseProp() { l := self.tbColumns utbName := self.uTbName ProtoString := strings.Replace(self.ProtoString, "{tbName}", utbName, 10) var data string = fmt.Sprintf("\r\nmessage Net%s { \r\n", utbName) i := 1 for e := l.Front(); e != nil; e = e.Next() { n := e.Value.(SQLInfo) //fmt.Println(n.dataType) udataType := self.DB2PROTO[n.dataType] ss := fmt.Sprintf(" required %s %s = %d;", n.ucolumnName, udataType, i) data += fmt.Sprintf("%-50s // %s\r\n", ss, n.columnComment) i++ } data += "}\r\n" ProtoString = strings.Replace(ProtoString, "{content}", data, 10) self.protoTE.SetText(ProtoString) }
config.xml
<root><data name="host">root:hello@tcp(127.0.0.1:3306)/xx?charset=utf8</data></root>
.manifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="SomeFunkyNameHere" type="win32"/> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/> </dependentAssembly> </dependency> </assembly>
TemplatePojo.java
package com.playmore.game.mhqx.otherworld.data; import java.io.Serializable; import java.util.Date; public class {tbName}Pojo implements Serializable { {content} }
Template.proto
package com.playmore.game.mhqx.cmd.protobuf; option java_outer_classname = "S2C{tbName}Msg"; {content}
ITemplateDao.java
package com.playmore.game.mhqx.otherworld.data; import com.playmore.game.db.IUserDataDao; public interface I{tbName}Dao extends IUserDataDao<{tbName}Pojo> { }
TemplateDaoImpl.java
package com.playmore.game.mhqx.otherworld.data; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport; import org.springframework.jdbc.core.namedparam.SqlParameterSource; public class {tbName}DaoImpl extends NamedParameterJdbcDaoSupport implements I{tbName}Dao { private static final {tbName}DaoImpl DEFAULT = new {tbName}DaoImpl(); public static {tbName}DaoImpl getDefault(){ return DEFAULT; } private static RowMapper<{tbName}Pojo> rowMapper = new RowMapper<{tbName}Pojo>() { @Override public {tbName}Pojo mapRow(ResultSet rs, int rowNum) throws SQLException { {tbName}Pojo p = new {tbName}Pojo(); {SETDATA_LIST} return p; } }; private static final String SQL_QUERY = "select * from {tbFullName} where player_id=?"; private static final String SQL_INSERT = "insert into {tbFullName}({tbField})" + " values({tbInField})"; private static final String SQL_UPDATE = "update {tbFullName} set {tbSetInField} where player_id=?"; private static final String SQL_DELETE = "delete from {tbFullName} where player_id=?"; @Override public int insert({tbName}Pojo data) throws DataAccessException { SqlParameterSource namedParameters = new BeanPropertySqlParameterSource(data); int result = getNamedParameterJdbcTemplate().update(SQL_INSERT, namedParameters); return result; } @Override public int update({tbName}Pojo data) throws DataAccessException { SqlParameterSource namedParameters = new BeanPropertySqlParameterSource(data); int result = getNamedParameterJdbcTemplate().update(SQL_UPDATE, namedParameters); return result; } @Override public List<{tbName}Pojo> queryListByPlayerId(int playerId) throws DataAccessException { return getJdbcTemplate().query(SQL_QUERY, rowMapper, playerId); } @Override public {tbName}Pojo queryByPlayerId(int playerId) throws DataAccessException { try{ return getJdbcTemplate().queryForObject(SQL_QUERY, new Object[] { playerId }, rowMapper); }catch(Exception e){ return null; } } @Override public int delete({tbName}Pojo data) throws DataAccessException { return getJdbcTemplate().update(SQL_DELETE, data.getPlayerId(), data.getPlayerId()); } @Override public int[] batchInsert(Collection<{tbName}Pojo> collection) throws DataAccessException { SqlParameterSource[] batchArgs = new SqlParameterSource[collection.size()]; int index = 0; {tbName}Pojo data = null; for (Iterator<{tbName}Pojo> iterator = collection.iterator(); iterator.hasNext();) { data = iterator.next(); batchArgs[index++] = new BeanPropertySqlParameterSource(data); } return getNamedParameterJdbcTemplate().batchUpdate(SQL_INSERT, batchArgs); } @Override public int[] batchInsert({tbName}Pojo... data) throws DataAccessException { SqlParameterSource[] batchArgs = new SqlParameterSource[data.length]; int index = 0; for (; index < data.length; index++) { batchArgs[index] = new BeanPropertySqlParameterSource(data[index]); } return getNamedParameterJdbcTemplate().batchUpdate(SQL_INSERT, batchArgs); } @Override public int[] batchUpdate(Collection<{tbName}Pojo> collection) throws DataAccessException { SqlParameterSource[] batchArgs = new SqlParameterSource[collection.size()]; int index = 0; {tbName}Pojo data = null; for (Iterator<{tbName}Pojo> iterator = collection.iterator(); iterator.hasNext();) { data = iterator.next(); batchArgs[index++] = new BeanPropertySqlParameterSource(data); } return getNamedParameterJdbcTemplate().batchUpdate(SQL_UPDATE, batchArgs); } @Override public int[] batchUpdate({tbName}Pojo... data) throws DataAccessException { SqlParameterSource[] batchArgs = new SqlParameterSource[data.length]; int index = 0; for (; index < data.length; index++) { batchArgs[index] = new BeanPropertySqlParameterSource(data[index]); } return getNamedParameterJdbcTemplate().batchUpdate(SQL_UPDATE, batchArgs); } @Override public int[] batchDelete(Collection<{tbName}Pojo> collection) throws DataAccessException { List<Object[]> list = new ArrayList<Object[]>(collection.size()); {tbName}Pojo data = null; for (Iterator<{tbName}Pojo> iterator = collection.iterator(); iterator .hasNext();) { data = iterator.next(); list.add(new Object[] { data.getPlayerId(), data.getPlayerId() }); } return getJdbcTemplate().batchUpdate(SQL_DELETE, list); } @Override public int[] batchDelete({tbName}Pojo... data) throws DataAccessException { List<Object[]> list = new ArrayList<Object[]>(data.length); for (int i = 0; i < data.length; i++) { list.add(new Object[] { data[i].getPlayerId() }); } return getJdbcTemplate().batchUpdate(SQL_DELETE, list); } }
TemplateDBQueue.java
package com.playmore.game.mhqx.otherworld.data; import java.util.Collection; import com.playmore.game.storage.AbstractDBQueue; public class {tbName}DBQueue extends AbstractDBQueue<{tbName}Pojo> { private static final {tbName}DBQueue DEFAULT = new {tbName}DBQueue(); public {tbName}DBQueue(){ super(); } public static {tbName}DBQueue getDefault(){ return DEFAULT; } private I{tbName}Dao dao = {tbName}DaoImpl.getDefault(); @Override protected void flushInsert(Collection<{tbName}Pojo> list) { dao.batchInsert(list); } @Override protected void flushUpdate(Collection<{tbName}Pojo> list) { dao.batchUpdate(list); } @Override protected void flushDelete(Collection<{tbName}Pojo> list) { dao.batchDelete(list); } @Override protected void singleInsert({tbName}Pojo data) { dao.insert(data); } @Override protected void singleUpdate({tbName}Pojo data) { dao.update(data); } @Override protected void singleDelete({tbName}Pojo data) { dao.delete(data); } }
相关文章推荐
- Java根据数据库表生成实体
- hibernate tools 根据数据库中mysql表生成 .java .hbm.xml
- Java根据数据库表格自动生成java实体类
- golang利用模板生成数据库表对应的模型及操作函数
- JAVA根据模板将动态内容生成静态网页的代码
- T4模板根据数据库生成项目内基本cs文件
- JAVA根据数据库表生成word表格文档
- 使用Hibernate-tools中的hbm2java和hbm2ddl根据hbm文件自动生成pojo和数据库脚本
- 根据数据库自动生成java代码
- Java根据模板生成pdf文件并导出
- FreeMarker之根据模板生成Java代码
- 使用Hibernate-tools中的hbm2java和hbm2ddl根据hbm文件自动生成pojo和数据库脚本
- 使用Hibernate-tools中的hbm2java和hbm2ddl根据hbm文件自动生成pojo和数据库脚本
- 使用T4模板根据数据库生成model层
- 使用Hibernate-tools中的hbm2java和hbm2ddl根据hbm文件自动生成pojo和数据库脚本
- 用Java根据数据库表生成实体类
- java运用itextpdf实现根据模板生成合同并返回网络路径,供用户查看
- Java根据模板导出Excel报表并复制模板生成多个Sheet页
- java根据ftl模板生成word文档
- Mybatis逆向工程根据数据库表生成java代码。