JDBC01 利用JDBC连接数据库【不使用数据库连接池】
目录:
1 什么是JDBC
2 JDBC主要接口
3 JDBC编程步骤【学渣版本】
5 JDBC编程步骤【学神版本】
6 JDBC编程步骤【学霸版本】
1 什么是JDBC
JDBC是JAVA提供的一套标准连接数据库的接口,规定了连接数据库的步骤和功能;不同的数据库提供商提供了一套JDBC实现类,他们称为数据库驱动。
2 JDBC的主要接口
Connection 与数据库连接有关
DriverManager 与创建数据库连接对象有关
Statement 与执行SQL语句有关
ResultSet 与返回的结果及有关
注意:通过JDBC操作数据库是自动提交的,当然也可是设置成手动提交
3 利用JDBC操作数据库的步骤【学渣版本】
3.1 导入数据库驱动
Class.forName(“数据库驱动包”);
注意:Class.forName的底层实际上是利用的java反射机制
例如:Class.forName("com.mysql.jdbc.Driver"); //mysql驱动包的固定写法
3.2 创建连接
Connection conn = DriverManager.getConnection(“jdbc:mysql:// + IP + : + 端口 + / + 数据库名称”,“数据库用户名”,“密码”);
注意:DriverManager是一个驱动管理类,通过调用该类的静态方法DriverManager来创建连接对象
例如: Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", // jdbc:mysql:// + IP + : + 端口 + / + 数据库名称
"root", // 用户名
"182838"); // 用户密码
3.3 创建语句对象
Statement state = conn.createStatement();
注意:利用连接对象来创建语句对象
3.4 执行SQL语句
ResultSet executeQuery(String sql)
用来执行查询语句(DQL)的方法,返回的是一个查询结果集
Integer executUpdate(String sql)
用来执行DML语句的方法,返回值为执行了该DML后影响了数据库中多少条数据
boolean execute(String sql)
可以执行所有类型的SQL语句,但是DQL,DML都有专门的方法,所以该方法通常
用来执行DDL语句.当返回值为true时表示该SQL语句执行后有结果集,没有结果集
的都是返回的false.(并不是根据语句的对错来返回true或者false)
注意:利用语句对象来执行SQL语句,DQL指查询,DML指修改、删除、插入,DDL指新建
注意:如果是查询语句会得到一个结果集,结果集类型是ResultSet,可对结果集进行遍历

3.5 遍历结果集

3.6 关闭语句对象、关闭连接对象
执行对象.close();
连接对象.close();
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.xiangxu</groupId>
<artifactId>testJDBC</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
maven依赖包
CREATE TABLE user (
id INT (10) PRIMARY KEY,
name VARCHAR (10),
pwd VARCHAR (10)
); DESC USER; DROP TABLE user; SELECT * FROM user;
SQL语句
package testJDBC; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import org.junit.Test; public class TestCase {
@Test
public void test01() {
Connection conn = null;
try {
// 01 导入驱动模块
Class.forName("com.mysql.jdbc.Driver"); // 02 初始化连接对象(以为在之前就创建了,进行初始化就行啦)
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "182838"); // 03 创建执行对象
Statement state = conn.createStatement(); String sql = "SELECT * FROM user "; // 04 执行SQL语句
ResultSet rs = state.executeQuery(sql); // 查询结果的类型为ResultSet // 05 遍历查询结果
while(rs.next()) { // 遍历结果集
System.out.println(rs.getString("name"));
} // 06 关闭执行对象、连接对象
state.close();
conn.close(); } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(null != conn) { // 判断连接是否关闭
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }
}
java代码
4 存在的问题
4.1 重复编译问题
利用 Statement对象执行SQL语句时每执行一条SQL语句在数据库端就会进行一次变异,如果是类似的SQL语句也是这样;严重加大了数据库的负担
改进:利用预编译的Statement
注意:预编译statement向数据库中发送一个sql语句,数据库编译sql语句,并把编译的结果保存在数据库砖的缓存中。下次再发sql时,如果sql相同,则不会再编译,直接使用缓存中的。
4.2 释放资源问题
程序执行后应该对 结果集、执行对象、连接对象进行释放,而且在finally那里还需要判断是否成功释放(注意:try里面定义的变量在finally是获取不到的)
改进:在程序的最前面定义 连接对象、执行对象、结果集对象;在程序结束后调用各自的close方法来释放资源,在finally中判断这三个对象是否成功关闭
5 jdbc编程步骤【学神版本】
加载数据库驱动
创建并获取数据库链接
创建jdbc statement对象
设置sql语句
设置sql语句中的参数(使用preparedStatement)
通过statement执行sql并获取结果
对sql执行结果进行解析处理
释放资源(resultSet、preparedstatement、connection)
package testJDBC; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import org.junit.Test; public class TestCase {
@Test
public void test01() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver"); // 加载数据库驱动 conn = DriverManager.getConnection( // 初始化连接对象
"jdbc:mysql://localhost:3306/test", "root", "182838"); String sql = "SELECT * FROM user WHERE pwd = ? "; // 拼接SQL语句,位置参数用?代替 ps = conn.prepareStatement(sql); // 初始化预编译执行对象 ps.setString(1, "182838"); // 设置SQL语句中的位置位置参数(注意:是从1开始数不是从0开始数) rs = ps.executeQuery(); // 执行SQL语句 while(rs.next()) { // 遍历结果集
System.out.println("====================");
System.out.println(rs.getInt("id"));
System.out.println(rs.getString("name"));
System.out.println(rs.getString("pwd"));
} // 释放资源
rs.close();
ps.close();
conn.close(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(ps != null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }
}
优化后的java代码
6 可优化的地方【学霸版本】
没有将查询到的结果封装换成一个对象
package cn.xiangxu.entity;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = -5109978284633713580L;
private Integer id;
private String name;
private String pwd;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(Integer id, String name, String pwd) {
super();
this.id = id;
this.name = name;
this.pwd = pwd;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", pwd=" + pwd + "]";
}
}
user表对应的实体类
package testJDBC; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import org.junit.Test; import cn.xiangxu.entity.User; public class TestCase {
@Test
public void test01() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver"); // 加载数据库驱动 conn = DriverManager.getConnection( // 初始化连接对象
"jdbc:mysql://localhost:3306/test", "root", "182838"); String sql = "SELECT * FROM user WHERE pwd = ? "; // 拼接SQL语句,位置参数用?代替 ps = conn.prepareStatement(sql); // 初始化预编译执行对象 ps.setString(1, "182838"); // 设置SQL语句中的位置位置参数(注意:是从1开始数不是从0开始数) rs = ps.executeQuery(); // 执行SQL语句 List<User> users = new ArrayList<User>(); // 创建一个集合来存放记录对象
while(rs.next()) { // 遍历结果集
// System.out.println("====================");
// System.out.println(rs.getInt("id"));
// System.out.println(rs.getString("name"));
// System.out.println(rs.getString("pwd"));
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setPwd(rs.getString("pwd"));
users.add(user); // 向集合中添加元素
} System.out.println(users); // 打印输出集合
for(User user : users) {
System.out.println(user);
} // 释放资源
rs.close();
ps.close();
conn.close(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(ps != null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }
}
对查询结果进行封装了的java代码
7 小案例
用户登录、转账系统
package day01; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner; /**
* 用户登录系统
* Description:
*/
public class Service {
private static final int USER_REG = 1;
private static final int USER_LOGIN = USER_REG + 1;
private static final int USER_UPDATE = USER_LOGIN + 1;
private static final int USER_DELETE = USER_UPDATE + 1;
private static final int USER_INFO = USER_DELETE + 1;
private static final int USER_TRANSFER = USER_INFO + 1;
private static final int USER_QUIT = USER_TRANSFER + 1;
private static final int EXIT = USER_QUIT + 1; UserInfo user = null; public static void main(String[] args) {
Service serv = new Service();
serv.start();
} private void start() {
welcome();
int code = getCode();
execute(code);
} /**
* 执行选择
* Description:
*/
private void execute(int code) {
switch (code) {
case USER_REG:
user_reg();
break;
case USER_LOGIN:
user_login();
break;
case USER_UPDATE:
user_update();
break;
case USER_DELETE:
user_delete();
break;
case USER_INFO:
user_info();
break;
case USER_TRANSFER:
user_transfer();
break;
case USER_QUIT:
user_quit();
break;
case EXIT:
exit();
break;
default:
System.out.println("输入错误,请重新输入");
start();
break;
}
} /**
* Description:
*/
private void exit() {
// TODO Auto-generated method stub
if(null != this.user) {
System.out.println("当前用户还没有退出,所以执行自动退出当前用户");
user_quit();
}else {
System.out.println("你选择了退出系统");
System.out.println("系统退出成功");
} } /**
* 退出当前用户
* Description:
*/
private void user_quit() {
// TODO Auto-generated method stub
if(null != this.user) {
System.out.println("你选择了退出当前用户功能");
this.user = null;
if(null == this.user) {
System.out.println("成功退出当前用户");
}else {
System.out.println("退出当前用户失败");
}
}else {
System.out.println("你还没有登录成功,还不能使用该功能");
System.out.println("请登录!");
user_login();
}
start();
} /**
* 转账功能
* Description:
*/
private void user_transfer() {
// TODO Auto-generated method stub
if(null != this.user) {
System.out.println("你选择了转账功能!");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入转入账户的用户名:");
String name = scanner.nextLine();
System.out.println("请输入转账金额:");
int money = Integer.parseInt(scanner.nextLine()); Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test",
"root",
"182838");
Statement state = conn.createStatement(); //转出
String out_sql = "UPDATE userinfo_fury "
+ "SET account = account - '"+money+"' "
+ "WHERE username = '"+this.user.getUsername()+"' ";
int judge01 = state.executeUpdate(out_sql);
if(judge01 > 0) {
System.out.println("转出成功");
}else {
System.out.println("转出失败");
} //转入
String in_sql = "UPDATE userinfo_fury "
+ "SET account = account + '"+money+"' "
+ "WHERE username = '"+name+"' ";
int judge02 = state.executeUpdate(in_sql);
if(judge02 > 0) {
System.out.println("转入成功");
}else {
System.out.println("转入失败");
}
}catch(Exception e) {
e.printStackTrace();
}finally {
if(null != conn) {
try {
conn.close();
}catch(SQLException e1) {
e1.printStackTrace();
}
}
}
}else {
System.out.println("请先登录!");
user_login();
}
start();
} /**
* 查询表中的所有数据
* Description:
*/
private void user_info() {
// TODO Auto-generated method stub
if(null != this.user) {
System.out.println("你选择了查询所有用户功能!");
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test",
"root",
"182838");
Statement state = conn.createStatement();
String sql = "SELECT id,username,password,email,nickname,account "
+ "FROM userinfo_fury ";
ResultSet rs = state.executeQuery(sql);
List<UserInfo> list = new ArrayList<UserInfo>(); while(rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String email = rs.getString("email");
String nickname = rs.getString("nickname");
double account = rs.getDouble("account");
UserInfo userinfo = new UserInfo(id, username, password, email, nickname, account);
list.add(userinfo);
}
for(UserInfo lis : list) {
System.out.println(lis);
}
}catch(Exception e) {
e.printStackTrace();
}finally {
if(null != conn) {
try {
conn.close();
}catch(SQLException e1) {
e1.printStackTrace();
}
}
}
}else {
System.out.println("请先登录");
user_login();
}
start();
} /**
* 删除用户
* Description:
*/
private void user_delete() {
// TODO Auto-generated method stub
if(null != this.user) {
System.out.println("你选择了删除用户功能");
System.out.println("你不是超级用户,你无法使用删除用户功能");
}else {
System.out.println("请先登录!");
user_login();
}
start();
} /**
* 修改用户信息
* Description:
*/
private void user_update() {
// TODO Auto-generated method stub
if(null != this.user) {
System.out.println("你选择了修改当前用户功能!");
//可改进 -->> 可由用户选择需要修改的字段
System.out.println("你当前的昵称为:" + this.user.getNickname());
Scanner scanner = new Scanner(System.in);
System.out.println("你想将你的昵称修改为:");
String nickname = scanner.nextLine(); Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test",
"root",
"182838");
Statement state = conn.createStatement(); String sql = "UPDATE userinfo_fury "
+ "SET nickname = '"+nickname+"' "
+ "WHERE username = '"+this.user.getUsername()+"' ";
int judge = state.executeUpdate(sql);
if(judge > 0) {
this.user.setNickname(nickname);
System.out.println("修改昵称成功,当前昵称为:" + this.user.getNickname());
}else {
System.out.println("修改昵称失败");
}
}catch(Exception e) {
e.printStackTrace();
}finally {
if(null != conn) {
try {
conn.close();
}catch(SQLException e1) {
e1.printStackTrace();
}
}
}
}else {
System.out.println("请登录成功后在进行此操作!");
user_login();
}
start();
} /**
* 用户登录
* Description:
*/
private void user_login() {
// TODO Auto-generated method stub
System.out.println("你选择了用户登录功能!");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = scanner.nextLine();
System.out.println("请输入密码:");
String password = scanner.nextLine(); Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test",
"root",
"182838");
Statement state = conn.createStatement(); String sql = "SELECT id, username, password,email, nickname,account "
+ "FROM userinfo_fury "
+ "WHERE username = '"+username+"' "
+ "AND password = '"+password+"' ";
System.out.println(sql);
ResultSet rs = state.executeQuery(sql);
if(rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("username");
String word = rs.getString("password");
String email = rs.getString("email");
String nickname = rs.getString("nickname");
double account = rs.getDouble("account");
UserInfo userinfo = new UserInfo(id, name, word, email, nickname, account);
this.user = userinfo;
System.out.println("登录成功,你的昵称为:" + this.user.getNickname());
}else {
System.out.println("登录失败:" + this.user);
}
/*
* 注意:
* 当用户输入的密码个的格式是: 任意字符' or '数值开头 时无论用户名和密码正确与否,都会登录成功
* 因为 如果这样输入就改变了 SQL 语句的原意(在SQL语句中AND的优先级要高于OR)
* 实例 : asdfaer1234' or '1
*/
}catch(Exception e) {
e.printStackTrace();
}finally {
if(null != conn) {
try {
conn.close();
}catch(SQLException e1) {
e1.printStackTrace();
}
}
}
start();
} /**
* 用户注册
* Description:
*/
private void user_reg() {
System.out.println("你选择了用户注册功能!");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = scanner.nextLine();
System.out.println("请输入密码:");
String password = scanner.nextLine();
System.out.println("请输入邮箱:");
String email = scanner.nextLine();
System.out.println("请输入昵称:");
String nickname = scanner.nextLine();
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test",
"root",
"182838");
Statement state = conn.createStatement();
String sql = "INSERT INTO userinfo_fury "
+ "(username,password,email,nickname) "
+ "VALUES "
+ "('"+username+"','"+password+"','"+email+"','"+nickname+"')";
int judge = state.executeUpdate(sql);
if(judge > 0) {
System.out.println("注册成功");
}else {
System.out.println("注册失败");
}
}catch(Exception e) {
e.printStackTrace();
}finally {
if(null != conn) {
try {
conn.close();
}catch(SQLException e1) {
e1.printStackTrace();
}
}
}
start();
} /**
* 功能选择
* Description:
*/
private int getCode() {
System.out.println("请选择功能:");
Scanner scanner = new Scanner(System.in);
int code = Integer.parseInt(scanner.nextLine());
return code;
} /**
* 界面信息
* Description:
*/
private void welcome() {
System.out.println("欢迎使用用户登录系统!");
System.out.println("请输入需要操作的功能序号");
System.out.println("======================");
System.out.println("================");
System.out.println("1 : 用户注册");
System.out.println("2 : 用户登录");
System.out.println("3 : 修改用户信息");
System.out.println("4 : 删除用户");
System.out.println("5 : 查看所有用户信息");
System.out.println("6 : 转账业务");
System.out.println("7 : 用户退出");
System.out.println("8 : 退出系统");
System.out.println("================");
System.out.println("======================");
}
}
JDBC01 利用JDBC连接数据库【不使用数据库连接池】的更多相关文章
- JDBC02 利用JDBC连接数据库【使用数据库连接池】
目录 1/2/3 Statement 和 Preparedstatement 的区别 4 读取properties配置文件 5 数据库连接池 6 利用数据库连接池连接数据库 1 使用Statemen ...
- 利用JDBC连接数据库(MySQL)
1 在eclipse中创建一个maven项目(在Java模式下,不要在JavaEE模式下) 1.1 file -->> new -->> project 2 下载数据库驱动 ...
- JDBC(11)—数据库连接池
在实际开发过程中,特别是在web应用系统中,如果程序直接访问数据库中的数据,每一次数据访问请求丢必须经历建立数据库连接.打开数据库.存取数据和关闭数据库连接.而连接并打开数据库是一件既消费资源又费时的 ...
- JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)
JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/beans)中建立数据库连接 2)进行sql操作 3)断开数据库连接 ...
- JDBC基础学习(六)—数据库连接池
一.数据库连接池介绍 1.数据库连接池的缘由 对于一个简单的数据库应用,由于对于数据库的访问不是很频繁.这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什 ...
- 【转】JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)
转自:http://www.cnblogs.com/ysw-go/ JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/ ...
- JDBC(三)数据库连接池(DBCP、C3P0)
前言 这段时间状态有一点浮躁,希望自己静下心来.还有特别多的东西还没有学懂.需要学习的东西非常的多,加油! 一.JDBC复习 Java Data Base Connectivity,java数据库连接 ...
- JDBC(四)----数据库连接池
## 数据库连接池 * 概念:其实就是一个容器(集合) * 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后会将连接对象归还给容 ...
- java基础之JDBC六:DBCP 数据库连接池简介
我们之前写的代码中的数据库连接每次都是自己创建,用完以后自己close()销毁的,这样是很耗费资源的,所以我们引入DBCP DBCP简介 概述: Data Base Connection Pool, ...
随机推荐
- http协议中:GET/POST/PUT/DELETE/TRACE/OPTIONS/HEAD方法
###1 HTTP/1.1协议中共定义了八种方法(有时也叫"动作")来表明Request-URI指定的资源的不同操作方式: OPTIONS 返回服务器针对特定资源所支持的HTTP请 ...
- Vue常用经典开源项目汇总参考-海量
Vue常用经典开源项目汇总参考-海量 Vue是什么? Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的 ...
- js与jQuery对象相互转换
// jQuery-->JavaScript 两种方法: $(selector).get(index) ; $(selector)[index]; // JavaScript-->jQue ...
- 学习笔记TF020:序列标注、手写小写字母OCR数据集、双向RNN
序列标注(sequence labelling),输入序列每一帧预测一个类别.OCR(Optical Character Recognition 光学字符识别). MIT口语系统研究组Rob Kass ...
- 堆结构的优秀实现类----PriorityQueue优先队列
之前的文章中,我们有介绍过动态数组ArrayList,双向队列LinkedList,键值对集合HashMap,树集TreeMap.他们都各自有各自的优点,ArrayList动态扩容,数组实现查询非常快 ...
- poj2069
poj2069 题意 求一个覆盖所有点的最小球体的半径.即求空间内一点到所有点的距离的最大值最小的点. 分析 模拟退火算法,但这道题竟然不用随机函数就能过了,主要体现了算法的渐近收敛性, 起始点随意取 ...
- 架构师之路--应用架构的选型和dubbo
这个选型主要决定于系统复杂度.先回顾一下. 1>单一应用架构:对于一个流量很小的网站来说,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本.之前在上家公司做过一个微信公众号的开发就是基 ...
- HTTPS反向代理嗅探
两年前的文章,一直在本地笔记放着,发现博客上竟然没存.发出来. 先说说什么是SSL: SSL是Secure Socket Layer的简称,中文意思是安全套接层,由NetScape公司开发,用 ...
- 微信授权登录(PHP)
微信授权登录(PHP) 微信授权 OAuth2.0授权 微信网页授权 主要是在项目中遇到网页授权登录这个需求,就对此做些总结记录. OAuth2.0授权 OAuth是一个开放协议,允许用户让第三方应用 ...
- mysql关闭/启用外键约束
1.有时为了导入数据方便,需要临时关闭外键约束mysql>SET FOREIGN_KEY_CHECKS=0; 2.打开外键约束mysql>SET FOREIGN_KEY_CHECKS=1; ...