持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
前言
本篇通过一个简单的查询示例,演示整个Beego框架的使用。
- 代码编辑工具:
Goland
需求
连接MySQL数据库,通过GET请求,传入id值查询出对应学生信息
一、控制器逻辑
- 在controllers目录下创建
GoDemoController.go文件
package controllers
import (
"github.com/astaxie/beego"
"go_project/models"
)
//定义一个控制器结构体
//一般一个模块定义一个控制器
type GoDemoController struct {
//嵌套beego基础控制器,在go语言中嵌套struct,就类似继承的概念
//这里就相当于,继承了beego.Controller的方法和属性
beego.Controller
}
//覆盖beego.Controller的Get方法,用于处理RESTful请求中的get请求
// beego.Controller默认支持多种RESTful方法,例如:Post、Put、Delete等等
func (c *GoDemoController) Get() {
//Data是继承过来的属性,是map类型,可以保存任意类型数据,主要用于保存请求响应数据
//可以通过Data将参数,传入视图模板文件
c.Data["title"] = "学生信息统计"
// 设置需要渲染的模板文件,框架会去views目录查找这个模板文件
c.TplName = "student.tpl"
}
二、设置Url路由
- 在routers包下的
init()函数中设置访问路由
package routers
import (
"go_project/controllers"
"github.com/astaxie/beego"
)
// go 包初始化函数,go语言中在导入一个包的时候,如果被导入包存在init函数,会执行init函数
// 因此这里可以使用init函数初始化路由设置
func init() {
beego.Router("/", &controllers.MainController{})
// 使用beego.Router函数,注册路由规则。
// 第一个参数是url路由,第二个参数是控制器
// 这里的意思就是将访问 /student 这个url的请求,交给controllers.GoDemoController控制器处理。
beego.Router("/student",&controllers.GoDemoController{})
}
通过在浏览器访问http://127.0.0.1:8080/student地址,进入到GoDemoController控制器的Get()方法
路由规则说明
beego RESTful路由规则,默认是通过 请求方法 确认由哪个控制器方法执行,例如get请求,由Get方法执行,POST请求由Post方法执行。
三、编写model逻辑
3.1 定义表结构
- 创建表
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID自增',
`name` varchar(255) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`stu_class` int(11) DEFAULT NULL COMMENT '年级',
`address` varchar(255) DEFAULT NULL COMMENT '家庭住址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
在MySQL数据库中执行创建语句创建该表。
- 表中添加数据
INSERT INTO `student` VALUES (1, '张三', 12, 6, '北京朝阳');
INSERT INTO `student` VALUES (2, '李四', 11, 5, '北京海淀');
3.2 初始化数据库连接
一般初始化数据库连接都是在main.go入口的地方设置一次。
package main
import (
"github.com/astaxie/beego/orm"
_ "go_project/routers"
"github.com/astaxie/beego"
//导入mysql驱动,这是必须的
_ "github.com/go-sql-driver/mysql"
)
//初始化应用设置,通过init函数初始化数据库连接,go语言中这个函数会优先执行
func init() {
// 这里注册一个default默认数据库,数据库驱动是mysql.
// 第三个参数是数据库dsn, 配置数据库的账号密码,数据库名等参数
// dsn参数说明:
// username - mysql账号
// password - mysql密码
// db_name - 数据库名
// 127.0.0.1:3306 - 数据库的地址和端口
orm.RegisterDataBase("default", "mysql", "username:password@tcp(127.0.0.1:3306)/db_name?charset=utf8")
}
func main() {
beego.Run()
}
为了初始化mysql连接,在入口main.go文件,增加init函数初始化数据库设置。
3.3 创建model
在models目录下创建文件student.go
package models
import "github.com/astaxie/beego/orm"
//定义Student模型,绑定student表结构,用来保存sql查询结果
//说明:结构体中属性首字母必须大写,方便进行传递
type Student struct {
Id int
Name string
Age int32
StuClass int32 //数据库表中字段下划线会被映射成大写字母
Address string
}
//定义Student模型绑定哪个表
func (s *Student) TableName() string {
//返回mysql表名
return "student"
}
//初始化函数,可以用来向orm注册model
func init(){
//向orm注册Student模型
orm.RegisterModel(&Student{})
}
//根据id查询学生信息
func GetStudentById(id int) * Student {
if id == 0 {
return nil
}
//创建orm对象,后面都是通过orm对象操作数据库
o := orm.NewOrm()
//初始化一个Student模型对象
student := Student{}
//设置查询参数
student.Id = id
//调用Read方法,根据student设置的参数,查询一条记录,结果保存到student结构体变量中
//默认是根据主键进行查询
//等价sql:SELECT `id`, `name`, `age`, `stu_class`, `address` FROM `student` WHERE `id` = 1
err := o.Read(&student)
//检测查询结果
if err == orm.ErrNoRows {
//找不到记录
return nil
} else if err == orm.ErrMissPK {
//找不到主键
return nil
}
return &student
}
3.4 通过控制器调用model
下面修改控制器代码,GoDemoController.go文件中的Get()方法。
func (c *GoDemoController) Get() {
// 获取请求参数, 返回int类型
id, _ := c.GetInt("id")
//Data是继承过来的属性,是map类型,可以保存任意类型数据,主要用于保存请求响应数据
//可以通过Data将参数,传入视图模板文件
c.Data["title"] = "学生信息统计"
//调用model,根据id查询对应的学生信息
student := models.GetStudentById(id)
// 然后将student数据保存到Data中, 将参数传给后面的views视图模板处理
c.Data["student"] = student
// 设置需要渲染的模板文件,框架会去views目录查找这个模板文件
c.TplName = "student.tpl"
}
四、编写view视图逻辑
在views目录下创建student.tpl文件
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<title>Demo</title>
<meta charset="utf-8">
</head>
<body>
<h2>{{.title}}</h2>
{{ if .student }}
用户名: {{.student.Name}} <br/>
年 龄: {{.student.Age}} <br/>
年 级: {{.student.StuClass}} 年级 <br/>
地 址: {{.student.Address}} <br/>
{{else}}
查寻不到该学生
{{ end }}
</body>
</html>
如果查询的学生存在,则显示对应的学生信息,否则显示查寻不到该学生。
五、运行项目
5.1 准备工作
运行项目之前在项目终端执行如下命令
D:\Codes\goland\go_project>go mod tidy
5.2 启动项目
在main.go文件下启动main方法
5.3 访问地址链接
通过浏览器访问如下地址:
http://127.0.0.1:8080/student?id=1