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

该博客介绍了如何利用golang结合walk库,在Windows环境下根据数据库表自动生成Java类(如Pojo、DAO)和Protocol Buffer(Proto)文件。目前该方法存在平台限制,非Windows用户需要进行适配修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个是连接数据库并根据数据库中的表生成对应的一些java和proto的信息,用到了
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 != "" {
        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);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值