设置 MySQL、SQL Server、Oracle 的 DML 触发器

软件设置 2016-05-24


当 users 表在 insert,update,delete 时,在 users_log 表中记录变更的 id

MySQL

  • 触发时机:BEFORE,AFTER

  • 触发事件:INSERT,UPDATE,DELETE

  • NEW 和 OLD 关键字:

    action NEW OLD
    insert 插入的新数据
    update 修改为的新数据 被修改的原数据
    delete 被删除的原数据
DELIMITER $
CREATE TRIGGER insert_user AFTER INSERT
ON users FOR EACH ROW 
BEGIN
    INSERT INTO users_log(user_id, action) VALUES(NEW.id, 'insert');
END$
DELIMITER ;

SQL Server


Docker Machine 的安装使用方法

软件设置 2016-04-26


通过 Homebrew 安装

在 Mac 下使用 Homebrew 安装 docker-machine,并使用 Parallels Desktop 作为虚拟机

brew install docker-machine
brew install docker-machine-parallels

创建 Docker Engines 虚拟机

docker-machine create --engine-registry-mirror=镜像加速器地址 --driver=parallels default

Java 动态代理的使用简介

Java语言 2016-03-10


动态代理作用

动态代理是 Java SE 1.3 新增的特性,利用动态代理可以在运行时创建一个实现了一组给定接口的新类。因此动态代理代理的是接口,不是类。

使用动态代理的场景:

  • 一个接口的实现在编译时无法知道,需要在运行时才能实现
  • 实现更加通用的适配器(Adapter)和装饰器(Decorator)
  • 面向切面编程的支持

MySQL 的 InnoDB MVCC 实现原理

技术概念 2015-11-16


在 MySQL 中 InnoDB 的 MVCC 实现机制是给每行记录增加三个隐藏字段:

  • 6 字节的 DB_TRX_ID,用于记录最近一次插入或更新的事务标示。删除也是一种更新,用一个特殊的字节表示该行已删除。
  • 7 字节的 DB_ROLL_PTR,回滚指针,指向 undo log 记录。
  • 6 字节的 DB_ROW_ID,自增长的 row ID。 参考:InnoDB Multi-Versioning

事务的四种隔离级别

虽然说事务的隔离级别定义的是读数据的要求,而实际上也可以说是定义了写(当前读)数据的要求。

  • 未提交读 (Read Uncommitted): 允许一个事务读取到其它事务中未提交的数据,会出现脏读、不可重复读、幻读。
  • 已提交读 (Read Committed): 只能读取到已提交的数据,会出现不可重复读、幻读。
  • 可重复读 (Repeated Read): 在同一事务内相同条件下多次查询结果一致,会出现幻读。InnoDB 默认事务隔离级别。
  • 未提交读 (Serilizable): 事务串行化执行。

JPA 一对多关系实体映射方式

Java语言 2015-11-10


一对多单向关联

通过有 @Id 注解的字段进行关联
public class User {
    @Id
    @GeneratedValue
    private Integer id;
    @Column
    private String username;
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id")
    private Set<Email> emails = new HashSet<>();
}
public class Email {
    @Id
    @GeneratedValue
    private Integer id;
    /* 默认关联字段名为:驼峰类名转为下划线方式 + "_" + @Id 注解的字段名。
    例如 User 的 username 字段有 @Id 注解,则 Email 表关联的字段就默认为 user_username */
    @Column(name = "user_id")
    private Integer userId; 
    @Column
    private String email;
}
通过手动指定两边的字段名称
public class User implements Serializable {
    @Id
    @GeneratedValue
    private Integer id;
    @Column
    private String username;
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_name", referencedColumnName = "username")
    private Set<Email> emails = new HashSet<>();
}
public class Email {
    @Id
    @GeneratedValue
    private Integer id;
    @Column(name = "user_name")
    private Integer userName;
    @Column
    private String email;
}

JPA 一对一关系实体映射方式

Java语言 2015-11-09


一对一双向关联

使用注意
User user = new User();
user.setUsername("tangjiujun");
Email email = new Email();
email.setUser(user);  // 必须显示设置 user,否则关联字段值会为空
email.setEmail("jiujun.tang@gmail.com");
user.setEmail(email); 
userRepository.save(user);
通过 @Id 注解指定的字段进行关联

Spring-Boot 测试相关的方法总结

Java语言 2015-09-14


Spring Integration 测试

  1. 新建一个测试配置类 TestApplication
@Configuration
@EnableAutoConfiguration
@ComponentScan(
        excludeFilters = @ComponentScan.Filter(value = {
                Application.class,
                ApplicationChecker.class
        }, type = FilterType.ASSIGNABLE_TYPE))
public class TestApplication {
    // 配置测试使用内存数据库
    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
    }
}
  1. 新建一个测试公共类 CommonBeanIntegrationTest