目录

一、数据库

二、数据类型

三、表

四、列

五、数据

六、函数

七、笛卡尔集

八、子查询

九、临时表

十、表复制

十一、合并查询

十二、外连接

十三、约束

十四、自增长

十五、索引

十六、事务

十七、隔离级别

十八、视图

十九、JDBC

1、连接数据库的5种方式

2、执行SQL语句

3、SQL注入

4、事务

5、批处理

6、连接池

7、Apache-DBUtils工具类

8、BasicDAO


一、数据库

(1)使用反引号可以规避关键字

(2)以分号结尾

(3)单行注释:-- 注释  或者  #注释        多行注释:/*  注释  */

(4)使用utf8mb4字符集,utf8mb4_bin校对规则(CHARACTER SET和CHARSET等价)

-- 创建数据库
CREATE DATABASE IF NOT EXISTS db CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;-- 删除数据库
DROP DATABASE IF EXISTS db;-- 查看数据库
SHOW DATABASES;-- 使用数据库
USE db;-- 查看当前使用的数据库
SELECT DATABASE();-- 显示数据库创建语句
SHOW CREATE DATABASE db;

二、数据类型

(1)数值类型

整型:tinyint-1个字节,smallint-2个字节,mediumint-3个字节,int-4个字节,bigint-8个字节

CREATE TABLE t1 (id TINYINT);
INSERT INTO t1 VALUES(-128);CREATE TABLE t2(id TINYINT UNSIGNED);
INSERT INTO t2 VALUES(255);

小数类型:float-4个字节,double-8个字节,decimal(M,D)(字节数取决于M和D,M是小数的位数,默认10最大65,D是小数点后面的位数,默认0最大30)

CREATE TABLE t3 (num1 FLOAT,num2 DOUBLE,num3 DECIMAL(30,20));
INSERT INTO t3 VALUES(1.234567891234,1.234567891234,1.234567891234);

(2)文本类型(字符串类型):

char(n)-最大2^8-1个字节,char(n)是定长

varchar(n)-最大2^16-1个字节,其中有1-3个用于记录内容大小,varchar(n)是变长

text-最大2^16-1个字节,mediumtext-最大2^24-1个字节,longtext-最大2^32-1个字节

CREATE TABLE t4 (sentence CHAR(4));
INSERT INTO t4 VALUES('abcd');CREATE TABLE t5(sentence VARCHAR(4));
INSERT INTO t5 VALUES('abcd');    CREATE TABLE t6(sentence TEXT);
INSERT INTO t6 VALUES('abcdefg'); 

(3)日期类型:date(年月日)-3个字节,time(时分秒)-3个字节,datetime(年月日时分秒 )-8个字节,timestamp(时间戳)-4个字节

CREATE TABLE t7 (birthday DATE,birthtime TIME,birthdaytime DATETIME,nowtime TIMESTAMPNOT NULL DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP);
INSERT INTO t7 (birthday,birthtime,birthdaytime)VALUES('2023-01-01','11:11:11','2023-01-01 11:11:11');

(4)二进制数据类型:blob-最大2^16-1,longblob-最大2^32-1

(5)bit(n):n的范围为1-64,数据范围根据n确定,查询结果按照二进制显示

CREATE TABLE t8 (num BIT(8));
INSERT INTO t8 VALUES(255);

三、表

-- 创建表
CREATE TABLE t(id INT,title VARCHAR(5))CHARSET utf8mb4 COLLATE utf8mb4_bin ENGINE INNODB;
-- 修改表名
ALTER TABLE t RENAME TO tt;
RENAME TABLE t TO tt;
-- 修改表的字符集
ALTER TABLE tt CHARSET utf8mb4;
-- 查看表
SHOW TABLES;
-- 查看表的结构
DESC tt;
-- 删除表
DROP TABLE tt;

四、列

-- 添加列
ALTER TABLE tADD content VARCHAR(5)AFTER id;
-- 修改列
ALTER TABLE t MODIFY content VARCHAR(5) NOT NULL DEFAULT '';
-- 删除列
ALTER TABLE t DROP content;
-- 修改列名和数据类型
ALTER TABLE t CHANGE title idtitle VARCHAR(10) NOT NULL DEFAULT '';

五、数据

CREATE TABLE goods(id INT,title VARCHAR(10),price DOUBLE NOT NULL DEFAULT 999);

(1)添加数据(INSERT INTO)

-- 添加数据
-- 1、数据类型相同,2、数值在规定范围内,3、位置相对应,4、字符和日期要加引号
INSERT INTO goods(id,title,price)VALUES(1,'笔记本电脑',100);
-- 5、若给所有字段添加数据,可以不写前面的字段名称
INSERT INTO goodsVALUES(2,'平板电脑',200),(3,'手机',300);
-- 6、不给某字段值时,如果允许为空,则为null,不允许为空,则添加默认值,无默认值则报错
INSERT INTO goods(id,title)VALUES(4,'手表');
-- 7、该字段值允许为空时,可以插入空值
INSERT INTO goodsVALUES(5,NULL,500);

(2)删除数据(DELETE FROM)

-- 删除数据
-- 如果没有WHERE子句,删除所有的行
DELETE FROM goodsWHERE id = 5;

(3)修改数据(UPDATE SET) 

-- 更改数据
-- 如果没有WHERE子句,更新所有的行
UPDATE goodsSET id = 4,price = 500WHERE title = '手表';
UPDATE goodsSET price = price - 100WHERE id = 4;

 (4)查找数据(SELECT FROM)

-- 1、查找所有字段
SELECT * FROM goods;
-- 2、查找指定字段
SELECT id,title FROM goods;
-- 3、消除重复行
SELECT DISTINCT * FROM goods;
-- 4、数学计算
SELECT id+price FROM goods;
-- 5、使用AS给字段起别名(AS也可以省略)
SELECT id AS 'i d' FROM goods;
SELECT id '编号',(id+price) '相加' FROM goods;
-- 6、条件查询
SELECT * FROM goodsWHERE id = 4;
SELECT * FROM goodsWHERE price >= 300;
SELECT * FROM goodsWHERE (id + price) != 404;
SELECT * FROM goodsWHERE id = 3 OR id = 5;
SELECT * FROM goodsWHERE NOT(id = 4);
SELECT id,title FROM goodsWHERE title LIKE '手%';
SELECT id,title FROM goodsWHERE title LIKE '平_电_';
SELECT * FROM goodsWHERE price BETWEEN 200 AND 400;
SELECT * FROM goodsWHERE id IN (1,2);
SELECT * FROM goodsWHERE id IS NULL;
-- 7、对查找结果进行排序(默认ASC)
SELECT * FROM goodsWHERE id > 1ORDER BY id DESC,price ASC;
SELECT (id + price) AS ip FROM goodsORDER BY ip DESC;
-- 8、分组查询
SELECT AVG(id),title FROM goods GROUP BY title;
SELECT AVG(id),title,price FROM goods GROUP BY title,price;
SELECT AVG(id) AS AI,title FROM goods GROUP BY title HAVING AI > 2;
-- 8、分页查询 limit start,rows 从start+1开始取,取rows行
SELECT * FROM goodsLIMIT 0,3;
-- 9、多子句查询顺序:group by,having,order by,limit

六、函数

(1)统计函数 

-- 统计函数
SELECT COUNT(*) FROM goods;
-- 此时不统计字段值为null的行
SELECT COUNT(id) FROM goods;
SELECT COUNT(DISTINCT id) FROM goods;

(2)字符串函数 

-- 字符串函数
-- 返回字串字符集
SELECT CHARSET(title) FROM goods;
-- 连接字串,将多个列拼接成一列
SELECT CONCAT(id,title,price) FROM goods;
-- 转换成大写
SELECT UCASE(title) FROM goods;
-- 转换成小写
SELECT LCASE(title) FROM goods;
-- 从字串左边或者右边取n个字符
SELECT LEFT(title,1) FROM goods;
SELECT RIGHT(title,1) FROM goods;
-- 统计长度
SELECT LENGTH(title) FROM goods;
-- 替换
SELECT REPLACE(title,'电脑','设备') FROM goods;
-- 从某列的的第n个位置,取m个字符
SELECT SUBSTRING(title,2,1) FROM goods;
-- 返回后者在前者中出现的位置,没有返回0
SELECT INSTR('ASD','F') FROM DUAL;
-- 比较两字串大小,相等返回0
SELECT STRCMP('A','B') FROM DUAL;
-- 去前端或者后端空格
SELECT LTRIM(' QWE ') FROM DUAL;
SELECT RTRIM(' QWE ') FROM DUAL;
SELECT TRIM(' QWE ') FROM DUAL;

(3)数学函数 

-- 数学函数
SELECT SUM(id) FROM goods;
SELECT SUM(id+price) FROM goods;
SELECT SUM(id)/COUNT(id) FROM goods;
SELECT AVG(id),MAX(id),MIN(id) FROM goods;
-- 绝对值
SELECT ABS(-1) FROM DUAL;
-- 十进制转二进制
SELECT BIN(3) FROM DUAL;
-- 十进制转十六进制
SELECT HEX(15) FROM DUAL;
-- 进制转换,如下把3从十进制转换成二进制
SELECT CONV(3,10,2) FROM DUAL;
-- 向上取整
SELECT CEILING(1.5) FROM DUAL;
-- 向下取整
SELECT FLOOR(1.5) FROM DUAL;
-- 保留小数位数,如下保留两位小数
SELECT FORMAT(1.123,2) FROM DUAL;
-- 求最小值
SELECT LEAST(1,3,5) FROM DUAL;
-- 求余
SELECT MOD(10,3) FROM DUAL;
-- 返回一个随机数,0<n<1.0,可以加一个种子,此种子返回的随机数不变
SELECT RAND() FROM DUAL;
SELECT RAND(1) FROM DUAL;

(4)时间日期函数 

-- 时间日期函数
-- 当前日期,括号可以省略
SELECT CURRENT_DATE() FROM DUAL;
-- 当前时间,括号可以省略
SELECT CURRENT_TIME() FROM DUAL;
-- 当前时间戳,括号可以省略
SELECT CURRENT_TIMESTAMP() FROM DUAL;
-- 当前时间
SELECT NOW() FROM DUAL;
-- 返回日期部分
SELECT DATE(`time`) FROM goods;
-- 返回时间部分
SELECT TIME(`time`) FROM goods;
-- 加上一个时间(year,month,day,hour,minute,second)
SELECT * FROM goodsWHERE DATE_ADD(`time`,INTERVAL 10 MINUTE) >= NOW();
-- 减去一个时间(year,month,day,hour,minute,second)
SELECT * FROM goodsWHERE DATE_SUB(`time`,INTERVAL 10 MINUTE) <= NOW();
-- 两个日期差,结果是天
SELECT DATEDIFF('2020-01-31','2020-01-30') FROM DUAL;
-- 两个时间差,结果是时分秒
SELECT TIMEDIFF('12:00:00','10:00:00') FROM DUAL;
-- 返回年月日
SELECT YEAR(NOW()) FROM DUAL;
SELECT MONTH('2022-12-1') FROM DUAL;
SELECT DAY(NOW()) FROM DUAL;
-- 返回1970-1-1到现在的毫秒数
SELECT UNIX_TIMESTAMP() FROM DUAL;
-- 把一个UNIX_TIMESTAMP秒数,转成指定格式的日期
SELECT FROM_UNIXTIME(1672221346,'%y-%m-%d %h:%i:%s') FROM DUAL;

(5)系统函数 

-- 系统函数
-- 查询用户
SELECT USER() FROM DUAL;
-- 查询数据库名称
SELECT DATABASE() FROM DUAL;
-- 为字符串算出一个MD5,32位的字符串,常用于用户密码的加密
SELECT MD5(1212) FROM DUAL;
-- 加密函数,mysql8.0移除了
SELECT PASSWORD(1212) FROM DUAL;
-- 查某个数据库的某个表
SELECT * FROM db.goods;

(6)流程控制函数 

-- 流程控制函数
SELECT IF(TRUE,1,2) FROM DUAL;
SELECT IFNULL(1,2) FROM DUAL;
SELECT CASE WHEN TRUE THEN 1 WHEN FALSE THEN 2ELSE 3 END;
SELECT CASE WHEN FALSE THEN 1 WHEN TRUE THEN 2ELSE 3 END;
SELECT CASE WHEN FALSE THEN 1 WHEN FALSE THEN 2ELSE 3 END;

七、笛卡尔集

--  1、笛卡尔集
SELECT * FROM goods,company;
SELECT * FROM goods t1,company t2WHERE t1.design = t2.id;
--  2、自连接
SELECT * FROM goods good1,goods good2;

八、子查询

--  1、单行子查询
SELECT * FROM goodsWHERE design = (SELECT design FROM goodsWHERE id = 1);
--  2、多行子查询
SELECT * FROM goodsWHERE title IN (SELECT title FROM goodsWHERE design = 11);
SELECT * FROM goodsWHERE price > ALL(SELECT price FROM goodsWHERE design = 11);
SELECT * FROM goodsWHERE price > ANY(SELECT price FROM goodsWHERE design = 11);
-- 3、多列子查询
SELECT * FROM goodsWHERE (price,design) = (SELECT price,design FROM goodsWHERE id = 1);

九、临时表

--  临时表
SELECT * FROM (SELECT * FROM goods) tempWHERE design = 11;

十、表复制

-- 表复制
CREATE TABLE goodss LIKE goods;
INSERT INTO goodssSELECT * FROM goods;
-- 自我复制
INSERT INTO goodssSELECT * FROM goodss;

十一、合并查询

-- 合并查询
-- 不去重
SELECT * FROM goods WHERE id > 1
UNION ALL
SELECT * FROM goods WHERE price < 300;
-- 去重
SELECT * FROM goods WHERE id > 1
UNION
SELECT * FROM goods WHERE price < 300;

十二、外连接

-- 外连接
-- 左外连接:左侧的表完全显示
SELECT goods.id,company.idFROM goods LEFT JOIN companyON design = company.id;
-- 右外连接:右侧的表完全显示
SELECT goods.id,company.idFROM goods RIGHT JOIN companyON design = company.id;

十三、约束

-- 约束
-- 1、主键
-- (1)一张表只能有一个主键,但可以是复合主键
-- (2)主键值不能重复且不能为null
CREATE TABLE t1(id INT PRIMARY KEY,title VARCHAR(5))
CREATE TABLE t2(id INT,title VARCHAR(5),PRIMARY KEY(id,title))
-- 2、NOT NULL
CREATE TABLE t(id INT NOT NULL DEFAULT 1,title VARCHAR(5))
-- 3、UNIQUE
-- 如果没有指定NOT NULL,可以有多个null
CREATE TABLE t(id INT UNIQUE,title VARCHAR(5))
-- 4、外键
-- (1)外键约束定义在从表上,主表必须有主键或UNIQUE约束
CREATE TABLE t1(id INT PRIMARY KEY,title VARCHAR(5))
CREATE TABLE t2(id INT PRIMARY KEY,title VARCHAR(5),num INT,FOREIGN KEY(num) REFERENCES t1(id));
-- (2)外键约束定义后,要求外键字段值必须在主表的主键字段存在或是为null
INSERT INTO t1VALUES(100,'A'),(200,'B');
INSERT INTO t2VALUES(1,'甲',100),(2,'乙',200),(3,'丙',NULL);
-- 5、CHECK
CREATE TABLE t(id INT CHECK(id < 5),title VARCHAR(5))

十四、自增长

-- 自增长
-- (1)必须是主键或者UNIQUE
CREATE TABLE t1(id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(5));
INSERT INTO t1VALUES(NULL,'A');
INSERT INTO t1 (title)VALUES('B');
-- (2)默认从1开始,也可以修改成其他值
CREATE TABLE t2(id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(5));
ALTER TABLE t2 AUTO_INCREMENT = 100;
INSERT INTO t2VALUES(NULL,'A');
INSERT INTO t2 (title)VALUES('B');
-- (3)如果指定值,以指定值为准,然后从指定值继续自增长
INSERT INTO t2 VALUES(500,'C');
INSERT INTO t2VALUES(NULL,'D');

十五、索引

-- 索引
CREATE TABLE t(id INT,title VARCHAR(5))
-- 1、添加索引
-- (1)主键索引,PRIMARY KEY,自动的为索引,或者自行添加
ALTER TABLE t ADD PRIMARY KEY(id);
-- (2)唯一索引,UNIQUE,自动的为索引,或者自行添加
CREATE UNIQUE INDEX id_index ON t(id);
-- (3)普通索引,INDEX
ALTER TABLE t ADD INDEX id_index(id);
CREATE INDEX id_index ON t(id);
-- (4)全文索引,FULLTEXT
-- 2、删除索引
-- (1)删除主键索引
ALTER TABLE t DROP PRIMARY KEY;
-- (2)删除普通索引
DROP INDEX id_index ON t;
-- 3、修改索引,先删除,再添加
-- 4、查询索引
SHOW INDEX FROM t;
SHOW INDEXES FROM t;
SHOW KEYS FROM t;

十六、事务

-- 事务
-- 1、用于保证数据的一致性,
-- 2、如果不开始事务,dml操作自动提交事务
-- 3、如果开始事务,没有创建保存点,可以执行rollback,回到事务开始的状态
-- 4、事务需要innodb引擎
-- 5、开始一个事务也可以用 SET autocommit = off
CREATE TABLE t(id INT,title VARCHAR(5));
-- 1、开始事务
START TRANSACTION;
-- 2、设置保存点
SAVEPOINT a;
-- 3、执行dml操作
INSERT INTO t VALUES (1,'A');
-- 4、回退到某个保存点
ROLLBACK TO a;
-- 5、回退全部事务
ROLLBACK;
-- 6、提交事务,所有操作生效,删除所有保存点
COMMIT;

十七、隔离级别

-- 隔离级别
-- 脏读:当一个事务读取到另一个事务尚未提交的操作时
-- 不可重复读:同一查询在同一事务中多次进行,由于其他事务提交所做的修改或删除,每次返回不同的结果集
-- 幻读:同一查询在同一事务中多次进行,由于其他事务提交所做的插入,每次返回不同的结果集
-- (1)读未提交(READ UNCOMMITTED):不加锁,会出现脏读,不可重复读,幻读
-- (2)读已提交(READ COMMITTED):不加锁,会出现不可重复读,幻读
-- (3)可重复读(REPEATABLE READ):不加锁
-- (4)可串行化(SERIALIZABLE):加锁
-- 1、查看当前会话隔离级别
SELECT @@transaction_isolation;
-- 2、查看系统当前隔离级别
SELECT @@global.transaction_isolation;
-- 3、设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- 4、设置系统当前隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

十八、视图

-- 视图
-- 1、视图是根据基表(可以是多个基表)来创建的,是虚拟的表
-- 2、视图也有列,数据来自基表
-- 3、视图的数据变化会影响到基表,基表的数据变化也会影响到视图
-- 4、视图只有结构文件,没有数据文件
-- 5、视图中可以再使用视图,数据仍然来自基表
CREATE VIEW v AS SELECT id,title FROM goods;
ALTER VIEW vASSELECT id,price FROM goods;
SHOW CREATE VIEW v;
DROP VIEW v;

十九、JDBC

1、连接数据库的5种方式

    @Testpublic void connect() throws Exception {//1、注册驱动:属于静态加载,灵活性差,依赖强Driver driver = new Driver();//2、反射机制注册驱动:属于动态加载,灵活性强,依赖弱Class c = Class.forName("com.mysql.cj.jdbc.Driver");Driver driver = (Driver) c.newInstance();String url = "jdbc:mysql://localhost:3306/db";Properties properties = new Properties();properties.setProperty("user","root");properties.setProperty("password","password");//通过driver的connect(String,Properties)方法连接Connection connection = driver.connect(url,properties);System.out.println(connection);}
    @Testpublic void connect() throws Exception {//3、使用DriverManager替代DriverClass c = Class.forName("com.mysql.cj.jdbc.Driver");Driver driver = (Driver) c.newInstance();DriverManager.registerDriver(driver);//4、使用Class.forName自动完成注册驱动,简化代码Class.forName("com.mysql.cj.jdbc.Driver");     //可以省略这一句,但建议写上String url = "jdbc:mysql://localhost:3306/db";String user = "root";String password = "password";//通过DriverManager的getConnection(String,Properties)或(String,String,String)方法连接Connection connection = DriverManager.getConnection(url, user, password);System.out.println(connection);}
    @Testpublic void connect05() throws Exception {//5、在方式4的基础上改进,增加配置文件,更加灵活Properties properties = new Properties();properties.load(new FileInputStream("src\\set.properties"));String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");String driver = properties.getProperty("driver");Class.forName(driver);      //可以省略这一句,但建议写上Connection connection = DriverManager.getConnection(url, user, password);System.out.println(connection);}

2、执行SQL语句

        Properties properties = new Properties();properties.load(new FileInputStream("src\\set.properties"));String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");String driver = properties.getProperty("driver");Class.forName(driver);Connection connection = DriverManager.getConnection(url, user, password);//statement用于执行静态SQL语句并返回其生成的结果的对象//execute返回布尔值//executeUpdate返回的是语句影响的行数//executeQuery返回的是结果集Statement statement = connection.createStatement();//增删改操作String sql1 = "delete from actor where id = 3";int i = statement.executeUpdate(sql1);System.out.println(i);//查询操作String sql2 = "select id,name from actor";ResultSet resultSet = statement.executeQuery(sql2);//ResultSet:结果集,与connection是关联的,connection关闭后,resultSet不能使用//resultSet.next(),向下移动一行,如果没有下一行,返回false//resultSet.previous(),向上移动一行,如果没有上一行,返回false//resultSet.getXxx(列的索引/列名),返回对应列的值,接收类型为Xxx//resultSet.getObject(列的索引/列名),返回对应列的值,接收类型为Objectwhile (resultSet.next()) {                 int id = resultSet.getInt(1);          //获取该行第1列String name = resultSet.getString(2);  //获取该行第2列System.out.println(id + name);}//释放资源resultSet.close();statement.close();connection.close();

3、SQL注入

(1)SQL注入:利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,恶意攻击数据库

(2)Statement存在SQL注入风险,可以使用PreparedStatement预处理防范

        Properties properties = new Properties();properties.load(new FileInputStream("src\\set.properties"));String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");String driver = properties.getProperty("driver");Class.forName(driver);Connection connection = DriverManager.getConnection(url, user, password);//PreparedStatement执行的SQL语句中的参数用问号来表示,String sql = "select id,name from actor where id = ? and name = ?";//得到PreparedStatementPreparedStatement preparedStatement = connection.prepareStatement(sql);//调用PreparedStatement对象的setXxx(占位符索引,占位符的值)方法来设置这些参数preparedStatement.setInt(1,1);preparedStatement.setString(2,"周杰伦");ResultSet resultSet = preparedStatement.executeQuery();resultSet.close();preparedStatement.close();connection.close();

4、事务

JDBC程序中,当一个Connection对象创建时,默认情况下自动提交事务,每次执行一个SQL语句时,如果执行成功,就会向数据库自动提交,不能回滚,为了让多个SQL语句作为一个整体执行,需要使用事务

        Properties properties = new Properties();properties.load(new FileInputStream("src\\set.properties"));String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");String driver = properties.getProperty("driver");Class.forName(driver);Connection connection = DriverManager.getConnection(url, user, password);//调用Connection的setAutoCommint(false)方法可以取消自动提交事务connection.setAutoCommit(false);PreparedStatement preparedStatement = null;try {String sql1 = "update actor set phone = 100 where id = 1";preparedStatement = connection.prepareStatement(sql1);preparedStatement.executeUpdate();String sql2 = "update actor set phone = 200 where id = 2";preparedStatement = connection.prepareStatement(sql2);preparedStatement.executeUpdate();//所有SQL语句都成功执行后,调用Connection的commit()方法提交事务connection.commit();} catch (SQLException e) {//在其中某个操作失败或出现异常时,调用Connection的rollback()方法回滚事务connection.rollback();throw new RuntimeException(e);} finally {preparedStatement.close();connection.close();}

5、批处理

如需使用批处理,需要在url结尾加参数?rewriteBatchedStatements=true

        Properties properties = new Properties();properties.load(new FileInputStream("src\\set.properties"));String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");String driver = properties.getProperty("driver");Class.forName(driver);Connection connection = DriverManager.getConnection(url, user, password);PreparedStatement preparedStatement = null;try {String sql = "insert into actor (id,phone) values(?,?)";preparedStatement = connection.prepareStatement(sql);for (int i = 0; i < 1000; i++) {preparedStatement.setInt(1, i);preparedStatement.setInt(2, i);//addBatch():添加需要批量处理的SQL语句或参数preparedStatement.addBatch();}//executeBatch():执行批量处理语句preparedStatement.executeBatch();//clearBatch():清空批处理包的语句preparedStatement.clearBatch();} catch (SQLException e) {throw new RuntimeException(e);} finally {preparedStatement.close();connection.close();

6、连接池

(1)预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从缓冲池中取出一个,使用完毕之后再放回去

(2)数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个

(3)当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中

        //C3PO连接池方式1Properties properties = new Properties();properties.load(new FileInputStream("src\\set.properties"));String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");String driver = properties.getProperty("driver");//创建一个数据源对象ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();//给数据源对象设置相关信息comboPooledDataSource.setJdbcUrl(url);comboPooledDataSource.setUser(user);comboPooledDataSource.setPassword(password);comboPooledDataSource.setDriverClass(driver);//初始化连接数comboPooledDataSource.setInitialPoolSize(10);//最大连接数comboPooledDataSource.setMaxPoolSize(50);//连接Connection connection = comboPooledDataSource.getConnection();//把使用的connection对象放回连接池,不是真正的断掉连接,与先前的close方法不一样connection.close();
        //C3P0连接池方式2:通过配置文件ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("数据源名称");Connection connection = comboPooledDataSource.getConnection();connection.close();
        //Druid连接池//创建Properties对象,读取配置文件Properties properties = new Properties();properties.load(new FileInputStream("src\\druid.properties"));//创建一个指定参数的数据库连接池DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);//连接Connection connection = dataSource.getConnection();//把使用的connection对象放回连接池,不是真正的断掉连接,与先前的close方法不一样connection.close();

7、Apache-DBUtils工具类

        Properties properties = new Properties();properties.load(new FileInputStream("src\\druid.properties"));DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);Connection connection = dataSource.getConnection();//QueryRunner类:封装了SQL的执行,线程安全,可以实现增删改查,批处理QueryRunner queryRunner = new QueryRunner();//query方法:执行sql语句//ResultHandler接口:用于处理java.sql.ResltSet,将数据转换成另一种形式//BeanListHandler:返回的是多行多列记录,返回集合String sql1 = "select id,name from actor where id >= ?";List<Actor> list = queryRunner.query(connection,sql1,new BeanListHandler<>(Actor.class),1);for (Actor actor : list) {System.out.println(actor);}//BeanHandler:返回的是单行记录,返回单个对象String sql2 = "select id,name from actor where id = ?";Actor actor = queryRunner.query(connection,sql2,new BeanHandler<>(Actor.class),1);System.out.println(actor);//ScalarHandler:返回的是单行单列记录,返回ObjectString sql3 = "select name from actor where id = ?";Object obj = queryRunner.query(connection,sql3,new ScalarHandler<>(),1);System.out.println(obj);//update方法:执行dml语句String sql4 = "update actor set phone = ? where id = ?";int i = queryRunner.update(connection,sql4,"100",1);System.out.println(i);//底层得到的resultSet和PreparedStatment会在query关闭connection.close();

8、BasicDAO

public class DAO<T> {  //泛型指定具体的类型private QueryRunner qr = new QueryRunner();public int update(String sql, Object... parameters) throws Exception {Properties properties = new Properties();properties.load(new FileInputStream("src\\druid.properties"));DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);Connection connection = dataSource.getConnection();int update = qr.update(connection, sql, parameters);connection.close();return update;}public List<T> queryMulti(String sql, Class<T> c, Object... parameters) throws Exception {Properties properties = new Properties();properties.load(new FileInputStream("src\\druid.properties"));DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);Connection connection = dataSource.getConnection();List<T> list = qr.query(connection, sql, new BeanListHandler<T>(c), parameters);connection.close();return list;}//单行public T querySingle(String sql, Class<T> c, Object... parameters) throws Exception {Properties properties = new Properties();properties.load(new FileInputStream("src\\druid.properties"));DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);Connection connection = dataSource.getConnection();T t = qr.query(connection, sql, new BeanHandler<T>(c), parameters);connection.close();return t;}//单行单列public Object queryScalar(String sql, Object... parameters) throws Exception {Properties properties = new Properties();properties.load(new FileInputStream("src\\druid.properties"));DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);Connection connection = dataSource.getConnection();Object o = qr.query(connection, sql, new ScalarHandler(), parameters);connection.close();return o;}
}
public class ActorDAO extends BasicDAO<Actor> {}

MYSQL、JDBC相关推荐

  1. MySQL、JDBC、HTML、CSS、JavaScript、jQuery、tomcat、Http、Servlet、JSP、EL、JSTL、Maven、Cookie、Session(框架第一部分)

    第一章 MySQL 一 .数据库 1.什么是数据库? 所谓的数据库就是指存储和管理数据的仓库 2.数据库有哪些分类? 3.什么是关系型数据库? 底层以二维表的形式保存数据的库就是关系型数据库 stu- ...

  2. Clickhouse外部储存表引擎(HDFS、MySQL、JDBC、Kafka、File)

    目录 1. HDFS表引擎 1.1 准备工作 1.2 HDFS表负责读写 1.3 HDFS表负责读, 不负责写 2. MySQL表引擎 2.1 表引擎的基本操作 2.2 表引擎配合物化视图 3. JD ...

  3. mysql opendrowset,java,mysql、jdbc

    下載完後,會有個壓縮檔,資料夾是mysql-connector-java-8.0.17,檔案有: 新版本的mysql-connector-java-8.0.17.jar檔案跟之前版本的mysql-co ...

  4. Spring配置JDBC连接Orcale、MySql、sqlserver

    阅读指南:本文章主要讲述如何在Spring框架中配置JDBC连接方式连接Oracle.Mysql.SqlServer. 原理如下: 一.导包 连接oracle11g所需的jar包:ojdbc6.jar ...

  5. JDBC常用连接写法(包括MySQL、Oracle、Sybase、SQLServer、DB2)

    本文引用自CKJ-CLARK<JDBC常用连接写法(包括MySQL.Oracle.Sybase.SQLServer.DB2)> http://apps.hi.baidu.com/share ...

  6. JDBC连接mysql、创建表、操作数据、PreparedStatement防注入、sql语句返回值类型知识汇总

    JDBC连接过程: import java.sql.*;/*** Description:* Created by CWG on 2020/10/29 21:05*/ public class Con ...

  7. mysql事务与jdbc事务_事务(mysql事务、jdbc事务)

    一.MYSQL事务 1.事务 概念:事务是一个用户定义的数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位.事务可以是一条sql语句,一组sqi语句或者整个程序. 特性(ACDI): ...

  8. 使用RDS for MySQL数据库(本地连接、数据库迁移、JDBC操作)

    一.阿里云RDS介绍 什么是阿里云数据库RDS 阿里云关系型数据库(Relational Database Service,简称RDS)是一种稳定可靠.可弹性伸缩的在线数据库服务.基于阿里云分布式文件 ...

  9. JDBC——java连接mysql、hive、hbase教程

    JDBC模板 一.准备工作 1.1.创建Maven工程 1.2.修改pom文件 1.3.修改Project Structure 1.4.修改Settings 1.5.资源文件夹 二.Java连接mys ...

最新文章

  1. fun函数是什么php,c语言fun函数有什么例题?
  2. 2019.01.07|区块链技术头条
  3. 【Java】6.6 Java 8 改进的结构
  4. memcached安装运行
  5. 使用Jenkins来发布和代理.NetCore项目
  6. 给定4个数字组合的C语言算法,leetcode 454. 四数相加 II c语言
  7. KMP算法详解P3375 【模板】KMP字符串匹配题解
  8. python计算两个数的最大公约数和最小公倍数
  9. android键盘事件
  10. 媒体化战略:数字时代企业如何做好公关与内容营销
  11. shell历史命令记录功能
  12. 实习之路0--设计模式之策略模式的理解(鸭子类例子)
  13. 平面解析几何----圆锥曲线焦点弦上焦半径的倒数和为ep分之2的初等几何证明
  14. Paintinglite迎来v2.1.2优化版本迭代,引入Pod安装
  15. python莫比乌斯内接矩形_用莫比乌斯带巧解内接矩形问题:拓扑学的用处
  16. 最新最全移动端界面设计UI尺寸规范-2018年初版
  17. Life feelings--8--愉悦的做技术--将实验当做一种快乐
  18. 生成对抗网络的发展与应用
  19. default默认值 unique单列唯一和联合唯一 primary key主键 auto_increment自增 外键foregin key 表与表之间关系
  20. 字节跳动测试岗面试跪在二面,复盘失败原因决定再战一次

热门文章

  1. 实验八 Python文件处理
  2. 得物数据抓取+参数加密解析
  3. moviepy中视频读写与预览
  4. mysql 立方根函数_Java实现牛顿迭代法求解平方根、立方根
  5. PopupMenu弹出位置的控制
  6. matlab 曲线 标注,请问关于Matlab曲线标注问题
  7. 使用Navicat快速复制所有表的表名或字段名
  8. 有什么真无线蓝牙耳机推荐?2022蓝牙耳机全球排行榜
  9. UOS服务器操作系统部署EKL
  10. signature=c751019741e6bb1ccbac4e13ac0b26c4,James Boswell