目录
1. 将数据库驱动包,添加到项目依赖中
创建目录,拷贝jar包,然后add as library
2. 创建数据源
DataSourse:数据源,描述了数据库服务器在哪里
3. 和数据库建立连接
使用JDBC里的Connection将代码和数据库服务器进行连接
一个程序中,通常有一个数据源对象,可以有多个Connection对象
4. 构造sql语句
PreparedStatement:表示一个预处理过的SQL语句对象
5. 执行sql语句
(1)executeUpdate 对应插入到删除修改语句,返回值表示这次SQL操作影响到的行数
(2)executeQuery 对应查询语句,返回值则是返回的临时表数据,用ResultSet接收
6. 释放资源
colse释放资源 先创建的后释放,后创建的先释放
各种数据库,都会提供API,方便编程语言来控制 API:就是应用程序编程接口,提供了一组类/方法,让程序员直接调用 Oracle、SQL Server、MySQL、SQLite... 不同种类的数据库提供的API不一样
API不一样就会有很多问题 (提高程序员学习成本; 如果项目要把数据库替换成另一种,改动会非常大 ) Java中为了解决这个问题,就提供了一组统一风格的数据库操作API 然后让这些数据库厂商来适配java的API 所以程序员只要掌握这一套 java的API,就可以操作各种数据库,java把这个API叫JDBC

下载方法:
(1)去Oracle官网下载(麻烦需要去官网登录注册才可以下载)
(2)去中央仓库下载(https://mvnrepository.com/)
1.下载mysql驱动包
1)打开中央仓库—搜索mysql驱动包

2)找到和自己的mysql大版本对应的驱动包

3)找到对应大版本,然后点击进行下载

下载的是一个驱动包,驱动包在代码中才能看出来
2.把刚刚下载的jar包导入到项目中,使用
1)先创建一个目录,比如名字叫lib,和src同级

2)把刚才的jar包拷贝进lib中

3)右键刚才的目录lib,找到add as library ,是idea可以识别到jar包


通过JDBC来操作数据库,往数据库java01中的student1表中插入一条记录
1. 将数据库驱动包,添加到项目依赖中
右键项目创建目录(点Directory,和src同级)——>拷贝驱动包到目录——>右键目录点击add as library(让idea识别jar包)

2. 建立数据库连接
创建数据源对象,数据源对象就描述了要访问的数据库是什么和数据库位置在哪里
DataSource dataSource = new MysqlDataSource();//向下转型
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java01?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("111111");
每种数据库都会提供对应的类来实现DataSourse接口
调用的这个方法不是DataSource中的,而是MysqlDataSource转成子类引用,才可以调用这个方法(向下转型)
DataSource是服务于各种数据库的,
MysqlDataSource只服务于MySQL
MySQL中,是一个客户端服务器的程序,描述服务器的位置
会使用URL(去唯一资源定位符)这个概念来表示
但是有点的数据库,比如SQLite,就不是客户端服务器结构的
也就不使用URL
DataSource考虑到通用性,就不能使用setURL这样的方法
也可以这样写,但不建议
这种写法是不使用多态的写法
这样写可能会让MysqlDataSource这个类型出现在代码的很多地方
导致MySQL和项目的耦合性就提高了
(如果以后要更换成其他数据库,就需要把很多出现MysqlDataSoucre这个类型的地方,都要进行修改,非常麻烦)

3. 创建操作命令
让代码和数据库服务器建立连接
Connection connection = dataSource.getConnection();

4. 构造和执行SQL语句
构造要执行的SQL语句
(1)直接插入的
//1.构造请求
String sql = "insert into student1 values(1, '张三')";
PreparedStatement statement = connection.prepareStatement(sql);
//2.发送请求 & 读取响应
//返回影响到的行数
int n = statement.executeUpdate();
System.out.println("n = " + n);

SQL语句发给数据库,然后数据库对这个SQL进行解析
解析过程是比较消耗资源、消耗时间的,所以就将一部分解析的工作,放在客户端完成,
客户端完成后,1将解析结果发给数据库,这样就节省了资源开销,提高效率
执行SQL,执行方法有两个
(1)executeUpdate 对应插入到删除修改语句,返回值表示这次SQL操作影响到的行数
(2)executeQuery 对应查询语句,返回值则是返回的临时表数据,用ResultSet接收
(2)用户输入,确定插入的值
这样做的好处是 代码可读性好,并且SQL注入问题得到改善
//用户输入,通过用户输入的数据,来确定插入的值
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要插入的学号:");
int id = scanner.nextInt();
System.out.println("请输入要插入的名字:");
String name = scanner.next();
//构造sql语句
String sql = "insert into student1 values(?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);
System.out.println("statement: " + statement);
//执行sql语句
int n = statement.executeUpdate();
System.out.println("n = " + n);
5. 释放资源
完成之后,就需要关闭释放相关资源
释放资源的顺序和申请资源的顺序正好相反
(先创建的后释放,后创建的先释放)
statement.close();
connection.close();
执行代码
影响了一行
打开MySQL查询一下,看插入成功了没有
(1)修改
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class JDBCUpdate {
public static void main(String[] args) throws SQLException {
//1.创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java01?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("111111");
//2.和数据库建立连接
Connection connection = dataSource.getConnection();
//3.构造sql语句
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要修改的同学学号:");
int id = scanner.nextInt();
System.out.println("请输入要修改的同学姓名:");
String name = scanner.next();
String sql = "update student1 set name = ? where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,name);
statement.setInt(2,id);
//4.执行sql语句
int n = statement.executeUpdate();
System.out.println("n = " + n);
//5.关闭释放资源
statement.close();
statement.close();
}
}
运行代码后,在MySQL中查看是否修改成功

(2)删除
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 28463
* Date: 2022—08—16
* Time: 13:49
*/
public class JDBCDelete {
public static void main(String[] args) throws SQLException {
//1.创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java01?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("111111");
//2.和数据库建立连接
Connection connection = dataSource.getConnection();
//3.构造sql语句
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要删除的同学学号:");
int id = scanner.nextInt();
String sql = "delete from student1 where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
//4.执行sql语句
int n = statement.executeUpdate();
System.out.println("n = " + n);
//5.关闭释放资源
statement.close();
connection.close();
}
}
执行代码,查看是否删除成功

(3)查询
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 28463
* Date: 2022—08—16
* Time: 14:03
*/
public class JDBCSelect {
public static void main(String[] args) throws SQLException {
//1.创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java01?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("111111");
//2.和数据库建立连接
Connection connection = dataSource.getConnection();
//3.构造sql语句
String sql = "select * from student1";
PreparedStatement statement = connection.prepareStatement(sql);
//4.执行sql语句
//查询语句要使用executeQuery来完成
//返回结果是ResultSet,结果集,里面是一个“表”这样的数据结构
ResultSet resultSet = statement.executeQuery();
//5.遍历结果集合
while (resultSet.next()) {
//每次循环,都可以获取resultSet中的一行,进一步的就可以拿到每一列
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id = " + id + ", name = " + name);
}
//6.释放资源
resultSet.close();
statement.close();
connection.close();
}
}

也可以加上条件查询

几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。
我正在查看Ruby日志记录库Logging.logger方法并从sourceatgithub提出问题与这段代码有关:logger=::Logging::Logger.new(name)logger.add_appendersappenderlogger.additive=falseclass我知道类 最佳答案 这实际上删除了方法(当它实际被执行时)。这是确保close不会被调用两次的保障措施。看起来好像有嵌套的“class 关于Ruby元编程问题,我们在StackOverflow上找到一
使用Paperclip,我想从这样的URL抓取图像:require'open-uri'user.photo=open(url)问题是我最后得到一个像“open-uri20110915-4852-1o7k5uw”这样的文件名。有什么方法可以更改user.photo上的文件名?作为一个额外的变化,Paperclip将我的文件存储在S3上,所以如果我可以在初始分配中设置我想要的文件名就更好了,这样图像就会上传到正确的S3key。像这样:user.photo=open(url),:filename=>URI.parse(url).path 最佳答案
我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi
我正在开发一个xcode自动构建系统。在执行一些预构建验证时,我想检查指定的证书文件是否已被撤销。我了解securityverify-cert验证其他证书属性但不验证吊销。我如何检查撤销?我正在用Ruby编写构建系统,但我对任何语言的想法都持开放态度。我阅读了这个答案(Openssl-Howtocheckifacertificateisrevokedornot),但指向底部的链接(DoesOpenSSLautomaticallyhandleCRLs(CertificateRevocationLists)now?)进入的Material对我的目的来说有点过于复杂(用户上传已撤销的证书是一