01.JDBC_两个重要的概念:
1).什么是数据库驱动程序:由数据库厂商提供,面向某种特定的编程语言所开发的一套访问本数据库的类库。
驱动包一般由两种语言组成,前端是:面向某种特定编程语言的语言;后端是:本数据库的语言。
可以方便开发人员使用自己的语言来访问本公司的数据库软件。

2).什么是JDBC:是由SUN公司提出一套Java访问数据库的一套标准。它物理上由一组类和接口组成。要求数据库厂商的驱动程序
必须遵守这套标准流程。也要求我们Java程序员也遵守这套流程。这样就使得我们Java程序员访问各种数据库软件
所使用的都是同一个流程。
02.JDBC_四个核心对象:
1).DriverManager:用来获取连接对象
2).Connection:一个连接对象,表示我们的程序和数据库之间的一个连接通道。
3).Statement:SQL执行平台,用于发送SQL语句;
4).ResultSet : 执行查询后将查询结果封装到ResultSet对象中,它就类似于一个集合。

JDBC是Java连接不同数据库的类库,它有三个核心功能:
1. 连接数据库;
2. 向数据库发送SQL语句;
3. 操作SQL语句的返回结果。

A 、 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。
B 、 JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。
C 、 JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。
D 、 JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!

03.Java访问MySQL数据库:
1).将驱动包复制到项目目录下,添加到构建路径。
2).开发步骤:
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/hei66_day21", "root", "123");
//3.获取SQL执行平台
Statement stmt = conn.createStatement();
//4.发送SQL语句,获取结果集
String sql = "select * from city";
ResultSet rs = stmt.executeQuery(sql);
//5.处理结果集
while(rs.next()){
System.out.println(rs.getInt("cid") + "\t" + rs.getString("cname"));
}
//6.释放资源
rs.close();
stmt.close();
conn.close();

JDBC操作数据库的使用步骤顺序

1.导入mysql的驱动程序通过DriverManger注册驱动

2.通过DriverManager获取连接对象Connection

3.通过Connection获取一个可以向数据库发送sql语句的对象Statement

4.通过Statement对象执行sql语句(select) 得到一个结果集ResultSet

5.遍历结果集ResultSet,得到数据表中的数据

6.释放资源

04.开发步骤的详细说明:
1).注册驱动:
2).获取连接对象:
getConnection(连接字符串,用户名,密码)
3).获取SQL执行平台--Statement
Connection对象的createStatement()
4).发送SQL语句【重点掌握】:
Statement的:
a).public int executeUpdate(String sql):用于发送添加(insert)、修改(update)、删除(delete)语句的。
b).public ResultSet executeQuery(String sql):用于发送查询(select)语句的。
5).处理结果集:如果是发送的查询语句,会获取一个ResultSet结果集【重点掌握】
a).ResultSet-->next():让当前的游标位置下移一位;此方法会返回boolean值
b).获取某列的值:推荐使用getXxx(String 字段名)
ResultSet-->getInt(String 字段名)
getInt(int 字段索引):查询结果中的字段索引,是从1开始

getString(String 字段名)
getString(int 字段索引):

getObject(String 字段名)
getObject(int 字段索引):
6).释放资源:
ResultSet-->close()
Statement-->close()
Connection-->close()
05.JDBC工具类的编写:

标准版:

1.5JDBC工具类
“获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils。提供获取连接对象的方法,从而达到代码的重复利用。
该工具类提供方法:public static Connection getConn ()。代码如下:

public class JdbcUtils {

private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/webdb_4";
private static String user = "root";
private static String password = "root";

static{
try {
//注册驱动
Class.forName(driver);
} catch (Exception e) {
throw new RuntimeException(e);
}

}

/**
* 获得连接
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException{
//获得连接
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}

/**
* 释放资源
* @param conn
* @param st
* @param rs
*/
public static void closeResource(Connection conn , Statement st , ResultSet rs){

if(rs != null){
try {
rs.close();
} catch (SQLException e) {
}
}

if(st != null){
try {
st.close();
} catch (SQLException e) {
}
}

if(conn != null){
try {
conn.close();
} catch (SQLException e) {
}
}

}

//1.获取Connection对象--简单的代码复用,每次都会创建一个新的Connection对象
public static Connection getConnection() throws Exception{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei66_day21","root","123");
return conn;
}

//2.释放所有资源
public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
06.SQL语句的拼接:
Scanner sc = new Scanner(System.in);
System.out.println("学员姓名:");
String stuName = sc.next();
System.out.println("年龄:");
int age = sc.nextInt();
System.out.println("性别:");
String sex = sc.next();
System.out.println("身高:");
double height = sc.nextDouble();
System.out.println("地址:");
String address = sc.next();
System.out.println("电话:");
String phoneNum = sc.next();

String sql = "insert into student values(null,'" + stuName + "'," +
age + ",'" +
sex + "'," +
height + ",'" +
address + "','" +
phoneNum + "')";
System.out.println(sql);
//1.获取连接
Connection conn = JDBCUtils.getConnection();
Statement stmt = conn.createStatement();
int row = stmt.executeUpdate(sql);
System.out.println("添加影响的行数:" + row);
JDBCUtils.closeAll(null, stmt, conn);
07.SQL注入的问题:
1.什么是SQL注入:用户输入的数据当中包含一些SQL的格式符号,如果我们不做处理,直接封装到SQL语句中,会导致
SQL语句出错,或者是得到不正确的结果。
2.解决方案:不使用Statement,改用:PreparedStatement,它是Statement的子接口,表示:预定义的SQL执行平台。
它能够将SQL语句和用户的数据分开管理,所以即使用户数据中包含SQL的格式符号,也不会解析为SQL的格式,所以
可以预防SQL注入的问题。
08.PreparedStatement的使用:
1).获取PreparedStatement对象:
....
PreparedStatement ps = conn.prepareStatement(String 预处理的SQL语句);
//填充参数
ps.setString(1,xxx)
ps.setInt(2,xxxx)
//发送SQL语句
ps.executeUpdate();//注意:这里是无参调用--执行添加、修改、删除
ps.executeQuery();//无参。执行:查询

==============================================================================================================================
学习目标:
1.能够理解JDBC的概念:
1.JDBC是Sun公司提出一套Java连接数据库的标准。它的物理上由一些类和接口组成。
2.能够使用DriverManager类
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei66_day21","root","123");
3.能够使用Connection接口
获取SQL执行平台:
1.Statement stmt = conn.createStatement();
2.PreparedStatement ps = conn.parepareStatement(String 预处理的SQL语句)

4.能够使用Statement接口
1.public int executeUpdate(String sql):执行添加,修改,删除语句;
2.public ResultSet executeQuery(String sql):执行查询。
5.能够使用ResultSet接口
...
ResultSet rs = stmt.executeQuery("select * from student");
while(rs.next()){
rs.getInt(String 字段名称)
rs.getInt(int 字段索引)

rs.getString(String 字段名称)
rs.getString(int 字段索引)
}
6.能够描述SQL注入的原理和解决方案:
1.SQL注入的原理:在用户的数据中包含了SQL的格式符号,我们将数据直接拼接SQL语句,会导致SQL语句错误或者执行结果错误。
2.解决方案:使用预处理的SQL执行平台:PreparedStatement
7.能够编写JDBC的工具类
public class JDBCUtils{
//1.获取连接对象的方法
public static Connection getConnection(){
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei65_day21","root","123");
return conn;
}
//2.关闭所有连接的方法
public static void closeAll(ResultSet rs,Statement stmt,Connection conn) throws Exception{
if(rs != null){
rs.close();
}
if(stmt != null){
stmt.close();
}
if(conn != null){
conn.close();
}
}
}
8.能够使用PreparedStatement编写CURD(增删改查)代码
//1.添加
public void save() throws Exception{
//1.获取Connection对象
Connection conn = JDBCUtils.getConnection();
//2.获取预处理的SQL平台
PreparedStatement ps = conn.prepareStatement("insert into student values(null,?,?,?,?,?,?)");
//3.填充数据
ps.setString(1, "汪峰");//第一个?的位置,填充:汪峰
ps.setInt(2, 22);
ps.setString(3, "男");
ps.setDouble(4, 1.80);
ps.setString(5, "北京");
ps.setString(6, "00000000");

//4.执行SQL语句
int row = ps.executeUpdate();
System.out.println("添加影响的行数:" + row);
//释放资源
JDBCUtils.closeAll(null, ps, conn);

}

//2.修改
public void update() throws Exception{
//1.获取Connection对象
Connection conn = JDBCUtils.getConnection();
//2.获取预处理的SQL平台
String sql = "update student set stuName = ? , age = ?, sex = ?, height = ?, address = ?, phoneNum = ? where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
//3.填充数据
ps.setString(1, "撒贝宁");
ps.setInt(2, 22);
ps.setString(3, "男");
ps.setDouble(4, 1.5);
ps.setString(5, "北京");
ps.setString(6, "77777777");
ps.setInt(7, 3);

//4.执行SQL
int row = ps.executeUpdate();
System.out.println("修改影响的行数:" + row);

//5.释放资源
JDBCUtils.closeAll(null, ps, conn);
}

//3.查询
public void findById() throws Exception{
//1.获取Connection
Connection conn = JDBCUtils.getConnection();
//2.获取SQL执行平台
PreparedStatement ps = conn.prepareStatement("select * from student where id = ?");
//3.填充数据
ps.setInt(1, 3);
//4.执行查询
ResultSet rs = ps.executeQuery();
if(rs.next()){
System.out.println(rs.getInt("id") + "\t" + rs.getString("stuName"));
}
//5.释放资源
JDBCUtils.closeAll(null, ps, conn);
}

//4.删除
@Test
public void deleteById() throws Exception{
//1.获取Connection对象
Connection conn = JDBCUtils.getConnection();
//2.获取SQL执行平台
PreparedStatement ps = conn.prepareStatement("delete from student where id = ?");
ps.setInt(1, 3);
//3.执行
int row = ps.executeUpdate();
System.out.println("删除影响的行数:" + row);
//4.释放
JDBCUtils.closeAll(null, ps, conn);

}

package cn.baidu.demo02_JDBC开发的增删改查;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import org.junit.Test;

public class Demo {
//1.添加
public void save() throws Exception{
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei66_day21","root","123");
//3.获取SQL执行平台
String sql = "insert into city values(null,'洛阳',3)";
Statement stmt = conn.createStatement();
int row = stmt.executeUpdate(sql);
System.out.println("添加影响的行数:" + row);
//4.释放资源
stmt.close();
conn.close();
}
//2.修改
public void update() throws Exception{
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei66_day21","root","123");
//3.获取SQL执行平台
String sql = "update city set cname = '信阳' where cname = '洛阳'";
Statement stmt = conn.createStatement();
int row = stmt.executeUpdate(sql);
System.out.println("修改影响的行数:" + row);
//4.释放资源
stmt.close();
conn.close();
}
//3.删除
public void delete() throws Exception{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei66_day21","root","123");
Statement stmt = conn.createStatement();
String sql = "delete from city where cid = 7";
int row = stmt.executeUpdate(sql);
System.out.println("删除影响的行数:" + row);
stmt.close();
conn.close();
}
//4.查询所有记录
@Test
public void findAll() throws Exception{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei66_day21","root","123");
Statement stmt = conn.createStatement();
String sql = "select * from city";
ResultSet rs = stmt.executeQuery(sql);
//遍历
while(rs.next()){
System.out.println(rs.getInt("cid") + "\t" + rs.getString("cname") + "\t" + rs.getInt("pid"));
}
//释放资源
rs.close();
stmt.close();
conn.close();
}
}

package cn.baidu.demo03_自定义工具类的编写;

import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import org.junit.Test;

public class Demo {
//1.添加
public void save() throws Exception{

//2.获取连接对象
Connection conn = JDBCUtils.getConnection();
//3.获取SQL执行平台
String sql = "insert into city values(null,'洛阳',3)";
Statement stmt = conn.createStatement();
int row = stmt.executeUpdate(sql);
System.out.println("添加影响的行数:" + row);
//4.释放资源
JDBCUtils.closeAll(null, stmt, conn);
}
//2.修改
public void update() throws Exception{

//2.获取连接对象
Connection conn = JDBCUtils.getConnection();
//3.获取SQL执行平台
String sql = "update city set cname = '信阳' where cname = '洛阳'";
Statement stmt = conn.createStatement();
int row = stmt.executeUpdate(sql);
System.out.println("修改影响的行数:" + row);
//4.释放资源
/*stmt.close();
conn.close();*/
JDBCUtils.closeAll(null, stmt, conn);
}
//3.删除
public void delete() throws Exception{
Connection conn = JDBCUtils.getConnection();
Statement stmt = conn.createStatement();
String sql = "delete from city where cid = 7";
int row = stmt.executeUpdate(sql);
System.out.println("删除影响的行数:" + row);
/*stmt.close();
conn.close();*/
JDBCUtils.closeAll(null, stmt, conn);
}
//4.查询所有记录
@Test
public void findAll() throws Exception{

Connection conn = JDBCUtils.getConnection();
Statement stmt = conn.createStatement();
String sql = "select * from city";
ResultSet rs = stmt.executeQuery(sql);
//遍历
while(rs.next()){
System.out.println(rs.getInt("cid") + "\t" + rs.getString("cname") + "\t" + rs.getInt("pid"));
}
//释放资源
/*
rs.close();
stmt.close();
conn.close();*/
JDBCUtils.closeAll(rs, stmt, conn);
}
}

package cn.baidu.demo03_自定义工具类的编写;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtils {
//1.获取Connection对象--简单的代码复用,每次都会创建一个新的Connection对象
public static Connection getConnection() throws Exception{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei66_day21","root","123");
return conn;
}

//2.释放所有资源
public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

package cn.baidu.demo04_封装SQL语句;

import java.sql.Connection;
import java.sql.Statement;
import java.util.Scanner;

import org.junit.Test;

import cn.baidu.demo03_自定义工具类的编写.JDBCUtils;

public class Demo {
@Test
public void save() throws Exception{
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个河南的市名:");
String city = sc.next();

// String sql = "insert into city values(null,'信阳',3)";
String sql = "insert into city values(null,'" + city + "',3)";
System.out.println(sql);
//获取连接
Connection conn = JDBCUtils.getConnection();
Statement stmt = conn.createStatement();
int row = stmt.executeUpdate(sql);
System.out.println("添加影响的行数:" + row);
//释放连接
JDBCUtils.closeAll(null, stmt, conn);
}
public void saveStudent() throws Exception{
Scanner sc = new Scanner(System.in);
System.out.println("学员姓名:");
String stuName = sc.next();
System.out.println("年龄:");
int age = sc.nextInt();
System.out.println("性别:");
String sex = sc.next();
System.out.println("身高:");
double height = sc.nextDouble();
System.out.println("地址:");
String address = sc.next();
System.out.println("电话:");
String phoneNum = sc.next();

String sql = "insert into student values(null,'" + stuName + "'," +
age + ",'" +
sex + "'," +
height + ",'" +
address + "','" +
phoneNum + "')";
System.out.println(sql);
//1.获取连接
Connection conn = JDBCUtils.getConnection();
Statement stmt = conn.createStatement();
int row = stmt.executeUpdate(sql);
System.out.println("添加影响的行数:" + row);
JDBCUtils.closeAll(null, stmt, conn);

}
}

package cn.baidu.demo05_关于SQL注入的问题;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

import cn.baidu.demo03_自定义工具类的编写.JDBCUtils;

public class Demo {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("请输入登录名:");
String loginName = sc.nextLine();
System.out.println("请输入密码:");
String loginPwd = sc.nextLine();

String sql = "select * from users where loginName = '" + loginName +
"' and loginPwd = '" + loginPwd + "'";
System.out.println(sql);
//1.获取连接对象
Connection conn = JDBCUtils.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if(rs.next()){
System.out.println("欢迎:" + loginName + " 登录系统!");
}else{
System.out.println("用户名或密码错误!");
}
JDBCUtils.closeAll(rs, stmt, conn);
}
}

package cn.baidu.demo06_使用PreparedStatement防止SQL注入;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;

import cn.baidu.demo03_自定义工具类的编写.JDBCUtils;

public class Demo {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("请输入登录名:");
String loginName = sc.nextLine();
System.out.println("请输入密码:");
String loginPwd = sc.nextLine();

String sql = "select * from users where loginName = ? and loginPwd = ?";

//1.获取连接对象
Connection conn = JDBCUtils.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
//填充数据
ps.setString(1, loginName);
ps.setString(2, loginPwd);

ResultSet rs = ps.executeQuery();
if(rs.next()){
System.out.println("欢迎:" + loginName + " 登录系统!");
}else{
System.out.println("用户名或密码错误!");
}
JDBCUtils.closeAll(rs, ps, conn);
}
}

package cn.baidu.demo06_使用PreparedStatement防止SQL注入;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;

import cn.baidu.demo03_自定义工具类的编写.JDBCUtils;

public class Demo {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("请输入登录名:");
String loginName = sc.nextLine();
System.out.println("请输入密码:");
String loginPwd = sc.nextLine();

String sql = "select * from users where loginName = ? and loginPwd = ?";

//1.获取连接对象
Connection conn = JDBCUtils.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
//填充数据
ps.setString(1, loginName);
ps.setString(2, loginPwd);

ResultSet rs = ps.executeQuery();
if(rs.next()){
System.out.println("欢迎:" + loginName + " 登录系统!");
}else{
System.out.println("用户名或密码错误!");
}
JDBCUtils.closeAll(rs, ps, conn);
}
}

java核心技术第三篇之JDBC第一篇的更多相关文章

  1. Java基础知识常见面试题汇总第一篇

    [Java面试题系列]:Java基础知识常见面试题汇总 第一篇 文中面试题从茫茫网海中精心筛选,如有错误,欢迎指正! 1.前言 ​ 参加过社招的同学都了解,进入一家公司面试开发岗位时,填写完个人信息后 ...

  2. Java基础(三十一)JDBC(1)常用类和接口

    1.Driver接口 每种数据库的驱动程序都应该提供一个实现java.sql.Driver接口的类.在加载某一驱动程序的Driver类时,它应该创建自己的实例并向java.sql.DriverMana ...

  3. java核心技术第四篇之JDBC第二篇

    01.JDBC连接池_连接池的概念: 1).什么是连接池:对于多用户程序,为每个用户单独创建一个Connection,会使程序降低效率.这时我们可以创建一个"容器", 这个容器中, ...

  4. javaWeb核心技术第三篇之JavaScript第一篇

    - 概述 - JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言 - 作用:给页面添加动态效果,校验用户信息等. - 入门案例 - js和html的整合 - 方式1:内联式 ...

  5. Java中JNI的使用详解第一篇:HelloWorld

    转自: http://blog.csdn.net/jiangwei0910410003/article/details/17465085 今天开始研究JNI技术,首先还是老套路,输出一个HelloWo ...

  6. java SE 入门之语言与环境(第一篇)

    Javase的语言与开发环境Keke2016年03月08日 Java属于-Oracle公司(甲骨文)创始人:Gosling1995年诞生1998年12月发布jdk1.22002年2月发布:jdk1.4 ...

  7. 【Java面试题系列】:Java基础知识常见面试题汇总 第一篇

    文中面试题从茫茫网海中精心筛选,如有错误,欢迎指正! 1.前言 ​ 参加过社招的同学都了解,进入一家公司面试开发岗位时,填写完个人信息后,一般都会让先做一份笔试题,然后公司会根据笔试题的回答结果,确定 ...

  8. JDBC第一篇--【介绍JDBC、使用JDBC连接数据库、简单的工具类】

    1.什么是JDBC JDBC全称为:Java Data Base Connectivity,它是可以执行SQL语句的Java API 2.为什么我们要用JDBC 市面上有非常多的数据库,本来我们是需要 ...

  9. #Java学习之路——基础阶段(第一篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

随机推荐

  1. 2019年百度最新Java工程师面试题

    一.单选题(共27题,每题5分) 1若下列所用变量均已经正确定义,以下表达式中不合法的是?   A.x>>3 B.+++j C.a=x>y?x:y D.x%=4 参考答案:B 答案解 ...

  2. ASP.NET是什么?

    ASP.NET简介 简单来说,ASP.NET 是一个使用 HTML.CSS.JavaScript 和服务器脚本创建网页和网站的开发框架. 微软在2001年开发的第一个版本的ASP.NET,是一种建立在 ...

  3. java基础(1):java概述、jdk的安装、环境变量的配置、helloworld案例

    1. Java开发环境搭建 1.1 java概述 众所周知Java是一门编程语言,编程语言就是用来编写软件的.那么使用Java到底能用来编写什么软件呢?你所熟知的很多软件都可以用Java来编写,例如: ...

  4. 教你用Python实现免费蹭WiFi,只要有WiFi的地方,你就不会断网!

    想象一下,程序员没有WIFI会怎样? 程序员没有网络肯定会寸步难行! 但是对于Python程序员来说,只要附近有热点,分分钟就能蹭网成功! 想要WIFI破解,python+字典,这是必少不了的.热点加 ...

  5. ios中仿蚂蚁森林动画效果

    参考链接:https://www.jianshu.com/p/0ba9d80f8e77 demo下载链接:https://gitee.com/ovix/TreeWithRandomFruitBtn

  6. 从系统学Android--2.5Activity启动模式

    本系列文章目录:更多精品文章分类 本系列持续更新中.... Activity 的启动模式一共有四种,分别是:standard.singleTop.singleTask.singleInstance . ...

  7. LiveData使用

    ### Andorid LiveData 使用 [[_TOC_]] #### Lifycycle 使用1.继承FragmentActivity 实现LifecycleOwner接口2.声明一个Life ...

  8. GitHub最强技术面试手册:Tech Interview Handbook

    摘要: 求职还是需要认真准备的. 原文:超实用技术面试手册,从工作申请.面试考题再到优势谈判,GitHub获30000星 作者:量子位 技术人员求职面试,单刷leetcode上的大厂题库可能还不够. ...

  9. 近期用到了Git,就简单介绍下具体用法吧

    pull:是下拉代码,相等于将远程的代码下载到你本地,与你本地的代码合并push:是推代码,将你的代码上传到远程的动作完整的流程是: 第一种方法:(简单易懂) 1.git add .(后面有一个点,意 ...

  10. android binder 进程间通信机制3-Binder 对象生死

    以下概述Binder通信过程中涉及到的四个对象:Binder本地对象.Binder实体对象.Binder引用对象.Binder代理对象的生死. 1.Binder通信的交互过程 1.Client 进程发 ...