golang+walk根据数据库表生成java,proto和模板

来源:互联网 发布:淘宝内衣模特偷拍网盘 编辑:程序博客网 时间:2024/06/05 05:32

这个是连接数据库并根据数据库中的表生成对应的一些java和proto的信息,用到了
walk这个库,目前只能在window上使用,如果在其他平台就要自己看着办了,
需要处理其他相关的,就需要自己再进行特殊修改了

package main// go build -ldflags="-H windowsgui"//go get github.com/akavel/rsrc//rsrc -manifest test.manifest -o rsrc.sysoimport (    "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=utf8user:password@tcp(localhost:5555)/dbname?charset=utf8user:password@/dbnameuser: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 != "" {        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() {                            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);    }}