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

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

这个是连接数据库并根据数据库中的表生成对应的一些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
Golang中的Gin框架提供了一种简单而强大的方法来构建Web应用程序。与此同时,Golang标准中的"net/http"包提供了构建WebSocket服务器和客户端的功能。 首先,我们来看一下如何使用Gin和WebSocket构建WebSocket服务器。首先,需要导入相关的包: ```go import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) ``` 接下来,在Gin中创建一个WebSocket处理函数: ```go func WebSocketHandler(c *gin.Context) { upgrader := websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } for { messageType, message, err := conn.ReadMessage() if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } err = conn.WriteMessage(messageType, message) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } } } ``` 上面的代码创建了一个基本的WebSocket处理函数。它使用WebSocket标准中的Upgrader结构来处理升级连接并创建一个WebSocket连接。 然后,我们需要在Gin中设置路由来处理WebSocket请求: ```go router := gin.Default() router.GET("/ws", WebSocketHandler) ``` 以上代码将在根路径下创建一个WebSocket处理函数。 接下来,我们来看一下如何使用Golang和Gin构建WebSocket客户端。首先,我们需要导入所需的包: ```go import ( "github.com/gorilla/websocket" "net/http" ) ``` 然后,我们可以使用以下代码来创建一个WebSocket客户端: ```go func main() { c, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil) if err != nil { log.Fatal("dial:", err) } defer c.Close() done := make(chan struct{}) go func() { defer close(done) for { _, message, err := c.ReadMessage() if err != nil { log.Println("read:", err) return } log.Printf("recv: %s", message) } }() ticker := time.NewTicker(time.Second) defer ticker.Stop() for { select { case <-done: return case <-ticker.C: err := c.WriteMessage(websocket.TextMessage, []byte("Hello, Server!")) if err != nil { log.Println("write:", err) return } } } } ``` 上面的代码创建了一个WebSocket客户端,它使用WebSocket标准中的`DefaultDialer`结构来建立WebSocket连接。 以上就是使用Golang Gin和WebSocket构建WebSocket客户端和服务器的简单示例。这些代码可以帮助我们使用Gin和Golang的标准来构建强大的Web应用程序,并处理WebSocket通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值