Ent

快速开始 创建第一个模式 1 go run -mod=mod entgo.io/ent/cmd/ent init User 执行后会引入Ent并创建User的schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // User在User实体中组合了ent默认的数据库模式定义 type User struct { ent.Schema } // User的字段 func (User) Fields() []ent.Field { return nil } // User的边 func (User) Edges() []ent.Edge { return nil } 添加字段 1 2 3 4 5 6 7 8 9 // User的字段 func (User) Fields() []ent.Field { return []ent.Field{ field.Int("age"). Positive(), field.String("name"). Default("unknown"), } } 生成代码 1 go generate ./ent 创建连接 postgres 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package main import ( "context" "log" "<project>/ent" _ "github.com/lib/pq" ) func main() { client, err := ent.Open("postgres", "host=<host> port=<port> user=<user> dbname=<database> password=<pass>") if err != nil { log.Fatalf("failed opening connection to postgres: %v", err) } defer client.Close() // 运行自动迁移工具。 if err := client.Schema.Create(context.Background()); err != nil { log.Fatalf("failed creating schema resources: %v", err) } } sqlite3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package main import ( "context" "log" "<project>/ent" _ "github.com/mattn/go-sqlite3" ) func main() { client, err := ent.Open("sqlite3", "file:ent?mode=memory&cache=shared&_fk=1") if err != nil { log.Fatalf("failed opening connection to sqlite: %v", err) } defer client.Close() // 运行自动迁移工具。 if err := client.Schema.Create(context.Background()); err != nil { log.Fatalf("failed creating schema resources: %v", err) } } mysql 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package main import ( "context" "log" "<project>/ent" _ "github.com/go-sql-driver/mysql" ) func main() { client, err := ent.Open("mysql", "<user>:<pass>@tcp(<host>:<port>)/<database>?parseTime=True") if err != nil { log.Fatalf("failed opening connection to mysql: %v", err) } defer client.Close() // 运行自动迁移工具。 if err := client.Schema.Create(context.Background()); err != nil { log.Fatalf("failed creating schema resources: %v", err) } } 创建实体 1 2 3 4 5 6 7 8 9 10 11 12 func CreateUser(ctx context.Context, client *ent.Client) (*ent.User, error) { u, err := client.User. Create(). SetAge(30). SetName("a8m"). Save(ctx) if err != nil { return nil, fmt.Errorf("failed creating user: %w", err) } log.Println("user was created: ", u) return u, nil } 查询实体 1 2 3 4 5 6 7 8 9 10 11 12 13 func QueryUser(ctx context.Context, client *ent.Client) (*ent.User, error) { u, err := client.User. Query(). Where(user.Name("a8m")). // `Only` 如果没有发现用户则报错, // 否则正常返回。 Only(ctx) if err != nil { return nil, fmt.Errorf("failed querying user: %w", err) } log.Println("user returned: ", u) return u, nil }

2024-11-13 · 2 分钟 · Nebula

Golang-Redis

引入 1 go get github.com/redis/go-redis 基础使用 连接 基于配置的连接 1 2 3 4 5 rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // 没有密码,默认值 DB: 0, // 默认DB 0 }) 基于URL的连接 1 2 3 4 5 6 opt, err := redis.ParseURL("redis://<user>:<pass>@localhost:6379/<db>") if err != nil { panic(err) } rdb := redis.NewClient(opt) 配置TLS 1 2 3 4 5 6 rdb := redis.NewClient(&redis.Options{ TLSConfig: &tls.Config{ MinVersion: tls.VersionTLS12, ServerName: "你的域名", }, }) 基于SSH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 sshConfig := &ssh.ClientConfig{ User: "root", Auth: []ssh.AuthMethod{ssh.Password("password")}, HostKeyCallback: ssh.InsecureIgnoreHostKey(), Timeout: 15 * time.Second, } sshClient, err := ssh.Dial("tcp", "remoteIP:22", sshConfig) if err != nil { panic(err) } rdb := redis.NewClient(&redis.Options{ Addr: net.JoinHostPort("127.0.0.1", "6379"), Dialer: func(ctx context.Context, network, addr string) (net.Conn, error) { return sshClient.Dial(network, addr) }, // SSH不支持超时设置,在这里禁用 ReadTimeout: -1, WriteTimeout: -1, }) 上下文 go-redis支持Context,可以使用它控制超时或者传递一些数据,也可以监控go-redis性能。 ...

2024-09-12 · 2 分钟 · Nebula

Gorm

2024-08-09 · 0 分钟 · Nebula

Java-Redis

springboot整合 配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 spring: data: redis: # Redis数据库索引(默认为0) database: 1 # Redis服务器地址 host: 127.0.0.1 # Redis服务器连接端口 port: 6379 # Redis服务器连接密码(默认为空) password: # 连接超时时间 timeout: 10s lettuce: pool: # 连接池最大连接数 max-active: 200 # 连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # 连接池中的最大空闲连接 max-idle: 10 # 连接池中的最小空闲连接 min-idle: 0 创建配置类 1 2 3 4 5 6 7 8 9 10 11 12 //设置序列化器 @Configuration public class RedisConfig { @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<Object, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); //把对象转为json字符串的序列化工具 template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer()); return template; } } 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @Autowired private RedisTemplate redisTemplate; @Test public void testObj() throws Exception { User user=new User(1, "java的架构师技术栈", "man"); ValueOperations<String, User> operations=redisTemplate.opsForValue(); operations.set("fdd2", user); boolean exists=redisTemplate.hasKey("fdd2"); System.out.println("redis是否存在相应的key"+exists); User getUser = (User)redisTemplate.opsForValue().get("fdd2"); System.out.println("从redis数据库获取的user:"+getUser.toString()); } //redisTemplate.opsForValue();//操作字符串 //redisTemplate.opsForHash();//操作hash //redisTemplate.opsForList();//操作list //redisTemplate.opsForSet();//操作set //redisTemplate.opsForZSet();//操作有序set

2024-08-09 · 1 分钟 · Nebula

Mybatis

基本流程 首先进行环境配置,设置application.properties文件配置 1 2 3 4 5 6 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/mybatis spring.datasource.username=root spring.datasource.password=123456 mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl #开启日志输出可选 创建pojo对象,对应数据库字段 创建mapper对象,设置@Mapper注解,以及使用@Select注解编写SQL语句 1 2 3 4 5 @Mapper public interface userMapper { @Select("select * from user") public List<user> list(); } 设置程序入口方法,使用@Autowired注入mapper对象,并调用方法完成数据操作 lombok 注解 作用 @Getter/@Setter 提供get/set方法 @ToString 提供tostring方法 @EqualsAndHashCode 提供equals和hashcode方法 @Data 提供以上三种方法 @NoArgsConstructor 提供无参构造 @AllArgsConstructor 提供除static方法外的所有参数构造器 SQL预编译 可以防止sql注入,更快也更安全。 #{}占位符最终会替换为?,主要用在参数传递 ${}占位符将参数直接拼接在sql语句中,对表名和列名进行动态设置时使用 CRUD操作 删除 1 2 3 4 5 6 public interface Mapper{ @Delete("delete from user where id = #{id}") //如果形参中只有一个参数,则括号中可以随便写参数 public int delete(Integer id); //int 表示受到影响的行数 } 新增 ...

2024-08-09 · 1 分钟 · Nebula