日常笔记19/3/04-19/3/10

一:19/3/5   周二

1): mysql之IF表达式和NULL值

*  通过java查询mysql的NULL值,java用空对象来接受mysql的null值会有空指针隐患

*  对于null的处理 >>>> 在java中用空对象判断在mysql服务器用 IS NULL来判断()

*  对于NULL值的大小判断>>>> NULL值是最小的的值(即order by(默认升序) 排序会排在最前边)

mysql> SELECT *  FROM tb_key ORDER BY NAME;
+----+--------+
| id | name   |
+----+--------+
|  1 | NULL   |
|  4 | NULL   |
|  8 | 'null' |
|  7 | -1     |
|  6 | 1      |
|  3 | 2      |
|  2 | 3      |
+----+--------+
7 rows in set (0.00 sec)

*  若用Mysql服务的IF函数处理null ,if函数在order by(排序)后处理,即只能改变值的显示,并不能影响排序。

mysql> SELECT IF(NAME IS NULL,-1,NAME) FROM tb_key ORDER BY NAME;
+--------------------------+
| IF(NAME IS NULL,-1,NAME) |
+--------------------------+
| -1                       |
| -1                       |
| 'null'                   |
| -1                       |
| 1                        |
| 2                        |
| 3                        |
+--------------------------+
7 rows in set (0.00 sec)
View Code

2): java之可变参数

前言:因为需求缘故,需设计一个方法,该参数可能是一个数组。因为ThinkInJava这本书提到的可变参数提醒我,是否可以用可变参数来设置这个方法,很遗憾最终结果是可变参数不太实用。但借此也做复习一下可变参数。

定义如下:

public class VariableParamter {
    public static void main(String[] args) {
        VariableParamter vm = new VariableParamter();
        vm.tParamter(22,2,66,2,21); //调用可变参数
        int[] a = {2,4,3};
        vm.tParamter(a); //兼容数组
        vm.tParamter(); //可传递空对象,相比数组参数  
        //vm.tParamter2(); //数组参数不能设置空对象
    }
    private void tParamter(int ... arg) {
        System.out.println(arg.toString()); //输出“[I@6d06d69c”  故可推测传过来就是一个数组对象
        for (int i : arg) {
            System.out.println(i);
        }
    }
    private void tParamter2(int[] arg) {
        System.out.println(arg.toString()); //输出“[I@6d06d69c”  故可推测传过来就是一个数组对象
        for (int i : arg) {
            System.out.println(i);
        }
    }
    //不支持泛型
    //private void tParamter3(T... arg) {}
    //如果需要多个参数,多参必须定义放在最后
    private void tParamter4(int a ,int ...agr) {}
    /**
     * tParamter5(int ...agr,int a ) 编写报错如下
     * The variable argument type int of the method tParamter5 must be the last parameter
     */
    //private void tParamter5(int ...agr,int a ) {}
}
View Code

*  可变参数vs数组 >>>可变参数是1.5的新特征,并且兼容数组,即可变参数方法可接受数组,如下

*  可变参数的本质>>>就是数组,

*  如果是多个种类的参数方法,可变参数只能放在最后定义。

*  可变参数不支持泛型

*  可变参数可以传递空对象

3): 实用SQL语句

* 情景1:给旧表添加新字段,并且根据之前的数据,设置不同的值 。

CREATE TABLE `test` (
  `a` int(11) DEFAULT NULL,
  `b` varchar(1024) DEFAULT NULL,
  `c` varchar(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
View Code

语句:update test set c= (CASE a WHEN 1 THEN 'one'  WHEN 2 THEN 'two' ELSE 'more' END)

分析:set  col_name = value  其中value值可以是一个表达式,并且该表达式中的字段可以获取到当前的其它值,例如 a和1,2。

注意:update语句不能和select语句连用

* 情景2: 根据业务,需要新建一张关联表。该表关联已知两个表的数据

分析:可以实用insert [into] table_name(col_name1,col_name2........) from .......语句

例如:

二:19/3/10   周日

1):jdbc之RowSet对象(接口),

前言:最近在看官方javaSE教程关于jdbc的使用。因为之前都是使用Spring的jdbcTemplete对象来操作数据库,故很少关注原生的Connection,虽然知道它的大概,但今天看到RowSet还是十分吃惊他的强大的。示例代码 + 官方javaSE教程

* 我们知道JDBC RowSet对象就是简单的查询数据库的结果集,而并不能对结果做任何修改(这里的修改是指修改该集合中的数据并不能影响数据库数据),而RowSet对象相比RowSet对对象就灵活的多了,它可以对查询出得结果做很多操作(修改,新增。。。。。),

* 原理:RowSet通过持有Connection和事件机制(即修改该对象的属性就会发生触发事件)来实现修改.....操作来管理数据库

* 他的多种特征可通过其实现类来表显,官方为我们扩展五个RowSet接口的实现分别如下

  • JdbcRowSet (对结果的增,删,该操作影响数据库)
  • CachedRowSet (缓存)
  • WebRowSet
  • JoinRowSet
  • FilteredRowSet (对结果集的过滤)

我通过官方例子,测试了JdbcRowSet和FilteredRowSet对象,其中包括使用方式和用法

JdbcRowSet:测试结果 源码地址JdbcRowSetSample.java

//指定对某一行修改
Amaretto, 49, 15.61, 0, 0
Amaretto_decaf, 49, 17.18, 0, 0
Colombian, 101, 10.99, 175, 525   //之前数据不是这样的
Colombian_Decaf, 101, 17.56, 155, 465
Espresso, 150, 19.51, 60, 180
French_Roast, 49, 17.56, 150, 450
French_Roast_Decaf, 49, 19.51, 90, 270
Hazelnut, 49, 15.61, 0, 0
Hazelnut_decaf, 49, 17.18, 0, 0
Kona, 150, 17.18, 0, 0

//对结果集插入两行
Amaretto, 49, 15.61, 0, 0
Amaretto_decaf, 49, 17.18, 0, 0
Colombian, 101, 10.99, 175, 525
Colombian_Decaf, 101, 17.56, 155, 465
Espresso, 150, 19.51, 60, 180
French_Roast, 49, 17.56, 150, 450
French_Roast_Decaf, 49, 19.51, 90, 270
Hazelnut, 49, 15.61, 0, 0
Hazelnut_decaf, 49, 17.18, 0, 0
HouseBlend, 49, 7.99, 0, 0
HouseDecaf, 49, 8.99, 0, 0
Kona, 150, 17.18, 0, 0

//删除
Amaretto, 49, 15.61, 0, 0
Amaretto_decaf, 49, 17.18, 0, 0
Colombian, 101, 10.99, 175, 525
Colombian_Decaf, 101, 17.56, 155, 465
Espresso, 150, 19.51, 60, 180
French_Roast, 49, 17.56, 150, 450
French_Roast_Decaf, 49, 19.51, 90, 270
Hazelnut, 49, 15.61, 0, 0
Hazelnut_decaf, 49, 17.18, 0, 0
HouseBlend, 49, 7.99, 0, 0
Kona, 150, 17.18, 0, 0
Releasing all open resources ...

FilteredRowSet:测试结果  源码地址FilteredRowSetSample.java

//原数据
10023, Mendocino, 3450, 2005, 5455
10024, Sacramento, 1987, 2341, 4328
10034, San_Jose, 1234, 1032, 2266
10035, SF, 1922, 1056, 2978
10037, LA, 2143, 1876, 4019
10039, Carmel, 2691, 1121, 3812
10040, SF, 5386, 2841, 8227
10041, LA, 1533, 1007, 2540
10042, SF, 2863, 1874, 4710
32001, Portland, 3147, 3579, 6726
32004, Eugene, 1356, 1112, 2468
33002, Seattle, 4699, 3109, 7808
33005, Olympia, 2733, 1550, 4283
33010, Seattle, 3210, 2177, 5387

//设置过滤器的数据 对ID 过滤
10023, Mendocino, 3450, 2005, 5455
10024, Sacramento, 1987, 2341, 4328
10034, San_Jose, 1234, 1032, 2266
10035, SF, 1922, 1056, 2978
10037, LA, 2143, 1876, 4019
10039, Carmel, 2691, 1121, 3812
10040, SF, 5386, 2841, 8227
10041, LA, 1533, 1007, 2540
10042, SF, 2863, 1874, 4710
//设置过滤器的数据2 
10035, SF, 1922, 1056, 2978
10037, LA, 2143, 1876, 4019
10040, SF, 5386, 2841, 8227
10041, LA, 1533, 1007, 2540
10042, SF, 2863, 1874, 4710
Releasing all open resources ...

 

posted @ 2019-03-05 21:17  爱我-中华  阅读(145)  评论(0编辑  收藏  举报