JDBC概念:
JDBC本质:
JDBC好处
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url,username,password);
String sql = "update..";
Statement stmt = conn.createStatement();
stmt.executeUpdate(sql);
stmt.close();
conn.close();
DriverManger(驱动管理类)作用:
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
查看源码
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
提示:
MySQL5之后的驱动包,可以省略注册驱动的步骤
自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类
2.获取连接
Connection conn = DriverManager.getConnection(url, username, password);
参数
conncetion(数据库连接对象)作用:
1.获取执行SQL对象
Statement stmt = conn.createStatement();
PreparedStatement stmt = conn.prepareStatement(sql);
CallableStatemnet stmt = prepareCall(sql);
2.管理事务
MySQL事务管理
JDBC事务管理:Connection接口中定义了3个对应的方法
Statement作用:执行SQL语句
执行SQL语句
ResultSet(结果集对象)作用:
ResultSet stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象
获取查询结果
使用步骤:
1.游标向下移动一行,并判断该行否有数据:next()
2.获取数据:getXxx(参数)
需求:查询account账户表数据,封装为Account对象中,并且存储到ArrayList集合中
package com.itheima.jdbc;
import com.itheima.pojo.Account;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
/**
* JDBC API 详解:ResultSet
*/
public class JDBCDemo_resultSet {
public static void main(String[] args) throws Exception {
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2.获取连接:如果连接是本机的mysql并且端口是默认的3306可以简化书写
String url = "jdbc:mysql:///db1?useSSL=false";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义sql
String sql = "select * from account";
//4.获取Statememt对象
Statement stmt = conn.createStatement();
//5.执行
ResultSet rs = stmt.executeQuery(sql);
List<Account> list = new ArrayList<>();
//6.处理结果,遍历rs中所有数据
//6.1光标向下移动一行,并且判断当前行是否有数据
while (rs.next()) {
Account account = new Account();
//6.2获取数据
int id = rs.getInt(1);
String name = rs.getString(2);
double money = rs.getDouble(3);
account.setId(id);
account.setName(name);
account.setMoney(money);
//存入集合
list.add(account);
System.out.println(list);
}
//7.释放资源
rs.close();
stmt.close();
conn.close();
}
}
预编译SQL语句并执行:预防SQL注入问题
①获取PreparedStatement对象
//SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";
//通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
②设置参数值
③执行SQL
executeUpdate(); /executeUpdate(); :不需要再传递sql
攻击
的方法。①PreparedStatement预编译功能开启:useServerPrepStmts=true
②配置MySQL执行日志(重启mysql服务后生效)
log-output=FILE
general-log=1
general_log_file="D:\mysql.log"
slow-query-log=1
slow_query_log_file="D:\mysql_slow.log"
long_query_time=2
数据库连接池
是个容器,负责分配、管理数据库连接(Connection)
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
好处:
DataSource
Connection getConnection();
常见的数据库连接池:
Druid(德鲁伊)
1.导入jar包druid-1.1.12.jar
2.定义配置文件 druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true
username=root
password=root
# 初始化连接数量
initialSize=5
# 最大连接数量
maxActive=10
# 最大等待时间
maxWait=3000
3.加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("out/production/jdbc-demo/druid.properties"));
//查看当前路径
System.out.println(System.getProperty("user.dir"));
4.获取数据库连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
5.获取连接
Connection conn = dataSource.getConnection();
System.out.println(conn);
属性 | 说明 | 建议值 |
---|---|---|
url | 数据库的jdbc连接地址。一般为连接oracle/mysql。示例如下: | |
mysql : jdbc:mysql://ip:port/dbname?option1&option2&… | ||
oracle : jdbc:oracle:thin:@ip:port:oracle_sid | ||
username | 登录数据库的用户名 | |
password | 登录数据库的用户密码 | |
initialSize | 启动程序时,在连接池中初始化多少个连接 | 10-50已足够 |
maxActive | 连接池中最多支持多少个活动会话 | |
maxWait | 程序向连接池中请求连接时,超过maxWait的值后,认为本次请求失败,即连接池 | 100 |
没有可用连接,单位毫秒,设置-1时表示无限等待 | ||
minEvictableIdleTimeMillis | 池中某个连接的空闲时长达到 N 毫秒后, 连接池在下次检查空闲连接时,将 | 见说明部分 |
回收该连接,要小于防火墙超时设置 | ||
net.netfilter.nf_conntrack_tcp_timeout_established的设置 | ||
timeBetweenEvictionRunsMillis | 检查空闲连接的频率,单位毫秒, 非正整数时表示不进行检查 | |
keepAlive | 程序没有close连接且空闲时长超过 minEvictableIdleTimeMillis,则会执 | true |
行validationQuery指定的SQL,以保证该程序连接不会池kill掉,其范围不超 | ||
过minIdle指定的连接个数。 | ||
minIdle | 回收空闲连接时,将保证至少有minIdle个连接. | 与initialSize相同 |
removeAbandoned | 要求程序从池中get到连接后, N 秒后必须close,否则druid 会强制回收该 | false,当发现程序有未 |
连接,不管该连接中是活动还是空闲, 以防止进程不会进行close而霸占连接。 | 正常close连接时设置为true | |
removeAbandonedTimeout | 设置druid 强制回收连接的时限,当程序从池中get到连接开始算起,超过此 | 应大于业务运行最长时间 |
值后,druid将强制回收该连接,单位秒。 | ||
logAbandoned | 当druid强制回收连接后,是否将stack trace 记录到日志中 | true |
testWhileIdle | 当程序请求连接,池在分配连接时,是否先检查该连接是否有效。(高效) | true |
validationQuery | 检查池中的连接是否仍可用的 SQL 语句,drui会连接到数据库执行该SQL, 如果 | |
正常返回,则表示连接可用,否则表示连接不可用 | ||
testOnBorrow | 程序 申请 连接时,进行连接有效性检查(低效,影响性能) | false |
testOnReturn | 程序 返还 连接时,进行连接有效性检查(低效,影响性能) | false |
poolPreparedStatements | 缓存通过以下两个方法发起的SQL: | true |
public PreparedStatement prepareStatement(String sql) | ||
public PreparedStatement prepareStatement(String sql, | ||
int resultSetType, int resultSetConcurrency) | ||
maxPoolPrepareStatementPerConnectionSize | 每个连接最多缓存多少个SQL | 20 |
filters | 这里配置的是插件,常用的插件有: | stat,wall,slf4j |
监控统计: filter:stat | ||
日志监控: filter:log4j 或者 slf4j | ||
防御SQL注入: filter:wall | ||
connectProperties | 连接属性。比如设置一些连接池统计方面的配置。 | |
druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 | ||
比如设置一些数据库连接属性: |
文章浏览阅读1.2k次。在TI 的CC2530中,使用的是协议栈Z-Stack2007,现在想通过串口与STM32通信,当STM32给zigbee发送数据时,zigbee接收,只是接收的这部分代码TI给封装起来了,只知道在配置里头是这样的:/* @ZL 串口初始化 */halUARTCfg_t uartConfig;/* UART Configuration */uartConfig.configured ..._linux zigbee stack
文章浏览阅读6.1k次,点赞7次,收藏33次。余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间。github 参考链接:https://github.com/ZhanPwBibiBibi/CHlikelihood# -*- coding: utf-8 -*-import jiebaimport numpy as npimport redef get_word_vector(s1,s2): """ :pa.._jieba判断语义重复
文章浏览阅读4.7k次。Openmesh函数库设计及与CGAL的对比在前面写了CGAL模板类设计的一些思路,这里尝试写一点openmesh库的设计思路以及和CGAL的对比.虽然OPENMESH代码量小,不过还是只看懂皮毛,很大部分算是翻译帮助文档吧,主要用作笔记,方便以后继续分析。相对CGAL的功能强大和庞大(包含大量计算几何算法的实现),Openmesh显得更加小巧轻量化,它更专_openmesh和cgal
文章浏览阅读1.1k次。//函数名:chksafe//功能介绍:检查是否含有"",//,"/"//参数说明:要检查的字符串//返回值:0:是 1:不是function chksafe(a){ return 1;/* fibdn = new Array ("" ,"//", "、", ",", ";", "/"); i=fibdn.length; j=a.length; for (ii=0;ii { for (
文章浏览阅读3.2k次,点赞2次,收藏14次。下面展示一些 内联代码片。前提是用的 Visual Studio 工具你是不是把 exe 可执行文件发给好友之后,好友打开是这种情况?下面展示一些 内联代码片。就解决办法:然后_将c语言可执行程序发给别人
文章浏览阅读340次。在重装MySQL5.6.25安装到进行配置的时候,一直在等待服务的启动。如果手动在系统服务启动会提示1067错误,这个错误在网上很常见,然而我试过了很多方法均无法解决。于是看ProgramData\MySQL Server 5.6\data下的 ***.err 错误日志,看出错的部分:2015-06-04 13:08:19 5200 [Warning] InnoDB: Doublewrite do..._windows [error] innodb: header page consists of zero bytes in datafile: .\ib
文章浏览阅读482次,点赞7次,收藏8次。解决:1. 手动加入jar包2.选择自己maven仓库中存在mysql-connector3. 选择完毕后,确定使用:4. 进行测试连接_idea com.mysql:mysql-connector下载卡住
文章浏览阅读6.5k次,点赞4次,收藏30次。Java连接Redis存取数据一.相关工具二.准备工作1.启动redis2.外部连接测试3.新建连接。4.连接成功三.新建jedis项目1.新建项目2.命名项目3.引入相关jar包4.引入 junit5.新建包com.redis.test四.编写代码1.redis.properties : redis连接配置文件2.RedisPoolUtil : 连接池配置工具3.SerializeUtil : ..._redis导入导出数据java
文章浏览阅读748次。1.首先上布局文件<?xml version="1.0" encoding="utf-8"?><LinearLayout ="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="300d
文章浏览阅读311次。本文的题目其实都比较简单,但是为了学习记忆化搜索,还是要用记忆化搜索再做一遍,不要眼高手低。由于 dp 数组的无后效性,因此还可以将 dp 数组优化成两个变量。将大问题分解成子问题,即 dfs (i) 可以分解成 dfs (i - 1)对于简单的 dp 题,直接写 dp 还更简单一些,硬写记忆化搜索还有点难。因为——有些动态规划直接去想递推公式太难了,所以可以先写成记忆化搜索。由于记忆化搜索是从将大问题分解成子问题的角度去考虑的,所以会简单一些。如果读者觉得本文的题目太简单了,可以去尝试一下。_记忆化搜索和递推
文章浏览阅读336次。1、交叉编译交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例:我们在Ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上面运行的,不是在Ubuntu Linux上面运行。2、为什么要交叉编译1.有时是因为目的平台(C51)上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;2.有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;3.有时又是因为目的_交叉编译 prefix
文章浏览阅读821次。java Future模式想必大家都比较熟悉,大体实现起来也比较简单,因为模式单一,我先介绍一下一般步骤,再讲一下,目前项目中遇到具体问题的解决方式 一般来说,使用java Future模式实现多线程,具体步骤如下, 1.新建一个异步任务类,如 xxxTask 实现 Callable<xxxTask.Result>(或者Runnable<xxx>...