原创:转载请标明出处:
https://blog.csdn.net/ming2316780/article/details/86499344
本文出自:【iGoogle.ink的博客】
最近写项目发现,很多逻辑业务的实现,写到数据库的存储过程中,然后调用,真的非常方便。后端代码量大大减少,最重要的是性能高,速度快!
create table contact
(
user_id int auto_increment
primary key,
real_name varchar(5) default '' null,
age int default 0 null,
phone_number varchar(15) default '' null,
home_address varchar(50) default '' null,
create_time datetime null
);
insert into contact (real_name, age, phone_number, home_address, reate_time) values ('Jerry',28,'18017448610','上海市','2019-08-08 15:30');
-- 创建存储过程
create
definer = jerry@`%` procedure query_contact(IN i_name varchar(10), OUT o_user_id int, OUT o_real_name varchar(10),
OUT o_age int, OUT o_phone_number varchar(15),
OUT o_address varchar(50), OUT o_create_time datetime)
comment '根据名字和性别查询学生信息'
begin
-- 搜索信息并赋值
select contact.user_id as user_id,
contact.real_name as real_name,
contact.age as age,
contact.phone_number as phone_number,
contact.home_address as home_address,
contact.create_time as create_time
from contact
where contact.real_name = i_name;
-- 返回结果需要返回的结果
# select o_user_id, o_real_name, o_age, o_phone_number, o_address;
end;
$ go get -u github.com/iGoogle-ink/jorm
在项目运行init中初始化
err := jorm.InitMySQL("root:password@tcp(jerry.igoogle.ink:3306)/db_test?charset=utf8&parseTime=true&loc=Local")
if err != nil {
fmt.Println("err:", err)}
xorm原有的功能,都还将保留支持
type Contact struct {
UserId int `json:"user_id"`
Name string `json:"name" jorm:"real_name" xorm:"real_name"`
Age int `json:"age"`
PhoneNumber string `json:"phone_number"`
HomeAddress string `json:"home_address"`
CreateTime string `json:"create_time"`
}
//jorm.MySQL() 默认返回 *xorm.Engine
//查询columns包含的字段
columns := []string{"real_name", "age", "phone_number", "home_address"}
contact := new(Contact)
_, err = jorm.MySQL().Where("real_name = ?", "付明明").Cols(columns...).Get(contact)
if err != nil {
fmt.Println("err:", err)
} else {
fmt.Println("contact:", contact)
}
输出结果为:
contact: {0 付明明 29 18017448610 上海市杨浦区 }
result, err := jorm.CallProcedure("query_contact", 1, 6).InParams("付明明").Query()
if err != nil {
fmt.Println("err:", err)
}
for _, v := range result {
fmt.Println(v)
}
输出结果为:
map[age:29 create_time:2019-05-10 12:31:59 home_address:上海市杨浦区 phone_number:18017448610 real_name:付明明 user_id:1]
结构体内字段默认为驼峰命名转小写字母加 _(例:HelloWorld 转换为 hello_world)
驼峰命名转换后的字段,要与数据库column字段相同(例:数据库column字段为 phone_number,结构体字段应为 PhoneNumber)
字段后加标记,为数据库column字段(例:如下Contact结构体Name字段,加标记后则默认数据库column字段为jorm标记中的字段 real_name)
type Contact struct {
UserId int `json:"user_id"`
Name string `json:"name" jorm:"real_name"`
Age int `json:"age"`
PhoneNumber string `json:"phone_number"`
HomeAddress string `json:"home_address"`
CreateTime string `json:"create_time"`
}
contact := new(Contact)
has, err := jorm.CallProcedure("query_contact", 1, 6).InParams("付明明").Get(contact)
if err != nil {
fmt.Println("err:", err)
}
if has {
fmt.Println("contact:", *contact)
} else {
fmt.Println("没有查到需要的数据")
}
输出结果为:
contact: {1 付明明 29 18017448610 上海市杨浦区 2019-05-10 12:31:59}
结构体内字段默认为驼峰命名转小写字母加 _(例:HelloWorld 转换为 hello_world)
驼峰命名转换后的字段,要与数据库column字段相同(例:数据库column字段为 phone_number,结构体字段应为 PhoneNumber)
字段后加标记,为数据库column字段(例:如下Contact结构体RealName字段,加标记后则默认数据库column字段为标记中的字段 name)
type Contact struct {
UserId int `json:"user_id"`
Name string `json:"name" jorm:"real_name"`
Age int `json:"age"`
PhoneNumber string `json:"phone_number"`
HomeAddress string `json:"home_address"`
CreateTime string `json:"create_time"`
}
contactList := make([]Contact, 0)
err = jorm.CallProcedure("query_contact", 1, 6).InParams("付明明").Find(&contactList)
if err != nil {
fmt.Println("err:", err)
}
fmt.Println("contactList:", contactList)
输出结果为:
contactList: [{1 付明明 29 18017448610 上海市杨浦区 2019-05-10 12:31:59} {2 付明明 28 18017448610 上海市杨浦区2 2019-08-08 15:51:18} {3 付明明 30 18017448610 上海市杨浦区3 2019-08-08 15:53:12}]