目录:

  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连接数据库【不使用数据库连接池】的更多相关文章

  1. JDBC02 利用JDBC连接数据库【使用数据库连接池】

    目录 1/2/3  Statement 和 Preparedstatement 的区别 4 读取properties配置文件 5 数据库连接池 6 利用数据库连接池连接数据库 1 使用Statemen ...

  2. 利用JDBC连接数据库(MySQL)

    1 在eclipse中创建一个maven项目(在Java模式下,不要在JavaEE模式下) 1.1 file  -->> new  -->> project 2 下载数据库驱动 ...

  3. JDBC(11)—数据库连接池

    在实际开发过程中,特别是在web应用系统中,如果程序直接访问数据库中的数据,每一次数据访问请求丢必须经历建立数据库连接.打开数据库.存取数据和关闭数据库连接.而连接并打开数据库是一件既消费资源又费时的 ...

  4. JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)

    JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/beans)中建立数据库连接 2)进行sql操作 3)断开数据库连接 ...

  5. JDBC基础学习(六)—数据库连接池

    一.数据库连接池介绍 1.数据库连接池的缘由      对于一个简单的数据库应用,由于对于数据库的访问不是很频繁.这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什 ...

  6. 【转】JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)

    转自:http://www.cnblogs.com/ysw-go/ JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/ ...

  7. JDBC(三)数据库连接池(DBCP、C3P0)

    前言 这段时间状态有一点浮躁,希望自己静下心来.还有特别多的东西还没有学懂.需要学习的东西非常的多,加油! 一.JDBC复习 Java Data Base Connectivity,java数据库连接 ...

  8. JDBC(四)----数据库连接池

    ##  数据库连接池 *  概念:其实就是一个容器(集合) *  当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后会将连接对象归还给容 ...

  9. java基础之JDBC六:DBCP 数据库连接池简介

    我们之前写的代码中的数据库连接每次都是自己创建,用完以后自己close()销毁的,这样是很耗费资源的,所以我们引入DBCP DBCP简介 概述: Data Base Connection Pool, ...

随机推荐

  1. Promise简介

    Promise是ES6中的函数,规范了如何处理异步任务的回调函数,功能类似于jQuery的defferred.简单说就是通过promise对象的不同状态调用不同的回调函数.目前IE8及以下不支持,其他 ...

  2. javaWeb学习总结(4)- HTML 关于head中的<meta>标签

    关于<meta> 标签 <meta>标签出现在网页的标题部分,这些信息并不会出现在浏览器页面的显示之中,只会显示在源代码中.也就是在...当中. 主要用途是设置网页语言的编码方 ...

  3. 浅谈 Java 主流开源类库解析 XML

    在大型项目编码推进中,涉及到 XML 解析问题时,大多数程序员都不太会选用底层的解析方式直接编码. 主要存在编码复杂性.难扩展.难复用....,但如果你是 super 程序员或是一个人的项目,也不妨一 ...

  4. Comparing the contribution of NBA draft picks(转)

    When it comes to the NBA draft, experts tend to argue about a number of things: at which position wi ...

  5. VR全景智慧城市——宣传再华丽,不如用户亲身参与

    在当今社会上,VR和AI已经成为黑科技的代名词了.同样都是很热门的科技,但是它们的出场方式却差距不小.AI的出场方式是很有科技范,而VR的出场方式却是土豪气十足. 营销是什么,是通过制造爆点,用爆点实 ...

  6. Notification的基本用法以及使用RemoteView实现自定义布局

    Notification的作用 Notification是一种全局效果的通知,在系统的通知栏中显示.既然作为通知,其基本作用有: 显示接收到短消息.即时信息等 显示客户端的推送(广告.优惠.新闻等) ...

  7. APUE-文件和目录(三)函数chown 和lchown

    下面的几个chown函数可用于更改文件的用户ID和组ID.如果两个参数owner或group中的任意一个是-1,则对应的ID不变. #include<unistd.h> int chown ...

  8. 浅谈Android studio中OKHttp安装及简单使用

    Google貌似在6.0版本里面删除了HttpClient相关API,鉴于okhttp的口碑相当好,介绍一下OKHttp的安装及使用: 一.安装 对于Android Studio的用户,在Projec ...

  9. 再来写一个随机数解决方案,对Random再来一次封装

    本文提供对Random的封装,简化并扩展了其功能 获取随机数,确保同时调用不会重复 //new Random().Next(5); RandomTask.Next(); 从一个列表中,随机获取其中某个 ...

  10. 20+行代码使用es5 Object.defineProperty 实现简单的watch功能

    /** * 一个简单的demo 帮助理解defineProperty,只对Object类型参数有效 */ $watch=function(myObject,callback){ function in ...