(十八)JDBC优化使用(一)
一、将增删改方法合并,优化代码
第十七篇的UserPOImpl.java类代码可以进行优化,因为增删改方法用的都是同一种执行方法executeUpdate(),对十七篇的例子进行优化如下:
2.1 搭建实验环境
A. 启动mysql数据库,即开启mysql/bin/mysqld.exe。
B. 创建数据库,并创建所需的表。如下图(在创建数据库和表的时候请对其编码设置为utf-8编码否则后期容易出错):
2.2 创建一个web工程,并导入数据库驱动包。
2.3 编写javabean,即PO对象又叫持久化对象,此对象的成员属性与数据库的列一一对应,本例中数据库与userName和passWd两列,则PO对象中也应该有这两个成员属性。
UserPO.java
package po; public class UserPO {
private String userName;
private String passWd;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWd() {
return passWd;
}
public void setPassWd(String passWd) {
this.passWd = passWd;
} }
解析: javabean对象中成员属性应该是private的,且必须要有get()和set()方法。
2.4 创建DAO包,专门用于操作数据(即与数据库互动,进行增删改差操作),一般有接口类和实现类。
- UserPOI.java
package dao; import java.util.List; import po.UserPO; public interface UserPOI {
public boolean addUser(UserPO user); //增
public boolean delUser(String userName); //删
public boolean uptUser(UserPO user); //修改
public List<UserPO> gets(); //查
}
- UserPOImpl.java()
package dao; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List; import po.UserPO; public class userPOImpl implements UserPOI { public boolean addUser(UserPO user) { //增加 String sql="insert into user values('"+user.getUserName()+"','"+user.getPassWd()+"') ";
return cud(sql);
} public boolean delUser(String userName) { //删除 String sql="delete from user where userName='"+userName+"'"; return cud(sql);
} public boolean uptUser(UserPO user){ //修改
String sql="update user set passWd='"+user.getPassWd()+"'where userName='"+user.getUserName()+"'";
return cud(sql);
} public List<UserPO> gets() { //查找全部
List<UserPO> list=new ArrayList<UserPO>();
Connection conn=null;
Statement stat=null;
ResultSet res=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8", "root", "");
stat=conn.createStatement();
res=stat.executeQuery("select * from user");
while(res.next()){ //不能是if
UserPO user=new UserPO();
user.setUserName(res.getString("userName"));
user.setPassWd(res.getString("passWd"));
list.add(user); } } catch (Exception e) { e.printStackTrace();
}finally{
try{
if(conn!=null && !conn.isClosed()){
conn.close();
}
if(stat!=null && stat.isClosed()){
stat.close();
}
if(res!=null && res.isClosed()){
res.close();
}
}catch(Exception e){
e.printStackTrace();
} } return list;
} public boolean cud(String sql){ //增删改方法合并
boolean flag=false;
Connection conn=null;
Statement stat=null;
final String URL="jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8";
final String USER="root";
final String PASSWORD=""; try{
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection(URL,USER,PASSWORD);
stat=conn.createStatement(); int res=stat.executeUpdate(sql);
flag=(res>0)?true:false; }catch(Exception e){
e.printStackTrace();
}finally{
try{
if(conn!=null && !conn.isClosed()){
conn.close();
}
if(stat!=null && !stat.isClosed()){
stat.close();
}
}catch(Exception e){
e.printStackTrace();
}
} return flag;
} }
解析: 把增删改方法合并为cud方法,使代码更简便。
2.5 创建测试类进行测试。
- UserTest.java
package test; import java.util.List; import org.junit.Test; import dao.userPOImpl;
import po.UserPO; public class UserTest {
@Test
public void UserPOTest(){
userPOImpl im=new userPOImpl(); UserPO user=new UserPO();
user.setUserName("张三");
user.setPassWd("123");
im.addUser(user);
} @Test
public void userPOget(){
userPOImpl im=new userPOImpl();
List<UserPO> list=im.gets();
for(int i=0;i<list.size();i++)
System.out.println(list.get(i).getUserName()); } @Test
public void delUserTest(){
userPOImpl im=new userPOImpl();
im.delUser("张三");
}
@Test
public void uptUserTest(){
userPOImpl im=new userPOImpl();
UserPO user=new UserPO();
user.setUserName("张三");
user.setPassWd("456");
im.uptUser(user);
}
}
二、使用预处理prepareStatement语句优化
2.1 编写javabean
UserPO.java
package po; public class UserPO {
private String userName;
private String passWd;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWd() {
return passWd;
}
public void setPassWd(String passWd) {
this.passWd = passWd;
} }
2.2 创建DAO包,专门用于操作数据(即与数据库互动,进行增删改差操作),一般有接口类和实现类。
- UserPOI.java
1 package dao;
2
3 import java.util.List;
4
5 import po.UserPO;
6
7 public interface UserPOI {
8 public boolean addUser(UserPO user); //增
9 public boolean delUser(String userName); //删
10 public boolean uptUser(UserPO user); //修改
11 public List<UserPO> gets(); //查
12 }
- 一般我们专门编写一个DBUtil工具类,以实现数据库的各种操作方法:
DButils.java
package dao; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.List; public class DButils {
public static boolean cud(String sql,List<Object> list){ //增删改方法合并
boolean flag=false;
Connection conn=null;
PreparedStatement stat=null;
final String URL="jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8";
final String USER="root";
final String PASSWORD=""; try{
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection(URL,USER,PASSWORD);
stat=conn.prepareStatement(sql); //对sql语句进行预处理 if(list!=null){
for(int i=0;i<list.size();i++){ //对list中存放的?里的值循环,并对sql中的?赋值
stat.setObject(i+1, list.get(i));
}
} int res=stat.executeUpdate(); //执行预处理语句指令
flag=(res>0)?true:false; }catch(Exception e){
e.printStackTrace();
}finally{
try{
if(conn!=null && !conn.isClosed()){
conn.close();
}
if(stat!=null && !stat.isClosed()){
stat.close();
}
}catch(Exception e){
e.printStackTrace();
}
} return flag;
}
}
- 编写实现类(UserPOImpl.java)
package dao; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List; import po.UserPO; public class userPOImpl implements UserPOI { public boolean addUser(UserPO user) { //增加 String sql="insert into user values(?,?)";
18 List<Object> list=new ArrayList<Object>();
19 list.add(user.getUserName());
20 list.add(user.getPassWd());
21 return DButils.cud(sql,list);
} public boolean delUser(String userName) { //删除 String sql="delete from user where userName=?";
27 List<Object> list=new ArrayList<Object>();
28 list.add(userName);
29 return DButils.cud(sql,list);
} public boolean uptUser(UserPO user){ //修改
String sql="update user set passWd=? where userName=?";
35 List<Object> list=new ArrayList<Object>();
36 list.add(user.getPassWd());
37 list.add(user.getUserName());
38 return DButils.cud(sql,list); } public List<UserPO> gets() { //查找全部
List<UserPO> list=new ArrayList<UserPO>();
Connection conn=null;
Statement stat=null;
ResultSet res=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8", "root", "");
stat=conn.createStatement();
res=stat.executeQuery("select * from user");
while(res.next()){ //不能是if
UserPO user=new UserPO();
user.setUserName(res.getString("userName"));
user.setPassWd(res.getString("passWd"));
list.add(user); } } catch (Exception e) { e.printStackTrace();
}finally{
try{
if(conn!=null && !conn.isClosed()){
conn.close();
}
if(stat!=null && stat.isClosed()){
stat.close();
}
if(res!=null && res.isClosed()){
res.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
return list;
}
}
2.3 创建测试类进行测试。
- UserTest.java
1 package test;
2
3 import java.util.List;
4
5 import org.junit.Test;
6
7 import dao.userPOImpl;
8 import po.UserPO;
9
10 public class UserTest {
11 @Test
12 public void UserPOTest(){
13 userPOImpl im=new userPOImpl();
14
15 UserPO user=new UserPO();
16 user.setUserName("张三");
17 user.setPassWd("123");
18 im.addUser(user);
19 }
20
21 @Test
22 public void userPOget(){
23 userPOImpl im=new userPOImpl();
24 List<UserPO> list=im.gets();
25 for(int i=0;i<list.size();i++)
26 System.out.println(list.get(i).getUserName());
27
28 }
29
30 @Test
31 public void delUserTest(){
32 userPOImpl im=new userPOImpl();
33 im.delUser("张三");
34 }
35 @Test
36 public void uptUserTest(){
37 userPOImpl im=new userPOImpl();
38 UserPO user=new UserPO();
39 user.setUserName("张三");
40 user.setPassWd("456");
41 im.uptUser(user);
42 }
43 }
- 本例中的DBUtils代码可以优化为:
package dao; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.List; public class DButils { /**
* 单例模式
*
*/
public static Connection conn=null;
static{
/*
* 把常量和公用的放在static块里加载
* */
final String URL="jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8";
final String USER="root";
final String PASSWORD=""; try{
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection(URL,USER,PASSWORD);
}catch(Exception e){
e.printStackTrace();
} } public static boolean cud(String sql,List<Object> list){ //增删改方法合并
boolean flag=false;
PreparedStatement stat=null;
try{
stat=conn.prepareStatement(sql); //对sql语句进行预处理 if(list!=null){
for(int i=0;i<list.size();i++){ //对list中存放的?里的值循环,并对sql中的?赋值
stat.setObject(i+1, list.get(i));
}
} int res=stat.executeUpdate(); //执行预处理语句指令
flag=(res>0)?true:false; }catch(Exception e){
e.printStackTrace();
}finally{
close(conn, stat, null);
} return flag;
} /**
* 关闭流
* @param conn 数据库连接
* @param stat 预处理指令
* @param res 返回结果集
*/
public static void close(Connection conn,PreparedStatement stat,ResultSet res){
try{
if(conn!=null && !conn.isClosed()){
conn.close();
if(stat!=null && !stat.isClosed()){
stat.close();
}
if(res!=null && !res.isClosed()){
res.close();
}
}
}catch(Exception e){
e.printStackTrace();
} } }
三、使用连接池优化jdbc
- 上个例子的DBUtils可以优化为:
package dao; import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.List; import com.mchange.v2.c3p0.ComboPooledDataSource; public class DButils { /**
* 连接池
*/
static ComboPooledDataSource dateSource;
static{
dateSource=new ComboPooledDataSource();
final String URL="jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8";
final String USER="root";
final String PASSWORD="";
final String DRIVER="com.mysql.jdbc.Driver";
try {
dateSource.setDriverClass(DRIVER);
dateSource.setJdbcUrl(URL);
dateSource.setUser(USER);
dateSource.setPassword(PASSWORD);
dateSource.setMaxPoolSize(100);
dateSource.setMinPoolSize(10);
dateSource.setMaxStatements(10000);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
} /**
* 单例模式
*/
// public static Connection conn=null;
// static{
// /*
// * 把常量和公用的放在static块里加载
// * */
// final String URL="jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8";
// final String USER="root";
// final String PASSWORD="";
//
// try{
// Class.forName("com.mysql.jdbc.Driver");
// conn=DriverManager.getConnection(URL,USER,PASSWORD);
// }catch(Exception e){
// e.printStackTrace();
// }
//
// } public static boolean cud(String sql,List<Object> list){ //增删改方法合并
boolean flag=false;
PreparedStatement stat=null;
Connection conn=null;
try{
conn=dateSource.getConnection();
stat=conn.prepareStatement(sql); //对sql语句进行预处理 if(list!=null){
for(int i=0;i<list.size();i++){ //对list中存放的?里的值循环,并对sql中的?赋值
stat.setObject(i+1, list.get(i));
}
} int res=stat.executeUpdate(); //执行预处理语句指令
flag=(res>0)?true:false; }catch(Exception e){
e.printStackTrace();
}finally{
close(conn, stat, null);
} return flag;
} /**
* 关闭流
* @param conn 数据库连接
* @param stat 预处理指令
* @param res 返回结果集
*/
public static void close(Connection conn,PreparedStatement stat,ResultSet res){
try{
if(conn!=null && !conn.isClosed()){
conn.close();
if(stat!=null && !stat.isClosed()){
stat.close();
}
if(res!=null && !res.isClosed()){
res.close();
}
}
}catch(Exception e){
e.printStackTrace();
} } }
- 使用C3P0连接池需要导入相应的jar包。
四、优化总结
4.1 搭建实验环境
A. 启动mysql数据库,即开启mysql/bin/mysqld.exe。
B. 创建数据库,并创建所需的表。如下图(在创建数据库和表的时候请对其编码设置为utf-8编码否则后期容易出错):
4.2 创建一个web工程,并导入数据库驱动包。
4.3 编写javabean,即PO对象又叫持久化对象,此对象的成员属性与数据库的列一一对应,本例中数据库与userName和passWd两列,则PO对象中也应该有这两个成员属性。
UserPO.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package po; public class UserPO { private String userName; private String passWd; public String getUserName() { return userName; } public void setUserName(String userName) { this .userName = userName; } public String getPassWd() { return passWd; } public void setPassWd(String passWd) { this .passWd = passWd; } } |
解析: javabean对象中成员属性应该是private的,且必须要有get()和set()方法。
4.4 创建DAO包,专门用于操作数据(即与数据库互动,进行增删改差操作),一般有接口类和实现类和工具类。
- UserPOI.java
package dao; import java.util.List; import po.UserPO; public interface UserPOI {
public boolean addUser(UserPO user); //增
public boolean delUser(String userName); //删
public boolean uptUser(UserPO user); //修改
public List<UserPO> gets(); //查全部
public UserPO getByName(String userName); //按名字查人
}
- UserPOImpl.java()
package dao; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List; import po.UserPO; public class userPOImpl implements UserPOI { public boolean addUser(UserPO user) { //增加 String sql="insert into user values(?,?)";
List<Object> list=new ArrayList<Object>();
list.add(user.getUserName());
list.add(user.getPassWd());
return DButils.cud(sql,list);
} public boolean delUser(String userName) { //删除 String sql="delete from user where userName=?";
List<Object> list=new ArrayList<Object>();
list.add(userName);
return DButils.cud(sql,list);
} public boolean uptUser(UserPO user){ //修改
String sql="update user set passWd=? where userName=?";
List<Object> list=new ArrayList<Object>();
list.add(user.getPassWd());
list.add(user.getUserName());
return DButils.cud(sql,list); } public List<UserPO> gets() { //查找全部 String sql="select * from user";
return DButils.get(sql, null);
} public UserPO getByName(String userName){ //按名字找人
String sql="select * from user where userName=?";
List<Object> list=new ArrayList<Object>();
list.add(userName);
return (DButils.get(sql, list).size()==1)?DButils.get(sql, list).get(0):null; }
}
DButils.java
package dao; import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List; import com.mchange.v2.c3p0.ComboPooledDataSource; import po.UserPO; public class DButils { /**
* 连接池
*/
static ComboPooledDataSource dateSource;
static{
dateSource=new ComboPooledDataSource();
final String URL="jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8";
final String USER="root";
final String PASSWORD="";
final String DRIVER="com.mysql.jdbc.Driver";
try {
dateSource.setDriverClass(DRIVER);
dateSource.setJdbcUrl(URL);
dateSource.setUser(USER);
dateSource.setPassword(PASSWORD);
dateSource.setMaxPoolSize(100);
dateSource.setMinPoolSize(10);
dateSource.setMaxStatements(10000);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
} /**
* 单例模式
*/
// public static Connection conn=null;
// static{
// /*
// * 把常量和公用的放在static块里加载
// * */
// final String URL="jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8";
// final String USER="root";
// final String PASSWORD="";
//
// try{
// Class.forName("com.mysql.jdbc.Driver");
// conn=DriverManager.getConnection(URL,USER,PASSWORD);
// }catch(Exception e){
// e.printStackTrace();
// }
//
// } public static boolean cud(String sql,List<Object> list){ //增删改方法合并
boolean flag=false;
PreparedStatement stat=null;
Connection conn=null;
try{
conn=dateSource.getConnection();
stat=conn.prepareStatement(sql); //对sql语句进行预处理 if(list!=null){
for(int i=0;i<list.size();i++){ //对list中存放的?里的值循环,并对sql中的?赋值
stat.setObject(i+1, list.get(i));
}
} int res=stat.executeUpdate(); //执行预处理语句指令
flag=(res>0)?true:false; }catch(Exception e){
e.printStackTrace();
}finally{
close(conn, stat, null);
} return flag;
} /**
* 关闭流
* @param conn 数据库连接
* @param stat 预处理指令
* @param res 返回结果集
*/
public static void close(Connection conn,PreparedStatement stat,ResultSet res){
try{
if(conn!=null ){
conn.close();
if(stat!=null ){
stat.close();
}
if(res!=null ){
res.close();
}
}
}catch(Exception e){
e.printStackTrace();
} } /**
* 获取连接池中的连接
*/
public static Connection getConn(){
try {
return dateSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
} /**
* 数据库查找
* @param sql
* @param list
* @return
*/
public static List<UserPO> get(String sql,List<Object> list){
List<UserPO> users=new ArrayList<UserPO>(); Connection conn=getConn();
PreparedStatement stat=null;
ResultSet res=null;
try {
stat=conn.prepareStatement(sql); //sql语句预处理 if(list!=null){
for(int i=0;i<list.size();i++){
stat.setObject(i+1, list.get(i)); //预处理语句?赋值
}
} res=stat.executeQuery(); //执行sql语句
UserPO user=null;
while(res.next()){
user=new UserPO();
user.setUserName(res.getString("userName"));
user.setPassWd(res.getString("passWd"));
users.add(user);
} } catch (SQLException e) {
e.printStackTrace();
}finally{
close(conn,stat,res);
}
return users;
}
}
2.5 创建测试类进行测试。
- UserTest.java


1 package test;
2
3 import java.util.List;
4
5 import org.junit.Test;
6
7 import dao.userPOImpl;
8 import po.UserPO;
9
10 public class UserTest {
11 @Test
12 public void UserPOTest(){
13 userPOImpl im=new userPOImpl();
14
15 UserPO user=new UserPO();
16 user.setUserName("张三");
17 user.setPassWd("123");
18 im.addUser(user);
19 }
20
21 @Test
22 public void userPOget(){
23 userPOImpl im=new userPOImpl();
24 List<UserPO> list=im.gets();
25 for(int i=0;i<list.size();i++)
26 System.out.println(list.get(i).getUserName());
27
28 }
29
30 @Test
31 public void delUserTest(){
32 userPOImpl im=new userPOImpl();
33 im.delUser("张三");
34 }
35 @Test
36 public void uptUserTest(){
37 userPOImpl im=new userPOImpl();
38 UserPO user=new UserPO();
39 user.setUserName("张三");
40 user.setPassWd("456");
41 im.uptUser(user);
42 }
43 }

(十八)JDBC优化使用(一)的更多相关文章
- 燕十八MySQL优化学习笔记
观察 show status; 里面的这三个参数;Queries Threads_connected Threads_running判断周期性变化 -------------------------- ...
- (转载)Android项目实战(二十八):Zxing二维码实现及优化
Android项目实战(二十八):Zxing二维码实现及优化 前言: 多年之前接触过zxing实现二维码,没想到今日项目中再此使用竟然使用的还是zxing,百度之,竟是如此牛的玩意. 当然,项目中 ...
- (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例
Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...
- 我的MYSQL学习心得(十六) 优化
我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- 最全的MySQL基础【燕十八传世】
1.课前准备! 开启mysql服务:1).配置环境变量;2).net start mysql 将该sql文件导入到你的数据库中,以下所有操作都是基于该数据库表操作的!!! [此笔记是本人看着视频加上自 ...
- NeHe OpenGL教程 第四十八课:轨迹球
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Python之路【第十八篇】:Web框架们
Python之路[第十八篇]:Web框架们 Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Pytho ...
- NeHe OpenGL教程 第二十八课:贝塞尔曲面
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- COS访谈第十八期:陈天奇
COS访谈第十八期:陈天奇 [COS编辑部按] 受访者:陈天奇 采访者:何通 编辑:王小宁 简介:陈天奇,华盛顿大学计算机系博士生,研究方向为大规模机器学习.他曾获得KDD CUP 20 ...
- Java进阶(三十八)快速排序
Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...
随机推荐
- rsync详细解读
本文通过示例详细分析rsync算法原理和rsync的工作流程,是对rsync官方技术报告和官方推荐文章的解释.本文不会介绍如何使用rsync命令(见rsync基本用法),而是详细解释它如何实现高效的增 ...
- C#获取资源文件
System.Resources.ResourceManager rs = new System.Resources.ResourceManager("NetWebBrowser.Resou ...
- Mac OS终端利器iTerm2(完美替代bash)
iTerm2 iTerm一个为Mac OS X编写的,功能齐全的终端仿真程序:目标是在为用户提供OS X下最佳的命令行体验,iTerm 2有很多能够提升效率的实用功能.比如说窗口分割.热键窗口.智能搜 ...
- DOM属性获取、设置、删除
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [NgRx] NgRx Runtime Checks
Turn on runtime check: @NgModule({ declarations: [AppComponent], imports: [ ..., StoreModule.forRoot ...
- JSP中9大内置对象类型
JSP中九大内置对象为: request 请求对象 类型 javax.servlet.ServletRequest 作用域 Requ ...
- eslint 对下一行不要校验报错
eslint 对下一行不要校验报错: <--eslint-disable-next-line--> <div>todo</div> 扩展知识: stylelint ...
- log4j2配置文件log4j2.xml详解
配置全解 1.缺省默认配置文件 <?xml version="1.0" encoding="UTF-8"?> <Configuration s ...
- Laravel 6.0 Schedule Preventing Task Overlaps 测试
1 目的 1.1 测试 Laravel 6.0 任务执行机制 2 意义 2.1 在日常开发中,有的任务比较复杂,在两次任务的调度周期间隔中无法完成. 2.2 为了防止重复任务的持续生成和反复调用,对服 ...
- mongodb 导入json文件遇到的坑
使用mongoimport命令导入外部json文件时,发现一直报错 报错结果如下: json数据格式完全正确如下: 经过再三确认格式最终找到解决方案,原来用cmd导入数据时json { }包含的数据 ...