这个是连接数据库并根据数据库中的表生成对应的一些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);
}
}