JDBC简述

WTF is JDBC

Java Data Base Connection。

实现在Java中进行CRUD(create read update delete)操作。

JDBC 是一个规范

java中是一系列接口,规定了使用java程序连接数据库时应该实现的内容。

告诉数据库厂商,你的数据库产品要想让java程序可以进行连接操作时必须遵守的规范。

JDBC只是接口,JDBC接口的实现类是由不同的数据库厂商提供的。

JDBC 常用的接口

  • javax.sql.Connection数据库连接对象:创建与数据库之间的连接;
  • javax.sql.Statement 数据库操作对象,将SQL语句发送至数据库,返回数据库查询结果;
  • javax.sql.ResultSet 结果集对象,负责接收执行查询语句之后的查询结果。

使用JDBC操作数据库的基本注释

基本步骤

  1. CUD 可以不用返回对象,只要执行就行了;
  2. R 查询时,要使用ResultSet对象来接收查询结果。

执行查询命令的基本步骤

  1. 创建连接对象Connection
  2. 创建操作对象Statement
  3. 使用Statement对象发送查询命令
  4. 使用ResultSet对象接收查询结果
  5. 处理查询结果
  6. 关闭数据库连接

Coding

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import com.mysql.jdbc.Driver;
import con.mysql.*;

public class JDBCTest{
public static void main(String[] args){
// 创建连接对象Connection
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/name"
+"?useUnicode=true&characterEncoding=utf8";
String username = "root";
String password = "root";

Class.forName(driverClassName); // 反射
Connection conn = DriverManager.getConnection(url,username,password);

// 创建操作对象
Statement stat = conn.createStatement();

// 使用Statement对象发送查询命令
String sql = "select * from goods_ustb";
// 使用ResultSet对象接受查询结果
ResultSet rs = stat.executeQuery(sql);
/* 增删改时
stat.executeUpdate(sql);
*/

// 处理查询结果
while(rs.next()){
int i = rs.getInt(/*int columenindex || String culimenlabel*/ 0);
}
/* 结果集是一个二维表格。rs是一个引用,每次指向一行数据。
rs对象中两个核心方法:1.向下移动一行;2.取出这一行中某一列的值。
*/

// 关闭数据库连接
conn.close();
}
}

封装

创建工具类,一个方法是获取数据库连接,一个关闭数据库连接。

工程分层

  • domain 实体对象:封装与数据库表对应的类
  • util 工具类:整个工程通用的方法封装到工具类中
  • dao 数据访问层:封装了所有针对数据库进行CRUD操作的内容
  • service 服务/业务处理层:封装了所有业务处理规则判断代码
Share

MNIST with FC and CNN

来了来了我们可亲可爱的朋友MNIST~

作为一个超级初级的手写数字数据集,含有60k个全损低清图像作为训练集,10k个作为验证集。每个图像是(28,28,1)范围在[0,255]的整数数字灰阶图像,数字越大代表笔迹越重,即黑底白字。

介于MNIST的特性,想来试试FCCNN之间的区别,当然训练速度仅供参考,模型不同怎么恋爱?我这个小1060也带不动两位巨佬神仙打架。

Read More

Share

又见hexo+SSL

前文

将hexo部署在了vps上,使用nodejs执行$ hexo s以维持生态,猛然发现以这种方式操作,写完稿子还要本地push然后远端pull两次操作,还得处理图床,实在是太麻烦了,尤其到扯上插件、主题的部署更是爆炸,再三考虑后还是换Github Page吧。

既然脱离开了nodejs应用的端口占用,老nginx就有机会换上SSL大法。

Hexo 本地部署

在_config.yml中设置好deploy,并关联好ssh-key,以实现直接用$ hexo d来完成同步。

1
2
3
4
deploy:
type: git
repo: https://github.com/timrockefeller/timrockefeller.github.io
branch: master

进入仓库的设置界面勾选Github Page即可,与此同时可以选用SSL。

跨域SSL

在一个以HTTPS访问的页面上,客户端会默认阻止访问HTTP,无论是否跨域。

然而当某些插件部署在vps上时(另一个二级域名),就不得不搞个SSL。

  1. 启用

    创建一个nodejs的小服务后(如websocket或是简单的action),服务的API往往需要通过域名转发出去。

  2. 设置转发

    稍微配置一下nginx:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    server
    {
    listen 80;
    server_name api.kitekii.pw;
    index index.html;
    root /path/to/www;
    location ~ api.* {
    proxy_pass http://0.0.0.0:8888;
    }
    }

    本地还是使用http在域内转发,这个端口这么吉利,以后肯定得改(咦)。

  3. 配置SSL

    暂用Let’s Encrypt(逃),概不细述~~

    添加对listen 443 ssl http2;的监听即可。

  4. api允许跨域

    在nginx配置的location项中添加add_header 'Access-Control-Allow-Origin' '*';即可实现。

手贱

千万不要把443绑到其他地方去了!!当初就不该跟着教程走,无意间将443绑给了科学上网服务……虽然当时确实能躲避某种操作,可现在看来已无卵用orz。

Share

Rust Windows环境搭建

该文章主要讲述在windows10+vscode下如何构建一个完整的rust编译调试环境,以及过程中可能出现的问题。

Read More

Share

Permission denied when git push

在很长一段时间没有使用git push 后,你的sshkey可能会过期:

1
2
3
Permission denied(publickey).
fatal: Could not read from remote repository
Please make sure you have the correct access rights and the repository exists.

解决方案:

Read More

Share

Keras Intro : 基本模型保存

Sequential-Module模型

常用层

Dense全连接

1
2
3
4
5
6
7
8
9
10
keras.layers.core.Dense(units,
activation = None,
use_bias = True,
kernel_initializer = 'glorot_uniform',
bias_initializer = 'zeros',
kernel_regularizer = None,
bias_regularizer = None,
activity_regularizer = None,
kernel_constraint = None,
bias_constraint = None)

Dense就是常用的全连接层,所实现的运算是output = activation(dot(input, kernel)+bias)。其中activation是逐元素计算的激活函数,kernel是本层的权值矩阵,bias为偏置向量,只有当use_bias=True才会添加。
参数说明

  • units:大于0的整数,代表该层的输出维度
  • activation:激活函数,为预定义的激活函数名(参考激活函数),或逐元素(element-wise)的Theano函数。如果不指定该参数,将不会使用任何激活函数(即使用线性激活函数:a(x)=x)
  • use_bias: 布尔值,是否使用偏置项
  • kernel_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
  • bias_initializer:偏置向量初始化方法,为预定义初始化方法名的字符串,或用于初始化偏置向量的初始化器。参考initializers
  • kernel_regularizer:施加在权重上的正则项,为Regularizer对象
  • bias_regularizer:施加在偏置向量上的正则项,为Regularizer对象
  • activity_regularizer:施加在输出上的正则项,为Regularizer对象
  • kernel_constraints:施加在权重上的约束项,为Constraints对象
  • bias_constraints:施加在偏置上的约束项,为Constraints对象
Share

SKLearn玄学操作

分离数据集

train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取train data和test data,形式为:

1
X_train,X_test, y_train, y_test = cross_validation.train_test_split(train_data, train_target, test_size=0.4, random_state=0)

  • train_data:所要划分的样本特征集
  • train_target:所要划分的样本结果
  • test_size:样本占比,如果是整数的话就是样本的数量
  • random_state:是随机数的种子。

引用

ML神器:sklearn的快速使用

OneHot编码知识点

机器学习零基础?手把手教你用TensorFlow搭建图像分类器

Share

OpenCV Intro : 基本图像操作

Open Computer Vision 万物起源。

1
2
import cv2 # OpenCV本体
import numpy as np # 数学库

Read More

Share

节奏游戏开发时的万般阻难

施工中……

音符同步

senator

你需要[RequireComponent(typeof(AudioSource))]来规定该元件可被作为音游元件。

  1. 使用AudioSettings.dspTime 跟踪歌曲的位置,而不是使用 Time.timeSinceLevelLoad

  2. 使用歌曲的位置来更新移动。

  3. 不要通过每帧的时差来更新音符。

Read More

Share

npm install 一时爽,gyp 来劝退

搬运自旧博客,不保证其时效性与可靠性

大部分时间是因为没有看官方文档……要用python27啊!!!

Read More

Share