├── .gitignore ├── README.md ├── configuration.json ├── dao ├── factory │ └── factory.go ├── interfaces │ └── userdao.go ├── mysql │ ├── connection.go │ └── userimpl.go └── psql │ └── connection.go ├── main.go ├── models ├── configuration.go └── users.go └── utilities └── utilities.go /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | dao-pattern.iml 3 | 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # dao-pattern-in-go 2 | An useful example about how to implement the DAO pattern using Golang as programming language. 3 | -------------------------------------------------------------------------------- /configuration.json: -------------------------------------------------------------------------------- 1 | { 2 | "engine": "mysql", 3 | "server": "127.0.0.1", 4 | "port": "3306", 5 | "user": "root", 6 | "password": "root", 7 | "database": "daopattern" 8 | } -------------------------------------------------------------------------------- /dao/factory/factory.go: -------------------------------------------------------------------------------- 1 | package factory 2 | 3 | import ( 4 | "log" 5 | 6 | "github.com/gustavocd/dao-pattern-in-go/dao/interfaces" 7 | "github.com/gustavocd/dao-pattern-in-go/dao/mysql" 8 | ) 9 | 10 | func FactoryDao(e string) interfaces.UserDao { 11 | var i interfaces.UserDao 12 | switch e { 13 | case "mysql": 14 | i = mysql.UserImplMysql{} 15 | default: 16 | log.Fatalf("El motor %s no esta implementado", e) 17 | return nil 18 | } 19 | 20 | return i 21 | } 22 | -------------------------------------------------------------------------------- /dao/interfaces/userdao.go: -------------------------------------------------------------------------------- 1 | package interfaces 2 | 3 | import "github.com/gustavocd/dao-pattern-in-go/models" 4 | 5 | type UserDao interface { 6 | Create(u *models.User) error 7 | /*Update(u *models.User) error 8 | Delete(i int) error 9 | GetById(i int) (models.User, error)*/ 10 | GetAll() ([]models.User, error) 11 | } 12 | -------------------------------------------------------------------------------- /dao/mysql/connection.go: -------------------------------------------------------------------------------- 1 | package mysql 2 | 3 | import ( 4 | "database/sql" 5 | "fmt" 6 | "log" 7 | 8 | _ "github.com/go-sql-driver/mysql" 9 | "github.com/gustavocd/dao-pattern-in-go/utilities" 10 | ) 11 | 12 | func get() *sql.DB { 13 | config, err := utilities.GetConfiguration() 14 | if err != nil { 15 | log.Fatalln(err) 16 | return nil 17 | } 18 | 19 | dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?tls=false&autocommit=true", config.User, config.Password, config.Server, config.Port, config.Database) 20 | db, err := sql.Open("mysql", dsn) 21 | if err != nil { 22 | log.Fatalln(err) 23 | return nil 24 | } 25 | return db 26 | } 27 | -------------------------------------------------------------------------------- /dao/mysql/userimpl.go: -------------------------------------------------------------------------------- 1 | package mysql 2 | 3 | import "github.com/gustavocd/dao-pattern-in-go/models" 4 | 5 | type UserImplMysql struct { 6 | } 7 | 8 | func (dao UserImplMysql) Create(u *models.User) error { 9 | query := "INSERT INTO users (first_name, last_name, email) VALUES(?, ?, ?)" 10 | db := get() 11 | defer db.Close() 12 | stmt, err := db.Prepare(query) 13 | 14 | if err != nil { 15 | return err 16 | } 17 | 18 | defer stmt.Close() 19 | result, err := stmt.Exec(u.FirstName, u.LastName, u.Email) 20 | if err != nil { 21 | return err 22 | } 23 | 24 | id, err := result.LastInsertId() 25 | if err != nil { 26 | return err 27 | } 28 | 29 | u.ID = int(id) 30 | return nil 31 | } 32 | 33 | func (dao UserImplMysql) GetAll() ([]models.User, error) { 34 | query := "SELECT id, first_name, last_name, email FROM users" 35 | users := make([]models.User, 0) 36 | db := get() 37 | defer db.Close() 38 | 39 | stmt, err := db.Prepare(query) 40 | if err != nil { 41 | return users, err 42 | } 43 | 44 | defer stmt.Close() 45 | 46 | rows, err := stmt.Query() 47 | if err != nil { 48 | return users, err 49 | } 50 | 51 | for rows.Next() { 52 | var row models.User 53 | err := rows.Scan(&row.ID, &row.FirstName, &row.LastName, &row.Email) 54 | if err != nil { 55 | return nil, err 56 | } 57 | 58 | users = append(users, row) 59 | } 60 | 61 | return users, nil 62 | 63 | } 64 | -------------------------------------------------------------------------------- /dao/psql/connection.go: -------------------------------------------------------------------------------- 1 | package psql 2 | 3 | import ( 4 | "database/sql" 5 | "fmt" 6 | "log" 7 | 8 | "github.com/gustavocd/dao-pattern-in-go/utilities" 9 | _ "github.com/lib/pq" 10 | ) 11 | 12 | func get() *sql.DB { 13 | config, err := utilities.GetConfiguration() 14 | if err != nil { 15 | log.Fatalln(err) 16 | return 17 | } 18 | 19 | dsn := fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable", config.User, config.Password, config.Server, config.Port, config.Database) 20 | db, err := sql.Open("postgres", dsn) 21 | if err != nil { 22 | log.Fatalln(err) 23 | return 24 | } 25 | return db 26 | } 27 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "log" 6 | 7 | "github.com/gustavocd/dao-pattern-in-go/dao/factory" 8 | "github.com/gustavocd/dao-pattern-in-go/models" 9 | "github.com/gustavocd/dao-pattern-in-go/utilities" 10 | ) 11 | 12 | func main() { 13 | config, err := utilities.GetConfiguration() 14 | if err != nil { 15 | log.Fatal(err) 16 | return 17 | } 18 | 19 | userDao := factory.FactoryDao(config.Engine) 20 | 21 | user := models.User{} 22 | fmt.Println("Digite su nombre:") 23 | fmt.Scan(&user.FirstName) 24 | fmt.Println("Digite su apellido:") 25 | fmt.Scan(&user.LastName) 26 | fmt.Println("Digite su correo:") 27 | fmt.Scan(&user.Email) 28 | 29 | err = userDao.Create(&user) 30 | 31 | if err != nil { 32 | log.Fatal(err) 33 | return 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /models/configuration.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | type Configuration struct { 4 | Engine string 5 | Server string 6 | Port string 7 | User string 8 | Password string 9 | Database string 10 | } 11 | -------------------------------------------------------------------------------- /models/users.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | type User struct { 4 | ID int 5 | FirstName string 6 | LastName string 7 | Email string 8 | } 9 | -------------------------------------------------------------------------------- /utilities/utilities.go: -------------------------------------------------------------------------------- 1 | package utilities 2 | 3 | import ( 4 | "encoding/json" 5 | "os" 6 | 7 | "github.com/gustavocd/dao-pattern-in-go/models" 8 | ) 9 | 10 | func GetConfiguration() (models.Configuration, error) { 11 | config := models.Configuration{} 12 | file, err := os.Open("./configuration.json") 13 | if err != nil { 14 | return config, err 15 | } 16 | defer file.Close() 17 | decoder := json.NewDecoder(file) 18 | err = decoder.Decode(&config) 19 | if err != nil { 20 | return config, err 21 | } 22 | 23 | return config, nil 24 | } 25 | --------------------------------------------------------------------------------