{"id":10020427,"date":"2024-11-28T18:47:58","date_gmt":"2024-11-28T10:47:58","guid":{"rendered":"https:\/\/itmax.cn\/?p=10020427"},"modified":"2024-11-28T18:47:58","modified_gmt":"2024-11-28T10:47:58","slug":"mjga%ef%bc%8c%e8%ae%a9-java-%e5%86%8d%e6%ac%a1%e4%bc%9f%e5%a4%a7%ef%bc%8c%e5%bc%80%e7%ae%b1%e5%8d%b3%e7%94%a8-spring-boot-%e6%80%95%e4%b8%8d%e6%80%95-gin%ef%bc%9f","status":"publish","type":"post","link":"https:\/\/itmax.cn\/?p=10020427","title":{"rendered":"MJGA\uff0c\u8ba9 Java \u518d\u6b21\u4f1f\u5927\uff0c\u5f00\u7bb1\u5373\u7528 Spring Boot \u6015\u4e0d\u6015 Gin\uff1f"},"content":{"rendered":"<p>\u6765\u6e90\uff1ajuejin.cn\/post\/7245942451105562685<\/p>\n<h2>\u524d\u8a00<\/h2>\n<p>\u9694\u58c1\u7ec4\u7684\u4e91\u8ba1\u7b97\u96f6\u96f6\u540e\u5973\u540c\u4e8b\uff0c\u540e\u6587\u7b80\u79f0 \u4e91\u5973\u58eb \uff0c\u975e\u8bf4 Go \u7684 Gin \u6846\u67b6\u6bd4 Springboot \u66f4\u52a0\u7684\u5f00\u7bb1\u5373\u7528\uff0c\u6211\u5fc3\u60f3\u5728 Java \u91cc\u9762 Springboot \u5df2\u7ecf\u6253\u904d\u5929\u4e0b\u65e0\u654c\u624b\uff0c\u8fd9\u4efd\u5e95\u8574\u5c82\u662f Gin \u80fd\u6bd4\u3002<\/p>\n<p>\u4f46\u662f\u4e91\u5973\u58eb\u7a81\u51fa\u4e00\u4e2a\u6267\u62d7\uff0c\u975e\u6211\u8981 PK \u4e00\u628a\uff0c PK \u5185\u5bb9\u5c31\u662f\u5979\u4f7f\u7528 Gin\uff0c\u800c\u6211\u4f7f\u7528 Springboot \u5feb\u901f\u642d\u5efa\u4e00\u4e2a\u7b80\u5355\u7684 Crud \u5de5\u7a0b\uff0c\u6700\u540e\u8ba9\u5176\u4ed6\u540c\u4e8b\u6765\u8bc4\u5224\u54ea\u4e2a\u66f4\u5f00\u7bb1\u5373\u7528\u3002\u6211\u6beb\u4e0d\u72b9\u8c6b\u5c31\u7b54\u5e94\u4e86\uff0c\u4f5c\u4e3a\u642d\u5efa Springboot \u5b66\u4e60\u5de5\u7a0b\u7684\u8d44\u6df1 Crud \u9009\u624b\uff0c\u54b1\u8fd9\u4efd\u5e95\u6c14\u8fd8\u662f\u6709\u7684\u3002<\/p>\n<p>\u4e91\u5973\u58eb\u9009\u62e9\u4f7f\u7528 Gin + Gorm \u6765\u642d\u5efa\uff0c\u800c\u6211\u539f\u672c\u60f3\u9009\u62e9 Springboot + MyBatis\uff0c\u540e\u9762\u8f6c\u5ff5\u4e00\u60f3\uff0c\u8fd9 MyBatis \u8981\u5199 XML \u6587\u4ef6\uff0c\u6307\u4e0d\u5b9a\u5c31\u56e0\u4e3a\u8fd9\u4e2a\u88ab\u4e91\u5973\u58eb\u5632\u7b11\u4e86\uff0c\u6240\u4ee5\u6211\u628a MyBatis \u66ff\u6362\u4e3a\u4e86 MyBatis-Plus\uff0c\u8fd9\u5c31\u8db3\u591f\u7684\u7b80\u6d01\u4e86\u5427\u3002<\/p>\n<h2>\u6b63\u6587<\/h2>\n<h3>\u51c6\u5907\u4e8b\u9879<\/h3>\n<p>\u65e2\u7136\u662f Crud \u5de5\u7a0b\uff0c\u81ea\u7136\u8981\u51c6\u5907\u597d\u64cd\u4f5c\u7684\u8868\uff0c\u6211\u548c\u4e91\u5973\u58eb\u901a\u8fc7\u5982\u4e0b\u8bed\u53e5\u5728\u5404\u81ea\u7684\u6570\u636e\u5e93\u4e2d\u521b\u5efa\u597d\u4e86\u5982\u4e0b\u4e24\u5f20\u8868\u3002<\/p>\n<pre><code>CREATE TABLE people (\n    id INT(11) PRIMARY KEY AUTO_INCREMENT,\n    p_name VARCHAR(255) NOT NULL,\n    p_age INT(11) NOT NULL\n)\n\nCREATE TABLE book (\n    id INT(11) PRIMARY KEY AUTO_INCREMENT,\n    b_name VARCHAR(255) NOT NULL,\n    b_price FLOAT NOT NULL\n)<\/code><\/pre>\n<h3>Gin\u5feb\u901f\u642d\u5efaCrud\u5de5\u7a0b<\/h3>\n<p>\u4e91\u5973\u58eb\u7684\u5de5\u7a0b\u7ed3\u6784\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"245\" height=\"322\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVde8of\" alt=\"Gin\u76ee\u5f55\u7ed3\u6784\" title=\"Gin\u76ee\u5f55\u7ed3\u6784\"><\/p>\n<p>\u4e91\u5973\u58eb\u7684 go.mod \u6587\u4ef6\u5185\u5bb9\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre><code>module gobase\n\ngo 1.17\n\nrequire (\n    github.com\/gin-gonic\/gin v1.6.0\n    github.com\/jinzhu\/gorm v1.9.16\n    github.com\/sirupsen\/logrus v1.9.3\n    github.com\/spf13\/cast v1.5.1\n)<\/code><\/pre>\n<p>\u4e91\u5973\u58eb\u5b9a\u4e49\u4e86\u4e24\u4e2a\u7ed3\u6784\u4f53\u4f5c\u4e3a\u6a21\u578b\uff08 Model \uff09\uff0cbook.go \u6587\u4ef6\u5185\u5bb9\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre><code>package model\n\nconst (\n    BookTableName = &quot;book&quot;\n)\n\ntype Book struct {\n    ID int64 `gorm:&quot;column:id&quot;`\n    BookName string `gorm:&quot;column:b_name&quot;`\n    BookPrice float64 `gorm:&quot;column:b_price&quot;`\n}\n\nfunc (b *Book) TableName() string {\n    return BookTableName\n}<\/code><\/pre>\n<p>people.go \u6587\u4ef6\u5185\u5bb9\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre><code>package model\n\nconst (\n    PeopleTableName = &quot;people&quot;\n)\n\ntype People struct {\n    ID int64 `gorm:&quot;column:id&quot;`\n    PeopleName string `gorm:&quot;column:p_name&quot;`\n    PeopleAge int64 `gorm:&quot;column:p_age&quot;`\n}\n\nfunc (p *People) TableName() string {\n    return PeopleTableName\n}<\/code><\/pre>\n<p>\u4e91\u5973\u58eb\u8865\u5145\u9053\uff0c<code>TableName()<\/code>\u65b9\u6cd5\u662f\u4e3a\u6a21\u578b\u6307\u5b9a\u5bf9\u5e94\u7684\u8868\u540d\u3002<\/p>\n<p>\u4e91\u5973\u58eb\u4e3a book \u8868\u548c people \u8868\u5206\u522b\u5b9a\u4e49\u4e86 Dao \u63a5\u53e3\uff0cdao.go \u6587\u4ef6\u5185\u5bb9\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre><code>package dao\n\nimport &quot;gobase\/model&quot;\n\ntype BookDao interface {\n    AddBook(book *model.Book) error\n    UpdateBook(book *model.Book) error\n    DeleteBook(book *model.Book) error\n    ListBookById(id uint) (*model.Book, error)\n}\n\ntype PeopleDao interface {\n    AddPeople(book *model.People) error\n    UpdatePeople(book *model.People) error\n    DeletePeople(book *model.People) error\n    ListPeopleById(id uint) (*model.People, error)\n}<\/code><\/pre>\n<p>BookDao \u63a5\u53e3\u5bf9\u5e94\u7684\u5b9e\u73b0\u5728<code>book_dao_impl.go<\/code>\u6587\u4ef6\u4e2d\uff0c\u5b9e\u73b0\u5982\u4e0b\u3002<\/p>\n<pre><code>package dao\n\nimport (\n    &quot;github.com\/jinzhu\/gorm&quot;\n    &quot;gobase\/model&quot;\n)\n\ntype BookDaoImpl struct {\n    DB *gorm.DB\n}\n\nfunc (b *BookDaoImpl) AddBook(book *model.Book) error {\n    if createResult := b.DB.Create(book); createResult.Error != nil {\n        return createResult.Error\n    }\n    return nil\n}\n\nfunc (b *BookDaoImpl) UpdateBook(book *model.Book) error {\n    if saveResult := b.DB.Save(book); saveResult.Error != nil {\n        return saveResult.Error\n    }\n    return nil\n}\n\nfunc (b *BookDaoImpl) DeleteBook(book *model.Book) error {\n    if deleteResult := b.DB.Delete(book); deleteResult.Error != nil {\n        return deleteResult.Error\n    }\n    return nil\n}\n\nfunc (b *BookDaoImpl) ListBookById(id uint) (*model.Book, error) {\n    var book model.Book\n    if listResult := b.DB.Where(&quot;id = ?&quot;, id).First(&amp;book); listResult.Error != nil {\n        return nil, listResult.Error\n    }\n    return &amp;book, nil\n}<\/code><\/pre>\n<p>PeopleDao \u63a5\u53e3\u5bf9\u5e94\u7684\u5b9e\u73b0\u5728<code>people_dao_impl.go<\/code>\u6587\u4ef6\u4e2d\uff0c\u5b9e\u73b0\u5982\u4e0b\u3002<\/p>\n<pre><code>package dao\n\nimport (\n    &quot;github.com\/jinzhu\/gorm&quot;\n    &quot;gobase\/model&quot;\n)\n\ntype PeopleDaoImpl struct {\n    DB *gorm.DB\n}\n\nfunc (b *PeopleDaoImpl) AddPeople(people *model.People) error {\n    if createResult := b.DB.Create(people); createResult.Error != nil {\n        return createResult.Error\n    }\n    return nil\n}\n\nfunc (b *PeopleDaoImpl) UpdatePeople(people *model.People) error {\n    if saveResult := b.DB.Save(people); saveResult.Error != nil {\n        return saveResult.Error\n    }\n    return nil\n}\n\nfunc (b *PeopleDaoImpl) DeletePeople(people *model.People) error {\n    if deleteResult := b.DB.Delete(people); deleteResult.Error != nil {\n        return deleteResult.Error\n    }\n    return nil\n}\n\nfunc (b *PeopleDaoImpl) ListPeopleById(id uint) (*model.People, error) {\n    var people model.People\n    if listResult := b.DB.Where(&quot;id = ?&quot;, id).First(&amp;people); listResult.Error != nil {\n        return nil, listResult.Error\n    }\n    return &amp;people, nil\n}<\/code><\/pre>\n<p>\u8981\u64cd\u4f5c\u6570\u636e\u5e93\uff0c\u80af\u5b9a\u9700\u8981\u6570\u636e\u5e93\u8fde\u63a5\uff0c\u4e91\u5973\u58eb\u5c06\u6570\u636e\u5e93\u8fde\u63a5\u7684\u7ba1\u7406\u5b9e\u73b0\u5728\u4e86<code>mysql_connection_pool.go<\/code>\u6587\u4ef6\u4e2d\uff0c\u5185\u5bb9\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre><code>package mysql\n\nimport (\n    &quot;fmt&quot;\n    &quot;github.com\/jinzhu\/gorm&quot;\n    &quot;gobase\/dao&quot;\n    &quot;log&quot;\n    &quot;time&quot;\n)\n\nconst (\n    UserName     = &quot;root&quot;\n    PassWord     = &quot;root&quot;\n    Host         = &quot;192.168.101.8&quot;\n    Port         = 3306\n    Database     = &quot;gotest&quot;\n    MaxLifetime  = 60 * time.Second\n    MaxIdletime  = 30 * time.Second\n    MaxOpenconns = 6\n    MaxIdleconns = 2\n    Dialect      = &quot;mysql&quot;\n)\n\ntype DataSouce struct {\n    db      *gorm.DB\n}\n\nfunc NewDataSource() *DataSouce {\n    var db *gorm.DB\n\n    dsn := fmt.Sprintf(&quot;%s:%s@tcp(%s:%d)\/%s?charset=utf8&amp;parseTime=True&amp;loc=Asia%%2FShanghai&quot;,\n            UserName, PassWord, Host, Port, Database)\n    db, err := gorm.Open(Dialect, dsn)\n    if err != nil {\n        log.Fatal(err.Error())\n    }\n\n    db.DB().SetConnMaxLifetime(MaxLifetime)\n    db.DB().SetConnMaxIdleTime(MaxIdletime)\n    db.DB().SetMaxOpenConns(MaxOpenconns)\n    db.DB().SetMaxOpenConns(MaxIdleconns)\n\n    return &amp;DataSouce{\n        db: db,\n    }\n}\n\n\/\/ BookDao \u64cd\u4f5cbook\u8868\nfunc (d *DataSouce) BookDao() dao.BookDao {\n    return &amp;dao.BookDaoImpl{\n        DB: d.db,\n    }\n}\n\n\/\/ PeopleDao \u64cd\u4f5cpeople\u8868\nfunc (d *DataSouce) PeopleDao() dao.PeopleDao {\n    return &amp;dao.PeopleDaoImpl{\n        DB: d.db,\n    }\n}<\/code><\/pre>\n<p>\u4e91\u5973\u58eb\u5c06\u8def\u7531\u5199\u5728\u4e86<code>webservice.go<\/code>\u6587\u4ef6\u4e2d\uff0c\u5185\u5bb9\u5982\u4e0b\u3002<\/p>\n<pre><code>package adapter\n\nimport (\n    &quot;github.com\/gin-gonic\/gin&quot;\n    &quot;gobase\/mysql&quot;\n)\n\nfunc Init() error {\n    dataSouce := mysql.NewDataSource()\n\n    bookController := NewBookController(dataSouce)\n    propleController := NewPropleController(dataSouce)\n\n    engine := gin.Default()\n    routerGroupBook := engine.Group(&quot;\/book&quot;)\n    routerGroupBook.POST(&quot;\/add&quot;, bookController.AddBook)\n    routerGroupBook.POST(&quot;\/update&quot;, bookController.UpdateBook)\n    routerGroupBook.POST(&quot;\/delete&quot;, bookController.DeleteBook)\n    routerGroupBook.POST(&quot;\/list&quot;, bookController.ListBookById)\n\n    routerGroupPeople := engine.Group(&quot;\/people&quot;)\n    routerGroupPeople.POST(&quot;\/add&quot;, propleController.AddPeople)\n    routerGroupPeople.POST(&quot;\/update&quot;, propleController.UpdatePeople)\n    routerGroupPeople.POST(&quot;\/delete&quot;, propleController.DeletePeople)\n    routerGroupPeople.POST(&quot;\/list&quot;, propleController.ListPeopleById)\n\n    return engine.Run()\n}<\/code><\/pre>\n<p>\u5176\u5b9e\u9664\u4e86\u7ed1\u5b9a\u8def\u7531\uff0c\u4e91\u5973\u58eb\u8fd8\u5728<code>Init()<\/code>\u51fd\u6570\u4e2d\u8fdb\u884c\u4e86\u7b80\u5355\u7684\u670d\u52a1\u6ce8\u5165\uff0c\u4e5f\u5c31\u662f\u521b\u5efa\u6570\u636e\u5e93\u8fde\u63a5\u6c60\uff0c\u7136\u540e\u5c06\u6570\u636e\u5e93\u8fde\u63a5\u6c60\u7ed9\u5230\u5bf9\u5e94\u7684 web \u670d\u52a1\u3002<\/p>\n<p>\u4e91\u5973\u58eb\u5c06\u64cd\u4f5c book \u8868\u5bf9\u5e94\u7684 web \u670d\u52a1\u5199\u5728\u4e86<code>book_controller.go<\/code>\u6587\u4ef6\u4e2d\uff0c\u5176\u5b9e\u73b0\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre><code>package adapter\n\nimport (\n    &quot;github.com\/gin-gonic\/gin&quot;\n    &quot;github.com\/sirupsen\/logrus&quot;\n    &quot;github.com\/spf13\/cast&quot;\n    &quot;gobase\/model&quot;\n    &quot;gobase\/mysql&quot;\n    &quot;net\/http&quot;\n)\n\ntype BookController struct {\n    dataSource *mysql.DataSouce\n}\n\nfunc NewBookController(dataSource *mysql.DataSouce) BookController {\n    return BookController{\n        dataSource: dataSource,\n    }\n}\n\nfunc (b *BookController) AddBook(ctx *gin.Context) {\n    var book model.Book\n    if err := ctx.ShouldBind(&amp;book); err != nil {\n        logrus.Error(&quot;\u8bfb\u53d6Book\u4fe1\u606f\u5931\u8d25&quot;)\n        ctx.JSON(http.StatusInternalServerError, gin.H{\n            &quot;message&quot;: &quot;failed&quot;,\n        })\n        return\n    }\n    bookDao := b.dataSource.BookDao()\n    err := bookDao.AddBook(&amp;book)\n    if err != nil {\n        logrus.Error(&quot;\u6dfb\u52a0Book\u5931\u8d25&quot;, err)\n        ctx.JSON(http.StatusInternalServerError, gin.H{\n            &quot;message&quot;: &quot;failed&quot;,\n        })\n        return\n    }\n    ctx.JSON(http.StatusOK, gin.H{\n        &quot;message&quot;: &quot;success&quot;,\n    })\n}\n\nfunc (b *BookController) UpdateBook(ctx *gin.Context) {\n    var book model.Book\n    if err := ctx.ShouldBind(&amp;book); err != nil {\n        logrus.Error(&quot;\u8bfb\u53d6Book\u4fe1\u606f\u5931\u8d25&quot;)\n        ctx.JSON(http.StatusInternalServerError, gin.H{\n            &quot;message&quot;: &quot;failed&quot;,\n        })\n        return\n    }\n    bookDao := b.dataSource.BookDao()\n    err := bookDao.UpdateBook(&amp;book)\n    if err != nil {\n        logrus.Error(&quot;\u66f4\u65b0Book\u5931\u8d25&quot;, err)\n        ctx.JSON(http.StatusInternalServerError, gin.H{\n            &quot;message&quot;: &quot;failed&quot;,\n        })\n        return\n    }\n    ctx.JSON(http.StatusOK, gin.H{\n        &quot;message&quot;: &quot;success&quot;,\n    })\n}\n\nfunc (b *BookController) DeleteBook(ctx *gin.Context) {\n    var book model.Book\n    if err := ctx.ShouldBind(&amp;book); err != nil {\n        logrus.Error(&quot;\u8bfb\u53d6Book\u4fe1\u606f\u5931\u8d25&quot;)\n        ctx.JSON(http.StatusInternalServerError, gin.H{\n            &quot;message&quot;: &quot;failed&quot;,\n        })\n        return\n    }\n    bookDao := b.dataSource.BookDao()\n    err := bookDao.DeleteBook(&amp;book)\n    if err != nil {\n        logrus.Error(&quot;\u5220\u9664Book\u5931\u8d25&quot;, err)\n        ctx.JSON(http.StatusInternalServerError, gin.H{\n            &quot;message&quot;: &quot;failed&quot;,\n        })\n        return\n    }\n    ctx.JSON(http.StatusOK, gin.H{\n        &quot;message&quot;: &quot;success&quot;,\n    })\n}\n\nfunc (b *BookController) ListBookById(ctx *gin.Context) {\n    id := cast.ToUint(ctx.Query(&quot;id&quot;))\n    bookDao := b.dataSource.BookDao()\n    book, err := bookDao.ListBookById(id)\n    if err != nil {\n        logrus.Error(&quot;\u67e5\u8be2Book\u5931\u8d25&quot;, err)\n        ctx.JSON(http.StatusInternalServerError, gin.H{\n            &quot;message&quot;: &quot;failed&quot;,\n        })\n        return\n    }\n    ctx.JSON(http.StatusOK, book)\n}<\/code><\/pre>\n<p>\u4e91\u5973\u58eb\u5c06\u64cd\u4f5c people \u8868\u5bf9\u5e94\u7684 web \u670d\u52a1\u5199\u5728\u4e86<code>people_controller.go<\/code>\u6587\u4ef6\u4e2d\uff0c\u5176\u5b9e\u73b0\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre><code>package adapter\n\nimport (\n    &quot;github.com\/gin-gonic\/gin&quot;\n    &quot;github.com\/sirupsen\/logrus&quot;\n    &quot;github.com\/spf13\/cast&quot;\n    &quot;gobase\/model&quot;\n    &quot;gobase\/mysql&quot;\n    &quot;net\/http&quot;\n)\n\ntype PeopleController struct {\n    dataSource *mysql.DataSouce\n}\n\nfunc NewPropleController(dataSource *mysql.DataSouce) PeopleController {\n    return PeopleController{\n        dataSource: dataSource,\n    }\n}\n\nfunc (p *PeopleController) AddPeople(ctx *gin.Context) {\n    var people model.People\n    if err := ctx.ShouldBind(&amp;people); err != nil {\n        logrus.Error(&quot;\u8bfb\u53d6People\u4fe1\u606f\u5931\u8d25&quot;)\n        ctx.JSON(http.StatusInternalServerError, gin.H{\n            &quot;message&quot;: &quot;failed&quot;,\n        })\n        return\n    }\n    peopleDao := p.dataSource.PeopleDao()\n    err := peopleDao.AddPeople(&amp;people)\n    if err != nil {\n        logrus.Error(&quot;\u6dfb\u52a0People\u5931\u8d25&quot;, err)\n        ctx.JSON(http.StatusInternalServerError, gin.H{\n            &quot;message&quot;: &quot;failed&quot;,\n        })\n        return\n    }\n    ctx.JSON(http.StatusOK, gin.H{\n        &quot;message&quot;: &quot;success&quot;,\n    })\n}\n\nfunc (p *PeopleController) UpdatePeople(ctx *gin.Context) {\n    var people model.People\n    if err := ctx.ShouldBind(&amp;people); err != nil {\n        logrus.Error(&quot;\u8bfb\u53d6People\u4fe1\u606f\u5931\u8d25&quot;)\n        ctx.JSON(http.StatusInternalServerError, gin.H{\n            &quot;message&quot;: &quot;failed&quot;,\n        })\n        return\n    }\n    peopleDao := p.dataSource.PeopleDao()\n    err := peopleDao.UpdatePeople(&amp;people)\n    if err != nil {\n        logrus.Error(&quot;\u66f4\u65b0People\u5931\u8d25&quot;, err)\n        ctx.JSON(http.StatusInternalServerError, gin.H{\n            &quot;message&quot;: &quot;failed&quot;,\n        })\n        return\n    }\n    ctx.JSON(http.StatusOK, gin.H{\n        &quot;message&quot;: &quot;success&quot;,\n    })\n}\n\nfunc (p *PeopleController) DeletePeople(ctx *gin.Context) {\n    var people model.People\n    if err := ctx.ShouldBind(&amp;people); err != nil {\n        logrus.Error(&quot;\u8bfb\u53d6People\u4fe1\u606f\u5931\u8d25&quot;)\n        ctx.JSON(http.StatusInternalServerError, gin.H{\n            &quot;message&quot;: &quot;failed&quot;,\n        })\n        return\n    }\n    peopleDao := p.dataSource.PeopleDao()\n    err := peopleDao.DeletePeople(&amp;people)\n    if err != nil {\n        logrus.Error(&quot;\u5220\u9664People\u5931\u8d25&quot;, err)\n        ctx.JSON(http.StatusInternalServerError, gin.H{\n            &quot;message&quot;: &quot;failed&quot;,\n        })\n        return\n    }\n    ctx.JSON(http.StatusOK, gin.H{\n        &quot;message&quot;: &quot;success&quot;,\n    })\n}\n\nfunc (p *PeopleController) ListPeopleById(ctx *gin.Context) {\n    id := cast.ToUint(ctx.Query(&quot;id&quot;))\n    peopleDao := p.dataSource.PeopleDao()\n    people, err := peopleDao.ListPeopleById(id)\n    if err != nil {\n        logrus.Error(&quot;\u67e5\u8be2People\u5931\u8d25&quot;, err)\n        ctx.JSON(http.StatusInternalServerError, gin.H{\n            &quot;message&quot;: &quot;failed&quot;,\n        })\n        return\n    }\n    ctx.JSON(http.StatusOK, people)\n}<\/code><\/pre>\n<p>\u6700\u540e\uff0c\u4e91\u5973\u58eb\u7b80\u5355\u7684\u5c55\u793a\u4e86\u4e00\u4e0b\u5bf9 book \u8868\u548c prople \u8868\u7684 Crud \u64cd\u4f5c\u3002<\/p>\n<p>book \u8868\u548c people \u8868\u7684\u589e\u5220\u6539\u6210\u529f\u65f6\u8fd4\u56de\u5185\u5bb9\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<p><img decoding=\"async\" width=\"323\" height=\"138\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVde8og\" alt=\"Gin-\u589e\u5220\u6539\u6210\u529f\" title=\"Gin-\u589e\u5220\u6539\u6210\u529f\" loading=\"lazy\"><\/p>\n<p>book \u8868\u548c people \u8868\u7684\u67e5\u8be2\u6210\u529f\u65f6\u8fd4\u56de\u5185\u5bb9\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<p><img decoding=\"async\" width=\"325\" height=\"164\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVde8oh\" alt=\"Gin-\u67e5\u8be2\u56fe\u4e66\" title=\"Gin-\u67e5\u8be2\u56fe\u4e66\" loading=\"lazy\"><\/p>\n<p><img decoding=\"async\" width=\"324\" height=\"165\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVde8oi\" alt=\"Gin-\u67e5\u8be2\u4eba\u7269\" title=\"Gin-\u67e5\u8be2\u4eba\u7269\" loading=\"lazy\"><\/p>\n<h3>Spring boot \u5feb\u901f\u642d\u5efaCrud\u5de5\u7a0b<\/h3>\n<p>Spring Boot \u57fa\u7840\u5c31\u4e0d\u4ecb\u7ecd\u4e86\uff0c\u63a8\u8350\u770b\u8fd9\u4e2a\u5b9e\u6218\u9879\u76ee\uff1a<\/p>\n<blockquote><p><a href=\"https:\/\/link.segmentfault.com\/?enc=yW5rKOpRFJOV0Of7UcrRvQ%3D%3D.2qHoDqN8mXTqLAVFvel%2B3z2ms4CPugjm5YyLJ1ALAc2PRXbx3b3WveKXLq4BzR2%2FaW566qKFRuwsKPP3QOaxMQ%3D%3D\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">https:\/\/github.com\/javastacks\/spring-boot-best-practice<\/a><\/p><\/blockquote>\n<p>\u4e91\u5973\u58eb\u57fa\u4e8e Gin \u548c Gorm \u642d\u5efa\u7684 Crud \u5de5\u7a0b\uff0c\u6211\u770b\u5b8c\u540e\u5185\u5fc3\u6251\u54e7\u4e00\u7b11\uff1a\u4e0d\u8fc7\u5982\u6b64\u3002<\/p>\n<p>\u90a3\u73b0\u5728\u8be5\u8f6e\u5230\u6211\u8868\u6f14\u4e86\u3002\u9996\u5148\u7ed9\u51fa\u6574\u4e2a\u5de5\u7a0b\u7ed3\u6784\u56fe\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<p><img decoding=\"async\" width=\"245\" height=\"384\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVde8oj\" alt=\"Springboot\u76ee\u5f55\u7ed3\u6784\" title=\"Springboot\u76ee\u5f55\u7ed3\u6784\" loading=\"lazy\"><\/p>\n<p>POM \u6587\u4ef6\u5185\u5bb9\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\n&lt;project xmlns=&quot;http:\/\/maven.apache.org\/POM\/4.0.0&quot;\n         xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;\n         xsi:schemaLocation=&quot;http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd&quot;&gt;\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n\n    &lt;parent&gt;\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-boot-starter-parent&lt;\/artifactId&gt;\n        &lt;version&gt;2.4.1&lt;\/version&gt;\n    &lt;\/parent&gt;\n\n    &lt;groupId&gt;com.lee.javabase&lt;\/groupId&gt;\n    &lt;artifactId&gt;javabase&lt;\/artifactId&gt;\n    &lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt;\n\n    &lt;dependencies&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-jdbc&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n\n        &lt;dependency&gt;\n            &lt;groupId&gt;com.baomidou&lt;\/groupId&gt;\n            &lt;artifactId&gt;mybatis-plus-boot-starter&lt;\/artifactId&gt;\n            &lt;version&gt;3.1.0&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;mysql&lt;\/groupId&gt;\n            &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt;\n            &lt;version&gt;8.0.16&lt;\/version&gt;\n        &lt;\/dependency&gt;\n\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.projectlombok&lt;\/groupId&gt;\n            &lt;artifactId&gt;lombok&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n    &lt;\/dependencies&gt;\n\n&lt;\/project&gt;<\/code><\/pre>\n<p>\u540c\u6837\uff0c\u5b9a\u4e49 book \u8868\u548c people \u8868\u5bf9\u5e94\u7684\u5b9e\u4f53\u7c7b Book \u548c People\uff0c\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre><code>@Getter\n@Setter\npublic class Book {\n    @TableField(&quot;id&quot;)\n    private int id;\n\n    @TableField(&quot;b_name&quot;)\n    private String bookName;\n    @TableField(&quot;b_price&quot;)\n    private float bookPrice;\n\n}\n\n@Getter\n@Setter\npublic class People {\n\n    @TableField(&quot;id&quot;)\n    private int id;\n\n    @TableField(&quot;p_name&quot;)\n    private String peopleName;\n    @TableField(&quot;p_age&quot;)\n    private int peopleAge;\n\n}<\/code><\/pre>\n<p>\u7136\u540e\u5b9a\u4e49\u5b9a\u4e49\u63a5\u53e3\uff0c\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre><code>@Mapper\npublic interface BookMapper extends BaseMapper&lt;Book&gt; {\n}\n\n@Mapper\npublic interface PeopleMapper extends BaseMapper&lt;People&gt; {\n}<\/code><\/pre>\n<p>\u6700\u540e\u662f\u5bf9\u5e94\u7684 Controller \u5b9e\u73b0\uff0c BookController \u5b9e\u73b0\u5982\u4e0b\u3002<\/p>\n<pre><code>@Slf4j\n@RestController\n@RequestMapping(&quot;\/book&quot;)\npublic class BookController {\n\n    @Autowired\n    private BookMapper bookMapper;\n\n    @PostMapping(&quot;\/add&quot;)\n    public ResponseEntity&lt;String&gt; addBook(@RequestBody Book book) {\n        try {\n            bookMapper.insert(book);\n            return new ResponseEntity&lt;&gt;(&quot;\u6dfb\u52a0\u56fe\u4e66\u6210\u529f&quot;, HttpStatus.OK);\n        } catch (Exception e) {\n            log.error(&quot;\u6dfb\u52a0\u56fe\u4e66\u5931\u8d25&quot;, e);\n            return new ResponseEntity&lt;&gt;(&quot;\u6dfb\u52a0\u56fe\u4e66\u5931\u8d25&quot;, HttpStatus.INTERNAL_SERVER_ERROR);\n        }\n    }\n\n    @PostMapping(&quot;\/update&quot;)\n    public ResponseEntity&lt;String&gt; updateBook(@RequestBody Book book) {\n        try {\n            bookMapper.updateById(book);\n            return new ResponseEntity&lt;&gt;(&quot;\u66f4\u65b0\u56fe\u4e66\u6210\u529f&quot;, HttpStatus.OK);\n        } catch (Exception e) {\n            log.error(&quot;\u66f4\u65b0\u56fe\u4e66\u5931\u8d25&quot;, e);\n            return new ResponseEntity&lt;&gt;(&quot;\u66f4\u65b0\u56fe\u4e66\u5931\u8d25&quot;, HttpStatus.INTERNAL_SERVER_ERROR);\n        }\n    }\n\n    @PostMapping(&quot;\/delete&quot;)\n    public ResponseEntity&lt;String&gt; deleteBook(@RequestParam(&quot;id&quot;) int id) {\n        try {\n            bookMapper.deleteById(id);\n            return new ResponseEntity&lt;&gt;(&quot;\u5220\u9664\u56fe\u4e66\u6210\u529f&quot;, HttpStatus.OK);\n        } catch (Exception e) {\n            log.error(&quot;\u5220\u9664\u56fe\u4e66\u5931\u8d25&quot;, e);\n            return new ResponseEntity&lt;&gt;(&quot;\u5220\u9664\u56fe\u4e66\u5931\u8d25&quot;, HttpStatus.INTERNAL_SERVER_ERROR);\n        }\n    }\n\n    @PostMapping(&quot;\/list&quot;)\n    public ResponseEntity&lt;Book&gt; listBook(@RequestParam(&quot;id&quot;) int id) {\n        try {\n            Book book = bookMapper.selectById(id);\n            return new ResponseEntity&lt;&gt;(book, HttpStatus.OK);\n        } catch (Exception e) {\n            log.error(&quot;\u67e5\u8be2\u56fe\u4e66\u5931\u8d25&quot;, e);\n            return new ResponseEntity&lt;&gt;(null, HttpStatus.INTERNAL_SERVER_ERROR);\n        }\n    }\n}<\/code><\/pre>\n<p>PeopleController \u5b9e\u73b0\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre><code>@Slf4j\n@RestController\n@RequestMapping(&quot;\/people&quot;)\npublic class PeopleController {\n\n    @Autowired\n    private PeopleMapper peopleMapper;\n\n    @PostMapping(&quot;\/add&quot;)\n    public ResponseEntity&lt;String&gt; addPeople(@RequestBody People people) {\n        try {\n            peopleMapper.insert(people);\n            return new ResponseEntity&lt;&gt;(&quot;\u6dfb\u52a0\u4eba\u7269\u6210\u529f&quot;, HttpStatus.OK);\n        } catch (Exception e) {\n            log.error(&quot;\u6dfb\u52a0\u4eba\u7269\u5931\u8d25&quot;, e);\n            return new ResponseEntity&lt;&gt;(&quot;\u6dfb\u52a0\u4eba\u7269\u5931\u8d25&quot;, HttpStatus.INTERNAL_SERVER_ERROR);\n        }\n    }\n\n    @PostMapping(&quot;\/update&quot;)\n    public ResponseEntity&lt;String&gt; updatePeople(@RequestBody People people) {\n        try {\n            peopleMapper.updateById(people);\n            return new ResponseEntity&lt;&gt;(&quot;\u66f4\u65b0\u4eba\u7269\u6210\u529f&quot;, HttpStatus.OK);\n        } catch (Exception e) {\n            log.error(&quot;\u66f4\u65b0\u4eba\u7269\u5931\u8d25&quot;, e);\n            return new ResponseEntity&lt;&gt;(&quot;\u66f4\u65b0\u4eba\u7269\u5931\u8d25&quot;, HttpStatus.INTERNAL_SERVER_ERROR);\n        }\n    }\n\n    @PostMapping(&quot;\/delete&quot;)\n    public ResponseEntity&lt;String&gt; deletePeople(@RequestParam(&quot;id&quot;) int id) {\n        try {\n            peopleMapper.deleteById(id);\n            return new ResponseEntity&lt;&gt;(&quot;\u5220\u9664\u4eba\u7269\u6210\u529f&quot;, HttpStatus.OK);\n        } catch (Exception e) {\n            log.error(&quot;\u5220\u9664\u4eba\u7269\u5931\u8d25&quot;, e);\n            return new ResponseEntity&lt;&gt;(&quot;\u5220\u9664\u4eba\u7269\u5931\u8d25&quot;, HttpStatus.INTERNAL_SERVER_ERROR);\n        }\n    }\n\n    @PostMapping(&quot;\/list&quot;)\n    public ResponseEntity&lt;People&gt; listPeople(@RequestParam(&quot;id&quot;) int id) {\n        try {\n            People people = peopleMapper.selectById(id);\n            return new ResponseEntity&lt;&gt;(people, HttpStatus.OK);\n        } catch (Exception e) {\n            log.error(&quot;\u67e5\u8be2\u4eba\u7269\u5931\u8d25&quot;, e);\n            return new ResponseEntity&lt;&gt;(null, HttpStatus.INTERNAL_SERVER_ERROR);\n        }\n    }\n}<\/code><\/pre>\n<p>\u542f\u52a8\u5e94\u7528\u7a0b\u5e8f\uff0c book \u8868\u7684 Crud \u64cd\u4f5c\u7ed3\u679c\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<p><img decoding=\"async\" width=\"722\" height=\"1202\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVde8ok\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p>prople \u8868\u7684 Crud \u64cd\u4f5c\u7ed3\u679c\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<p><img decoding=\"async\" width=\"718\" height=\"1174\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVde8ol\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<h2>\u603b\u7ed3<\/h2>\n<p>\u6211\u5ba3\u5e03\uff0cSpringboot \u5c31\u662f\u5feb\u901f\u642d\u5efa Crud \u5de5\u7a0b\u7684<code>\u795e<\/code>\u3002<\/p>\n<p>\u5176\u5b9e\uff0c\u5728\u57fa\u4e8e Gin \u548c Gorm \u642d\u5efa Crud \u5de5\u7a0b\u65f6\uff0c\u4e91\u5973\u58eb\u8fd8\u662f\u5199\u5f97\u590d\u6742\u4e86\u4e00\u70b9\uff0c\u4f46\u662f\u6211\u6709\u5e78\u770b\u8fc7\u5979\u4eec\u4e91\u5e73\u53f0\u7684\u9879\u76ee\u7684\u4ee3\u7801\uff0c\u4e91\u5973\u58eb\u5199\u5f97\u4e5f\u6ca1\u6bdb\u75c5\uff0c\u867d\u7136\u662f\u4e2a\u7b80\u5316\u7248\uff0c\u4f46\u4e5f\u662f\u4e25\u683c\u9075\u4ece\u5979\u4eec\u9879\u76ee\u7684\u4ee3\u7801\u7ed3\u6784\u6765\u5b9e\u73b0\u7684\u3002<\/p>\n<p>\u8bf4\u56de Springboot\uff0c\u6beb\u65e0\u7591\u95ee\uff0c\u65e0\u8bba\u662f\u5929\u7136\u81ea\u5e26 Tomcat \u6216 Jetty \uff0c\u8fd8\u662f\u548c\u4e09\u65b9\u6846\u67b6\u6574\u5408\u7684\u5404\u79cd Starter \u5305\uff0cSpringboot \u90fd\u5c06\u5f00\u7bb1\u5373\u7528\u505a\u5230\u4e86\u6781\u81f4\uff0c\u4f46\u662f\u8f6c\u5ff5\u53c8\u4e00\u60f3\uff0c\u5176\u5b9e Springboot \u548c Gin \u4e25\u683c\u6765\u8bf4\u505a\u6bd4\u8f83\u6ca1\u5565\u610f\u4e49\uff0c\u5c31\u50cf Java \u548c Go \u7684\u6bd4\u8f83\u4e00\u6837\uff0c\u6211\u89c9\u5f97\u4e5f\u6ca1\u5565\u610f\u4e49\uff0c\u5404\u81ea\u7684\u4f18\u52bf\u533a\u95f4\u4e0d\u4e00\u6837\uff0c\u5e76\u4e14\u5404\u81ea\u4e5f\u90fd\u5728\u76f8\u5173\u7684\u9886\u57df\u53f1\u54a4\u98ce\u4e91\u3002<\/p>\n<p>\u5404\u4f4d\u770b\u5b98\uff0c\u4f60\u4eec\u89c9\u5f97\u5462\u3002<\/p>\n<p><strong>\u66f4\u591a\u6587\u7ae0\u63a8\u8350\uff1a<\/strong><\/p>\n<p>1.<a href=\"https:\/\/link.segmentfault.com\/?enc=cVUfAd%2BBOwroO143jG3L9Q%3D%3D.0v19JcKrmJAYqgDusefZ%2F4GoxFY4i5byN%2FaTsUkV30jqjoa5d8vV5Cb4oORhqWBJ\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">Spring Boot 3.x \u6559\u7a0b\uff0c\u592a\u5168\u4e86\uff01<\/a><\/p>\n<p>2.<a href=\"https:\/\/link.segmentfault.com\/?enc=njEks5bYy4%2FO1p%2BIY%2F18Yw%3D%3D.Y4YzR3BJ%2FDVFs0ILdaFXVe0jTjgJAzAhHAker76kTQ8%3D\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">2,000+ \u9053 Java\u9762\u8bd5\u9898\u53ca\u7b54\u6848\u6574\u7406(2024\u6700\u65b0\u7248)<\/a><\/p>\n<p>3.<a href=\"https:\/\/link.segmentfault.com\/?enc=LHIS0tY79gqncBfLhRqBvg%3D%3D.8xb5%2FOc%2BH8mcQPFBK31l4GR1w5oJnXF8c0CCe4iR%2FRlBd8GlqmWT22p%2F%2BqjTYswI66k%2FqIwW0ZvvCJNLKz0gQA%3D%3D\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">\u514d\u8d39\u83b7\u53d6 IDEA \u6fc0\u6d3b\u7801\u7684 7 \u79cd\u65b9\u5f0f\uff082024\u6700\u65b0\u7248\uff09<\/a><\/p>\n<p>\u89c9\u5f97\u4e0d\u9519\uff0c\u522b\u5fd8\u4e86\u968f\u624b\u70b9\u8d5e+\u8f6c\u53d1\u54e6\uff01<\/p>\n<p><a href=\"https:\/\/segmentfault.com\/a\/1190000045513840\">https:\/\/segmentfault.com\/a\/1190000045513840<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6765\u6e90\uff1ajuejin.cn\/post\/7245942451105562685 \u524d\u8a00 \u9694\u58c1\u7ec4\u7684\u4e91\u8ba1\u7b97\u96f6\u96f6\u540e\u5973\u540c\u4e8b\uff0c [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-10020427","post","type-post","status-publish","format-standard","hentry","category-share"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10020427","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10020427"}],"version-history":[{"count":0,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10020427\/revisions"}],"wp:attachment":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10020427"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10020427"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10020427"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}