public List query(String sql, RowMapper rowMapper);
public List query(String sql, RowMapper rowMapper, @Nullable Object... args);
public List query(String sql, Object[] args, int[] argTypes, RowMapper rowMapper);
public T queryForObject(String sql, Class requiredType);
public T queryForObject(String sql, Class requiredType, @Nullable Object... args);
public T queryForObject(String sql, Object[] args, int[] argTypes, Class requiredType);
public T queryForObject(String sql, RowMapper rowMapper);
public T queryForObject(String sql, RowMapper rowMapper, @Nullable Object... args);
public T queryForObject(String sql, Object[] args, int[] argTypes, RowMapper rowMapper);
public List queryForList(String sql, Class elementType);
public List queryForList(String sql, Class elementType, @Nullable Object... args);
public List queryForList(String sql, Object[] args, int[] argTypes, Class elementType);
6.2.2 queryForList使用场景
场景:使用queryForList函数,把查询结果封装为指定的基本类型,返回值封装在 List 中。适合查询一个字段的多条记录。
@Data
@NoArgsConstructor
public class CityPO {
private long id;
private String cityName;
private double landArea;
private long population;
private double gross;
private String cityDescribe;
private String dataYear;
private LocalDateTime updateTime;
二、增
增,即使用JdbcTemplate对数据库的数据做插入操作。
SQL关键字:insert into。
1.update函数
1.1 update函数定义
执行数据数据库insert into插入数据,使用update函数实现。
参数sql:数据库执行的SQL语句。
参数pss:对应入参和占位符字段匹配关系。
参数args:是SQL中有占位符?时,传入变量的方式。
参数argTypes:是args传入参数对应的数据库表字段的数据类型。
public int update(final String sql);
public int update(String sql, @Nullable Object... args);
public int update(String sql, @Nullable PreparedStatementSetter pss);
public int update(String sql, Object[] args, int[] argTypes);
public int[] batchUpdate(final String... sql);
public int[] batchUpdate(String sql, List
2.2 batchUpdate使用场景
场景:使用batchUpdate函数,可以执行数据库的insert into批量插入数据。
2.3 batchUpdate使用举例
/**
* 1.insert插入语句,使用batchUpdate函数
* 2.batchUpdate函数入参不带插入数据,数据直接写在insert into语句中
*/
public static void f8_1() {
// 1.获取插入sql
String[] sql = getInsertSql03();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.执行insert语句
int[] result = jt.batchUpdate(sql);
// 4.遍历并打印返回值
List list = Arrays.stream(result).boxed().collect(Collectors.toList());
for (Object var : list) {
System.out.println("返回值: " + var);
}
}
/**
* 1.insert插入语句,使用batchUpdate函数
* 2.batchUpdate函数入参带插入数据
*/
public static void f8_2() {
// 1.获取插入sql
String sql = getInsertSql01();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.组装插入参数
List batchArgs = getInsertBatchArgs();
// 4.执行insert语句
int[] result = jt.batchUpdate(sql, batchArgs);
// 5.打印返回值
List list = Arrays.stream(result).boxed().collect(Collectors.toList());
for (Object var : list) {
System.out.println("返回值: " + var);
}
}
/**
* 1.insert插入语句,使用batchUpdate函数
* 2.batchUpdate函数入参带插入数据,入参带参数类型
*/
public static void f8_3() {
// 1.获取插入sql
String sql = getInsertSql01();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.组装插入参数
List batchArgs = getInsertBatchArgs();
int[] argTypes = new int[]{Types.VARCHAR,
Types.DOUBLE, Types.BIGINT, Types.DOUBLE,
Types.VARCHAR, Types.VARCHAR, Types.TIMESTAMP
};
// 4.执行insert语句
int[] result = jt.batchUpdate(sql, batchArgs, argTypes);
// 5.打印返回值
List list = Arrays.stream(result).boxed().collect(Collectors.toList());
for (Object var : list) {
System.out.println("返回值: " + var);
}
}
/**
* 1.insert插入语句,使用batchUpdate函数
* 2.batchUpdate函数入参带插入数据
* 3.使用BatchPreparedStatementSetter对应入参和字段关系
*/
public static void f8_4() {
// 1.获取插入sql
String sql = getInsertSql01();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.组装插入参数
List batchArgs = getInsertBatchArgs();
// 4.执行insert语句
int[] result = jt.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
// 第一行开始
Object[] args = batchArgs.get(i);
ps.setObject(1, args[0]);
ps.setObject(2, args[1]);
ps.setObject(3, args[2]);
ps.setObject(4, args[3]);
ps.setObject(5, args[4]);
ps.setObject(6, args[5]);
ps.setObject(7, args[6]);
}
@Override
public int getBatchSize() {
return batchArgs.size();
}
});
// 5.打印返回值
List list = Arrays.stream(result).boxed().collect(Collectors.toList());
for (Object var : list) {
System.out.println("返回值: " + var);
}
}
/**
* 1.insert插入语句,使用batchUpdate函数
* 2.batchUpdate函数入参带插入数据
* 3.使用ParameterizedPreparedStatementSetter对应入参和字段关系
*/
public static void f8_5() {
// 1.获取插入sql
String sql = getInsertSql01();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.组装插入参数
List batchArgs = getInsertBatchArgs();
// 4.执行insert语句
int[][] result = jt.batchUpdate(sql, batchArgs, batchArgs.size(),
new ParameterizedPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, Object argument) throws SQLException {
Object[] args = (Object[]) argument;
ps.setObject(1, args[0]);
ps.setObject(2, args[1]);
ps.setObject(3, args[2]);
ps.setObject(4, args[3]);
ps.setObject(5, args[4]);
ps.setObject(6, args[5]);
ps.setObject(7, args[6]);
}
});
// 5.打印返回值
for (int[] ints : result) {
for (int anInt : ints) {
System.out.println("返回值: " + anInt);
}
}
}
/**
* 1.insert语句,插入数据
* 2.update函数入参带插入数据
*/
public static String getInsertSql01() {
String sql01 = "INSERT INTO t_city (\n" +
" CITY_NAME,LAND_AREA,POPULATION,\n" +
" GROSS,CITY_DESCRIBE,DATA_YEAR,UPDATE_TIME\n" +
")\n" +
"VALUES (?, ?, ?, ?, ?, ?, ?)";
return sql01.toString();
}
/**
* 1.insert语句,插入数据
* 2.update函数入参不带插入数据
*/
public static String[] getInsertSql03() {
String sql01 = "INSERT INTO t_city (\n" +
" CITY_NAME,LAND_AREA,POPULATION,\n" +
" GROSS,CITY_DESCRIBE,DATA_YEAR,UPDATE_TIME)\n" +
" VALUES('杭州','16850','1200','1.61',\n" +
" '杭州是一个好城市','2020','2022-07-23 16:39:16')";
String sql02 = "INSERT INTO t_city (\n" +
" CITY_NAME,LAND_AREA,POPULATION,\n" +
" GROSS,CITY_DESCRIBE,DATA_YEAR,UPDATE_TIME)\n" +
" VALUES('杭州','16850','1200','1.81',\n" +
" '杭州是一个好城市','2021','2022-07-23 16:39:19')";
return new String[]{sql01, sql02};
}
/**
* 1.执行数据库insert into语句
* 2.获取批量插入数据
*/
public static List getInsertBatchArgs() {
Object[] args1 = new Object[]{
"杭州", "16850", "1200", "1.61",
"杭州是一个好城市", "2020", "2022-07-23 16:39:51"
};
Object[] args2 = new Object[]{
"杭州", "16850", "1200", "1.81",
"杭州是一个好城市", "2021", "2022-07-23 16:39:52"
};
List batchArgs = new ArrayList<>();
batchArgs.add(args1);
batchArgs.add(args2);
return batchArgs;
}
三、改
改,即使用JdbcTemplate对数据库的数据做修改操作。
SQL关键字:update。
1.update函数
1.1 update函数定义
执行数据数据库update修改数据,使用update函数实现。
参数sql:数据库执行的SQL语句。
参数pss:对应入参和占位符字段匹配关系。
参数args:是SQL中有占位符?时,传入变量的方式。
参数argTypes:是args传入参数对应的数据库表字段的数据类型。
public int update(final String sql);
public int update(String sql, @Nullable Object... args);
public int update(String sql, @Nullable PreparedStatementSetter pss);
public int update(String sql, Object[] args, int[] argTypes);
public int[] batchUpdate(final String... sql);
public int[] batchUpdate(String sql, List batchArgs);
public int[] batchUpdate(String sql, List batchArgs, final int[] argTypes);
public int[] batchUpdate(String sql, final BatchPreparedStatementSetter pss);
public int[][] batchUpdate(String sql, final Collection batchArgs, final int batchSize, final ParameterizedPreparedStatementSetter pss);
2.2 batchUpdate使用场景
场景:使用batchUpdate函数,可以执行数据库的update批量修改数据。
2.3 batchUpdate使用举例
/**
* 1.update修改数据语句,使用batchUpdate函数
* 2.batchUpdate函数入参不带修改数据,数据直接写在update语句中
*/
public static void f10_1() {
// 1.获取修改sql
String[] sql = getUpdateSql03();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.执行update语句
int[] result = jt.batchUpdate(sql);
// 4.遍历并打印返回值
List list = Arrays.stream(result).boxed().collect(Collectors.toList());
for (Object var : list) {
System.out.println("返回值: " + var);
}
}
/**
* 1.update修改数据语句,使用batchUpdate函数
* 2.batchUpdate函数入参带修改数据
*/
public static void f10_2() {
// 1.获取修改sql
String sql = getUpdateSql02();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.组装修改参数
List batchArgs = getUpdateBatchArgs();
// 4.执行update语句
int[] result = jt.batchUpdate(sql, batchArgs);
// 5.打印返回值
List list = Arrays.stream(result).boxed().collect(Collectors.toList());
for (Object var : list) {
System.out.println("返回值: " + var);
}
}
/**
* 1.update修改数据语句,使用batchUpdate函数
* 2.batchUpdate函数入参带修改数据,入参带参数类型
*/
public static void f10_3() {
// 1.获取修改sql
String sql = getUpdateSql02();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.组装修改参数
List batchArgs = getUpdateBatchArgs();
int[] argTypes = new int[]{Types.VARCHAR, Types.TIMESTAMP,
Types.VARCHAR, Types.BIGINT
};
// 4.执行update语句
int[] result = jt.batchUpdate(sql, batchArgs, argTypes);
// 5.打印返回值
List list = Arrays.stream(result).boxed().collect(Collectors.toList());
for (Object var : list) {
System.out.println("返回值: " + var);
}
}
/**
* 1.update修改数据语句,使用batchUpdate函数
* 2.batchUpdate函数入参带修改数据
* 3.使用BatchPreparedStatementSetter对应入参和字段关系
*/
public static void f10_4() {
// 1.获取修改sql
String sql = getUpdateSql02();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.组装修改参数
List batchArgs = getUpdateBatchArgs();
// 4.执行update语句
int[] result = jt.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
// 第一行开始
Object[] args = batchArgs.get(i);
ps.setObject(1, args[0]);
ps.setObject(2, args[1]);
ps.setObject(3, args[2]);
ps.setObject(4, args[3]);
}
@Override
public int getBatchSize() {
return batchArgs.size();
}
});
// 5.打印返回值
List list = Arrays.stream(result).boxed().collect(Collectors.toList());
for (Object var : list) {
System.out.println("返回值: " + var);
}
}
/**
* 1.update修改数据语句,使用batchUpdate函数
* 2.batchUpdate函数入参带修改数据
* 3.使用ParameterizedPreparedStatementSetter对应入参和字段关系
*/
public static void f10_5() {
// 1.获取修改sql
String sql = getUpdateSql02();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.组装修改参数
List batchArgs = getUpdateBatchArgs();
// 4.执行update语句
int[][] result = jt.batchUpdate(sql, batchArgs, batchArgs.size(),
new ParameterizedPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, Object argument) throws SQLException {
Object[] args = (Object[]) argument;
ps.setObject(1, args[0]);
ps.setObject(2, args[1]);
ps.setObject(3, args[2]);
ps.setObject(4, args[3]);
}
});
// 5.打印返回值
for (int[] ints : result) {
for (int anInt : ints) {
System.out.println("返回值: " + anInt);
}
}
}
/**
* 1.update语句,修改数据
* 2.使用update函数入参带修改数据
* 3.使用batchUpdate函数入参带修改数据
*/
public static String getUpdateSql02() {
String sql = "UPDATE t_city\n" +
"SET CITY_DESCRIBE = ?,UPDATE_TIME = ?\n" +
"WHERE CITY_NAME = ? AND ID = ? ";
return sql.toString();
}
/**
* 1.update语句修改数据
* 2.使用batchUpdate函数入参不带修改数据
*/
public static String[] getUpdateSql03() {
String sql01 = "UPDATE t_city\n" +
"SET CITY_DESCRIBE = '杭州是互联网城市01'\n" +
"WHERE CITY_NAME = '杭州' AND ID = '1' ";
String sql02 = "UPDATE t_city\n" +
"SET CITY_DESCRIBE = '杭州是互联网城市02'\n" +
"WHERE CITY_NAME = '杭州' AND ID = '2' ";
return new String[]{sql01, sql02};
}
/**
* 1.执行数据库update语句
* 2.获取批量修改数据
*/
public static List getUpdateBatchArgs() {
Object[] args1 = new Object[]{"杭州是互联网城市01", "2022-07-23 16:39:57", "杭州", "1"};
Object[] args2 = new Object[]{"杭州是互联网城市02", "2022-07-23 16:39:58", "杭州", "2"};
List batchArgs = new ArrayList<>();
batchArgs.add(args1);
batchArgs.add(args2);
return batchArgs;
}
四、删
删,即使用JdbcTemplate对数据库的数据做删除操作。
SQL关键字:delete。
1.update函数
1.1 update函数定义
执行数据数据库delete删除数据,使用update函数实现。
参数sql:数据库执行的SQL语句。
参数pss:对应入参和占位符字段匹配关系。
参数args:是SQL中有占位符?时,传入变量的方式。
参数argTypes:是args传入参数对应的数据库表字段的数据类型。
public int update(final String sql);
public int update(String sql, @Nullable Object... args);
public int update(String sql, @Nullable PreparedStatementSetter pss);
public int update(String sql, Object[] args, int[] argTypes);
1.2 update使用场景
场景:使用update函数,可以执行数据库的delete删除数据。
1.3 update使用举例
/**
* 1.delete删除语句,使用update函数
* 2.update函数入参不带删除数据,数据直接写在delete语句中
*/
public static void f11_1() {
// 1.获取删除sql
String sql = getDeleteSql01();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.执行delete语句
int result = jt.update(sql);
// 4.遍历并打印返回值
System.out.println("返回值: " + result);
}
/**
* 1.delete删除语句,使用update函数
* 2.update函数入参带删除数据
*/
public static void f11_2() {
// 1.获取删除sql
String sql = getDeleteSql02();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.组装删除条件参数
Object[] args = new Object[]{"杭州", "1"};
// 4.执行delete语句
int result = jt.update(sql, args);
// 5.打印返回值
System.out.println("插入返回值: " + result);
}
/**
* 1.delete删除语句,使用update函数
* 2.update函数入参带删除数据
* 3.使用PreparedStatementSetter对应入参和字段关系
*/
public static void f11_3() {
// 1.获取删除sql
String sql = getDeleteSql02();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.组装删除条件参数
Object[] args = new Object[]{"杭州", "1"};
// 4.执行delete语句
int result = jt.update(sql, new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps) throws SQLException {
ps.setObject(1, args[0]);
ps.setObject(2, args[1]);
}
});
// 5.打印返回值
System.out.println("插入返回值: " + result);
}
/**
* 1.delete删除语句,使用update函数
* 2.update函数入参带删除数据,入参带参数类型
*/
public static void f11_4() {
// 1.获取删除sql
String sql = getDeleteSql02();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.组装删除条件参数
Object[] args = new Object[]{"杭州", "1"};
int[] argTypes = new int[]{Types.VARCHAR, Types.BIGINT};
// 4.执行delete语句
int result = jt.update(sql, args, argTypes);
// 5.打印返回值
System.out.println("插入返回值: " + result);
}
/**
* 1.delete语句,删除数据
* 2.使用update函数
*/
public static String getDeleteSql01() {
String sql = "DELETE FROM t_city WHERE CITY_NAME = '杭州' AND ID = '1' ";
return sql.toString();
}
/**
* 1.delete语句,删除数据
* 2.使用update函数
*/
public static String getDeleteSql02() {
String sql = "DELETE FROM t_city WHERE CITY_NAME = ? AND ID = ?";
return sql.toString();
}
2.batchUpdate函数
2.1 batchUpdate函数定义
执行数据数据库delete批量删除数据,使用batchUpdate函数实现。
参数sql:数据库执行的SQL语句。
参数pss:对应入参和占位符字段匹配关系。
参数batchArgs:是SQL中有占位符?时,传入变量的方式。
参数argTypes:是args传入参数对应的数据库表字段的数据类型。
参数batchSize:入参大小,即batchArgs条数。
public int[] batchUpdate(final String... sql);
public int[] batchUpdate(String sql, List batchArgs);
public int[] batchUpdate(String sql, List batchArgs, final int[] argTypes);
public int[] batchUpdate(String sql, final BatchPreparedStatementSetter pss);
public int[][] batchUpdate(String sql, final Collection batchArgs, final int batchSize, final ParameterizedPreparedStatementSetter pss);
2.2 batchUpdate使用场景
场景:使用batchUpdate函数,可以执行数据库的delete批量删除数据。
2.3 batchUpdate使用举例
/**
* 1.delete删除语句,使用batchUpdate函数
* 2.batchUpdate函数入参不带删除数据,数据直接写在delete语句中
*/
public static void f12_1() {
// 1.获取删除sql
String[] sql = getDeleteSql03();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.执行delete语句
int[] result = jt.batchUpdate(sql);
// 4.遍历并打印返回值
List list = Arrays.stream(result).boxed().collect(Collectors.toList());
for (Object var : list) {
System.out.println("返回值: " + var);
}
}
/**
* 1.delete删除语句,使用batchUpdate函数
* 2.batchUpdate函数入参带删除数据
*/
public static void f12_2() {
// 1.获取删除sql
String sql = getDeleteSql02();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.组装删除条件参数
List batchArgs = getDeleteBatchArgs();
// 4.执行delete语句
int[] result = jt.batchUpdate(sql, batchArgs);
// 5.打印返回值
List list = Arrays.stream(result).boxed().collect(Collectors.toList());
for (Object var : list) {
System.out.println("返回值: " + var);
}
}
/**
* 1.delete删除语句,使用batchUpdate函数
* 2.batchUpdate函数入参带删除数据,入参带参数类型
*/
public static void f12_3() {
// 1.获取删除sql
String sql = getDeleteSql02();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.组装删除条件参数
List batchArgs = getDeleteBatchArgs();
int[] argTypes = new int[]{Types.VARCHAR, Types.BIGINT};
// 4.执行delete语句
int[] result = jt.batchUpdate(sql, batchArgs, argTypes);
// 5.打印返回值
List list = Arrays.stream(result).boxed().collect(Collectors.toList());
for (Object var : list) {
System.out.println("返回值: " + var);
}
}
/**
* 1.delete删除语句,使用batchUpdate函数
* 2.batchUpdate函数入参带删除数据
* 3.使用BatchPreparedStatementSetter对应入参和字段关系
*/
public static void f12_4() {
// 1.获取删除sql
String sql = getDeleteSql02();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.组装删除条件参数
List batchArgs = getDeleteBatchArgs();
// 4.执行delete语句
int[] result = jt.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
// 第一行开始
Object[] args = batchArgs.get(i);
ps.setObject(1, args[0]);
ps.setObject(2, args[1]);
}
@Override
public int getBatchSize() {
return batchArgs.size();
}
});
// 5.打印返回值
List list = Arrays.stream(result).boxed().collect(Collectors.toList());
for (Object var : list) {
System.out.println("返回值: " + var);
}
}
/**
* 1.delete删除语句,使用batchUpdate函数
* 2.batchUpdate函数入参带删除数据
* 3.使用ParameterizedPreparedStatementSetter对应入参和字段关系
*/
public static void f12_5() {
// 1.获取删除sql
String sql = getDeleteSql02();
// 2.获取JdbcTemplate
JdbcTemplate jt = getJdbcTemplate();
// 3.组装删除条件参数
List batchArgs = getDeleteBatchArgs();
// 4.执行delete语句
int[][] result = jt.batchUpdate(sql, batchArgs, batchArgs.size(),
new ParameterizedPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, Object argument) throws SQLException {
Object[] args = (Object[]) argument;
ps.setObject(1, args[0]);
ps.setObject(2, args[1]);
}
});
// 5.打印返回值
for (int[] ints : result) {
for (int anInt : ints) {
System.out.println("返回值: " + anInt);
}
}
}
/**
* 1.delete语句,删除数据
* 2.使用update函数
*/
public static String getDeleteSql02() {
String sql = "DELETE FROM t_city WHERE CITY_NAME = ? AND ID = ?";
return sql.toString();
}
/**
* 1.delete语句,删除数据
* 2.使用batchUpdate函数
*/
public static String[] getDeleteSql03() {
String sql01 = "DELETE FROM t_city WHERE CITY_NAME = '杭州' AND ID = '1' ";
String sql02 = "DELETE FROM t_city WHERE CITY_NAME = '杭州' AND ID = '2' ";
return new String[]{sql01, sql02};
}
/**
* 1.delete语句
* 2.获取批量删除参数
*/
public static List getDeleteBatchArgs() {
Object[] args1 = new Object[]{"杭州", "1"};
Object[] args2 = new Object[]{"杭州", "2"};
List batchArgs = new ArrayList<>();
batchArgs.add(args1);
batchArgs.add(args2);
return batchArgs;
}
1. If语句作为表达式
val properties = if (jobIdToActiveJob.contains(jobId)) {
jobIdToActiveJob(stage.jobId).properties
} else {
// this stage will be assigned to "default" po
基础测试题
卷面上不能出现任何的涂写文字,所有的答案要求写在答题纸上,考卷不得带走。
选择题
1、 What will happen when you attempt to compile and run the following code? (3)
public class Static {
static {
int x = 5; // 在static内有效
}
st
表里的一行对于一个数据块太大的情况有二种(一行在一个数据块里放不下)
第一种情况:
INSERT的时候,INSERT时候行的大小就超一个块的大小。Oracle把这行的数据存储在一连串的数据块里(Oracle Stores the data for the row in a chain of data blocks),这种情况称为行链接(Row Chain),一般不可避免(除非使用更大的数据
Follow up for "Remove Duplicates":What if duplicates are allowed at most twice?
For example,Given sorted array nums = [1,1,1,2,2,3],
Your function should return length