MySql学习笔记

  • 1.数据引擎:InnoDB和MYISAM的区别
    • 1.1 SQL语句分类
  • 2.修改和删除表
  • 3.SQL数据管理
    • 3.1 DML语言
    • 3.2 添加
    • 3.3 修改
    • 3.4 删除
    • 3.5 数据库外键
    • 3.6 约束
  • 4.DQL查询数据(重点)
    • 4.1 DQL(Data Query Language)
    • 4.2 指定查询字段
    • 4.3 where条件子句
    • 4.4 联表查询
    • 4.5 分页和排序
    • 4.6 子查询
    • 4.7 分组和过滤
    • 4.8 select小结
  • 5.MySQL函数
    • 5.1 常用函数
    • 5.2 聚合函数(常用)
    • 5.3 数据库级别的MD5加密(扩展)
  • 6.事务
    • 6.1 事务的隔离级别
  • 7.索引
    • 7.1 索引的种类
    • 7.2 测试索引
    • 7.3 索引原则
    • 7.4 索引的失效
  • 8.权限管理和备份
    • 8.1 用户管理
    • 8.2 MySQL 备份
  • 9.规范数据库设计
    • 9.1 为什么要设计
    • 9.2 三大范式
    • 9.3 视图(view)
  • 10.JDBC(重点)
    • 10.1 数据库驱动
    • 10.2 JDBC
    • 10.3 第一个JDBC程序
    • 10.4 statement对象
    • 10.5 Preparedstatement对象
    • 10.6 使用IDEA连接数据库
    • 10.7 事务
    • 10.8 数据库连接池
    • 10.9 悲观(行级)锁和乐观锁
  • 34道作业题

1.数据引擎:InnoDB和MYISAM的区别

MYISAM InnoDB
事务支持 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
全文索引 支持 不支持
表空间大小 较小 较大,约为2倍

MYISAM: 节约空间,速度较快
InnoDB: 安全性高,事务的处理,多表多用户的操作

1.1 SQL语句分类

2.修改和删除表

3.SQL数据管理

3.1 DML语言

3.2 添加

Insert 命令


注意事项:
1.字段和字段之间使用 英文逗号 隔开
2.字段是可以省略的,但是后面的值必须要一一对应,不能少
3.可以同时插入多条数据,VALUES后面的值,需要使用,隔开即可VALUES()()

3.3 修改

update 修改谁 (条件) set原来的值=新值

-- 修改学生信息 update
UPDATE `student1` SET  `name`='ss' WHERE id=1;
-- 语法:
UPDATE 表名 set colnum_name = value,[colnum_name = value,...] where[条件]


条件: 不等于:<> 或!=
在什么之间: between… and…

3.4 删除

delete 命令

语法:delete from 表名 [where 条件]

TRUNCATE 命令

作用:完全清空一个数据库表,表的结构和索引约束不会变!

Delete 和 TRUNCATE 的区别

  • 相同点: 都能删除数据,都不会删除表结构
  • 不同点:
    • TRUNCATE 重新设置 自增列 计数器会归零
    • TRUNCATE 不会影响事务

3.5 数据库外键

方法一:在创建表后添加 外键约束

CREATE TABLE `grade`(`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年纪id',`gradename` VARCHAR(50) NOT NULL COMMENT '年纪名称',PRIMARY KEY (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8CREATE TABLE IF NOT EXISTS `student1`(`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',·name· VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',`gradeid` INT(10) NOT NULL COMMENT '学生年纪',PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8ALTER TABLE `student1`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);

方法二:在创建表的时候直接添加 外键约束。(麻烦,比较复杂)

不得使用外键和级联,一切外键概念必须在应用层解决
每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便。

3.6 约束

非空约束: not null
唯一性约束: unique
主键约束: primary key (简称PK)
外键约束: foreign key(简称FK)
检查约束: check(mysql不支持,oracle支持)

非空约束not null约束的字段不能为NULL。
唯一性约束unique约束的字段不能重复,但是可以为NULL。
主键约束(primary key,简称PK)主键的特征:not null + unique(主键值不能是NULL,同时也不能重复!)
外键约束(foreign key,简称FK)
思考:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?
不一定是主键,但至少具有uniqu e约 束。
测试:外键可以为NULL吗?
外键值可以为NULL。

4.DQL查询数据(重点)

4.1 DQL(Data Query Language)


4.2 指定查询字段


语法:SELECT 字段,... FROM 表
有的时候,列名字不是那么的见名知意。我们起别名 AS 字段名 as 别名 表名 as 别名

去重 disctinct

数据库的列 (表达式)

4.3 where条件子句

作用:检索数据中 符合条件 的值
搜索的条件由一个或者多个表达式组成! 结果 布尔值

逻辑运算符


模糊查询:比较运算符



4.4 联表查询

JOIN 对比

-- join (连接的表) on (判断的条件)  连接查询
-- where 等值查询-- inner join
SELECT s.studentno,studentname,subjectno,studentresult
FROM student AS s
INNER JOIN result AS r
ON s.studentno = r.studentno-- right join
SELECT s.studentno,studentname,subjectno,studentresult
FROM student AS s
RIGHT JOIN result AS r
ON s.studentno = r.studentno-- left join
SELECT s.studentno,studentname,subjectno,studentresult
FROM student AS s
INNER JOIN result AS r
ON s.studentno = r.studentno-- 查询参加考试的学生学号,学生名字,科目名字,学生成绩
SELECT s.studentno,studentname,subjectname,studentresult
FROM student s
RIGHT JOIN result r
ON s.studentno=r.studentno
LEFT JOIN `subject` sub
ON r.subjectno=sub.subjectno


自连接

自己的表和自己的表连接,核心:一张表拆为两张一样的表即可


-- 查询父子信息:把一张表看成两个一摸一样的表
SELECT a.categoryname AS '父栏目',b.categoryname AS '子栏目'
FROM `category` AS a,`category` AS b
WHERE a.categoryid=b.pid

4.5 分页和排序

排序 Ooder by


查询员工名字和薪资,要求按照薪资升序,如果薪资一样的话,
再按照名字升序排列。

SELECT ename,sal
FROM emp
ORDER BY
sal ASC, ename ASC;
-- sal在前,起主导,只有sal相等的时候,才会考虑启用ename排序。

分页 limit

完整用法:limit startIndex, length
startIndex是起始下标,length是长度。
起始下标从0开始。
缺省用法:limit 5; 这是取前5

SELECT * FROM result
LIMIT 1,5

4.6 子查询

where (这个值是计算出来的)
本质:在where语句中嵌套一个子查询语句

-- 1、查询数据库结构-1的所有考试结果(学号,科目编号,成绩),降序排列
-- 方式一:使用连接查询
SELECT studentno,r.subjectno,studentresult
FROM result r
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno
WHERE subjectname='高等数学-1'
ORDER BY studentresult DESC-- 方式二:使用子查询()
SELECT studentno,r.subjectno,studentresult
FROM result r
WHERE subjectno=(
SELECT subjectno
FROM `subject` s
WHERE subjectname='高等数学-1'
)
ORDER BY studentresult DESC-- 2.查询课程为高等数学-1且分数不小于80的同学的学号和姓名
-- 方式一:使用连接查询
SELECT s.studentno,studentname
FROM student s
INNER JOIN result r
ON s.studentno=r.studentno
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno
WHERE subjectname='高等数学-1' AND studentresult>80-- 方式二:使用子查询()
SELECT s.studentno,studentname
FROM student s
INNER JOIN result r
ON s.studentno=r.studentno
WHERE studentresult>80 AND subjectno=(
SELECT subjectno
FROM `subject`
WHERE subjectname='高等数学-1'
)-- 改造 多重嵌套
SELECT  studentno,studentname FROM student WHERE studentno IN(
SELECT studentno FROM result WHERE studentresult>80 AND subjectno=(SELECT subjectno FROM `subject` WHERE subjectname='高等数学-1'
)
)

4.7 分组和过滤

分组 group by 过滤 having

4.8 select小结

5.MySQL函数

5.1 常用函数


str_to_date: 将字符串varchar类型转换成date类型
date_format: 将date类型转换成具有一定格式的varchar字符串类型。


5.2 聚合函数(常用)


ifnull函数

5.3 数据库级别的MD5加密(扩展)

什么是MD5?
主要增强算法复杂度和不可逆性。
MD5不可逆,具体的值的md5是一样的
MD5破解网站的原理,背后有一个字典,MD5加密后的值,加密前的值

6.事务

要么都成功,要么都失败
将一组SQL放在一各批次去执行

事务原则:ACID原则

隔离所导致的一些问题


模拟场景

6.1 事务的隔离级别

A教室和B教室中间有一道墙,这道墙可以很厚,也可以很薄。这就是事务的隔离级别。
这道墙越厚,表示隔离级别就越高。
事务和事务之间的隔离级别有哪些呢?4个级别

 读未提交:read uncommitted(最低的隔离级别)《没有提交就读到了》什么是读未提交?事务A可以读取到事务B未提交的数据。这种隔离级别存在的问题就是:脏读现象!(Dirty Read)我们称读到了脏数据。这种隔离级别一般都是理论上的,大多数的数据库隔离级别都是二档起步!读已提交:read committed《提交之后才能读到》什么是读已提交?事务A只能读取到事务B提交之后的数据。这种隔离级别解决了什么问题?解决了脏读的现象。这种隔离级别存在什么问题?不可重复读取数据。什么是不可重复读取数据呢?在事务开启之后,第一次读到的数据是3条,当前事务还没有结束,可能第二次再读取的时候,读到的数据是4条,3不等于4称为不可重复读取。这种隔离级别是比较真实的数据,每一次读到的数据是绝对的真实。oracle数据库默认的隔离级别是:read committed可重复读:repeatable read《提交之后也读不到,永远读取的都是刚开启事务时的数据》什么是可重复读取?事务A开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的。即使事务B将数据已经修改,并且提交了,事务A读取到的数据还是没有发生改变,这就是可重复读。可重复读解决了什么问题?解决了不可重复读取数据。可重复读存在的问题是什么?可以会出现幻影读。每一次读取到的数据都是幻象。不够真实!早晨9点开始开启了事务,只要事务不结束,到晚上9点,读到的数据还是那样!读到的是假象。不够绝对的真实。mysql中默认的事务隔离级别就是这个!!!!!!!!!!!序列化/串行化:serializable(最高的隔离级别)这是最高隔离级别,效率最低。解决了所有的问题。这种隔离级别表示事务排队,不能并发!synchronized,线程同步(事务同步)每一次读取到的数据都是最真实的,并且效率是最低的。

7.索引

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。
提取句子主干,就可以得到索引的本质:索引是数据结构。

7.1 索引的种类

在一个表中,主键索引只能有一个,唯一索引可以有多个


唯一索引的列中数据不能重复

7.2 测试索引

CREATE TABLE `app_user` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) DEFAULT'' COMMENT'用户昵称',
`email` VARCHAR(50) NOT NULL COMMENT'用户邮箱',
`phone` VARCHAR(20) DEFAULT'' COMMENT'手机号',
`gender` TINYINT(4) UNSIGNED DEFAULT '0'COMMENT '性别(0:男;1:女)',
`password` VARCHAR(100) NOT NULL COMMENT '密码',
`age` TINYINT(4) DEFAULT'0'  COMMENT '年龄',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT = 'app用户表'-- 插入100万数据.
DELIMITER $$
-- 写函数之前必须要写,标志
CREATE FUNCTION mock_data1 ()
RETURNS INT DETERMINISTIC
BEGINDECLARE num INT DEFAULT 1000000;DECLARE i INT DEFAULT 0;WHILE i<num DOINSERT INTO `app_user`(`name`,`email`,`phone`,`gender`,`password`)VALUES(CONCAT('用户',i),'19224305@qq.com','123456789',FLOOR(RAND()*2),UUID());SET i=i+1;END WHILE;RETURN i;
END;SELECT mock_data1() -- 执行此函数 生成一百万条数据


索引在小数据量的时候,用处不大,但数据量很大时,效率速度更快

7.3 索引原则

7.4 索引的失效

索引有失效的时候,什么时候索引失效呢?

失效的第1种情况:select * from emp where ename like '%T';ename上即使添加了索引,也不会走索引,为什么?原因是因为模糊匹配当中以“%”开头了!尽量避免模糊查询的时候以“%”开始。这是一种优化的手段/策略。mysql> explain select * from emp where ename like '%T';+----+-------------+-------+------+---------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |+----+-------------+-------+------+---------------+------+---------+------+------+-------------+|  1 | SIMPLE      | emp   | ALL  | NULL          | NULL | NULL    | NULL |   14 | Using where |+----+-------------+-------+------+---------------+------+---------+------+------+-------------+失效的第2种情况:使用or的时候会失效,如果使用or那么要求or两边的条件字段都要有索引,才会走索引,如果其中一边有一个字段没有索引,那么另一个字段上的索引也会实现。所以这就是为什么不建议使用or的原因。mysql> explain select * from emp where ename = 'KING' or job = 'MANAGER';+----+-------------+-------+------+-----------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys   | key  | key_len | ref  | rows | Extra       |+----+-------------+-------+------+-----------------+------+---------+------+------+-------------+|  1 | SIMPLE      | emp   | ALL  | emp_ename_index | NULL | NULL    | NULL |   14 | Using where |+----+-------------+-------+------+-----------------+------+---------+------+------+-------------+失效的第3种情况:使用复合索引的时候,没有使用左侧的列查找,索引失效什么是复合索引?两个字段,或者更多的字段联合起来添加一个索引,叫做复合索引。create index emp_job_sal_index on emp(job,sal);mysql> explain select * from emp where job = 'MANAGER';+----+-------------+-------+------+-------------------+-------------------+---------+-------+------+-------------+| id | select_type | table | type | possible_keys     | key               | key_len | ref   | rows | Extra       |+----+-------------+-------+------+-------------------+-------------------+---------+-------+------+-------------+|  1 | SIMPLE      | emp   | ref  | emp_job_sal_index | emp_job_sal_index | 30      | const |    3 | Using where |+----+-------------+-------+------+-------------------+-------------------+---------+-------+------+-------------+mysql> explain select * from emp where sal = 800;+----+-------------+-------+------+---------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |+----+-------------+-------+------+---------------+------+---------+------+------+-------------+|  1 | SIMPLE      | emp   | ALL  | NULL          | NULL | NULL    | NULL |   14 | Using where |+----+-------------+-------+------+---------------+------+---------+------+------+-------------+失效的第4种情况:在where当中索引列参加了运算,索引失效。mysql> create index emp_sal_index on emp(sal);explain select * from emp where sal = 800;+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+| id | select_type | table | type | possible_keys | key           | key_len | ref   | rows | Extra       |+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+|  1 | SIMPLE      | emp   | ref  | emp_sal_index | emp_sal_index | 9       | const |    1 | Using where |+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+mysql> explain select * from emp where sal+1 = 800;+----+-------------+-------+------+---------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |+----+-------------+-------+------+---------------+------+---------+------+------+-------------+|  1 | SIMPLE      | emp   | ALL  | NULL          | NULL | NULL    | NULL |   14 | Using where |+----+-------------+-------+------+---------------+------+---------+------+------+-------------+失效的第5种情况:在where当中索引列使用了函数explain select * from emp where lower(ename) = 'smith';+----+-------------+-------+------+---------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |+----+-------------+-------+------+---------------+------+---------+------+------+-------------+|  1 | SIMPLE      | emp   | ALL  | NULL          | NULL | NULL    | NULL |   14 | Using where |+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

8.权限管理和备份

8.1 用户管理

SQL命令操作

用户表:mysql.user
本质:读这张表进行增删改查

8.2 MySQL 备份

9.规范数据库设计

9.1 为什么要设计

9.2 三大范式

三大范式

第一范数(1NF)
原子性︰保证每一列不可再分

第二范数(2NF)
前提:满足第一范式
每张表只描述一件事情

第三范数(3NF)
前提:满足第一范式和第二范式
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

9.3 视图(view)

我们可以面向视图对象进行增删改查,对视图对象的增删改查,会导致原表被操作!(视图的特点:通过对视图的操作,会影响到原表数据。)

创建视图对象:create view dept2_view as select * from dept2;删除视图对象:drop view dept2_view;注意:只有DQL语句才能以view的形式创建。create view view_name as 这里的语句必须是DQL语句;

10.JDBC(重点)

10.1 数据库驱动

10.2 JDBC

SUN公司为了简化开发人员的(对数据库的统一)操作,提供了一个(Java操作数据库的)规范,俗称JDBC
这些规范的实现由具体的厂商去做~
对于开发人员来说,我们只需要掌握JDBC接口的操作即可!

java.sql Javax.sql
还需要导入一个数据库驱动包 mysql-connector-java-5.1.47.jar

10.3 第一个JDBC程序

测试代码

package com.kuang.lesson01;import java.sql.*;public class jdbctest {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.加载驱动Class.forName("com.mysql.jdbc.Driver");//2.用户信息和urLString url="jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=true";String username="root";String password="123456";//3.连接成功,数据库对象 Connection是数据库Connection connection=DriverManager.getConnection(url,username,password);//4.执行SQL的对象Statement statement=connection.createStatement();//5.执行SQL的对象 去执行SQL,存在结果,查看结果String sql="SELECT * FROM users";ResultSet resultSet=statement.executeQuery(sql);while(resultSet.next()){System.out.println("id="+resultSet.getObject("id"));System.out.println("name="+resultSet.getObject("NAME"));System.out.println("pwd="+resultSet.getObject("PASSWORD"));System.out.println("email="+resultSet.getObject("email"));System.out.println("birth="+resultSet.getObject("birthday"));System.out.println("======================================");}//6.释放连接resultSet.close();statement.close();connection.close();}
}

步骤总结:
1、加载驱动
2、连接数据库 DriverManager
3、获得执行sql的对象Statement
4、获得返回的结果集
5、释放连接



10.4 statement对象

代码实现

1.提取工具类

package com.kuang.lesson02.utlis;import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;public class jdbcUtils {private static String driver=null;private static String url =null;private static String username =null;private static String password =null;static {try {InputStream inputStream=jdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");Properties properties=new Properties();properties.load(inputStream);driver=properties.getProperty("driver");url=properties.getProperty("url");username=properties.getProperty("username");password=properties.getProperty("password");//1.驱动只用加载一次Class.forName(driver);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}//获取连接public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url,username,password);}//释放连接资源public static void release(Connection conn, Statement sta, ResultSet res) throws SQLException {if(res!=null) res.close();if(sta!=null) sta.close();if(conn!=null) conn.close();}
}

2.编写增删改查的方法

package com.kuang.lesson02;import com.kuang.lesson02.utlis.jdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class TestInsert {public static void main(String[] args) throws SQLException {Connection connection= null;//获取数据库连接Statement statement=null;ResultSet resultSet=null;try {connection = jdbcUtils.getConnection();statement=connection.createStatement();//获取SQL的执行对象String sql="INSERT INTO users(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)" +"VALUES(4,'ss','123456','eqwe@qq.com','2020-01-01')";//增删查executeUpdate/*int i=statement.executeUpdate(sql);if(i>0){System.out.println("插入成功!");}*///查询executeQueryresultSet =statement.executeQuery(sql);while(resultSet.next()){System.out.println("id="+resultSet.getObject("id"));System.out.println("name="+resultSet.getObject("NAME"));System.out.println("pwd="+resultSet.getObject("PASSWORD"));System.out.println("email="+resultSet.getObject("email"));System.out.println("birth="+resultSet.getObject("birthday"));System.out.println("======================================");}} catch (SQLException e) {e.printStackTrace();} finally {jdbcUtils.release(connection,statement,resultSet);}}
}

SQL注入的问题

sql存在漏洞,会被攻击导致数据泄露
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

package com.kuang.lesson02;import com.kuang.lesson02.utlis.jdbcUtils;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class SQL注入 {public static void main(String[] args) throws SQLException {login(" 'or '1=1"," 'or '1=1");}public static void login(String username,String password) throws SQLException {Connection connection= null;//获取数据库连接Statement statement=null;ResultSet resultSet=null;try {connection = jdbcUtils.getConnection();statement=connection.createStatement();//获取SQL的执行对象String sql="INSERT INTO users(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)" +"VALUES(4,'ss','123456','eqwe@qq.com','2020-01-01')";String sql1="select * from users where `NAME`='"+username+"' AND `PASSWORD`='"+password+"'";//增删查executeUpdate/*int i=statement.executeUpdate(sql);if(i>0){System.out.println("插入成功!");}*///查询executeQueryresultSet =statement.executeQuery(sql1);while(resultSet.next()){System.out.println("id="+resultSet.getObject("id"));System.out.println("name="+resultSet.getObject("NAME"));System.out.println("pwd="+resultSet.getObject("PASSWORD"));System.out.println("email="+resultSet.getObject("email"));System.out.println("birth="+resultSet.getObject("birthday"));System.out.println("======================================");}} catch (SQLException e) {e.printStackTrace();}finally {jdbcUtils.release(connection,statement,resultSet);}}
}

10.5 Preparedstatement对象

Preparedstatement可以防止SQL注入,效率更高。

package com.kuang.lesson03;import com.kuang.lesson02.utlis.jdbcUtils;import java.sql.*;public class TestPreparedStatement {public static void main(String[] args) throws SQLException {Connection connection=null;PreparedStatement preparedStatement=null;try {connection= jdbcUtils.getConnection();//区别//使用? 占位符代替参数String sql="INSERT INTO users(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)values(?,?,?,?,?)";preparedStatement=connection.prepareStatement(sql); //预编译SQL,先写sql,然后不执行//手动给参数赋值preparedStatement.setInt(1,4);preparedStatement.setString(2,"ssmb");preparedStatement.setString(3,"123456");preparedStatement.setString(4,"ssmb@qq.com");preparedStatement.setString(5, String.valueOf(new Date(new java.util.Date().getTime())));//执行int i=preparedStatement.executeUpdate();if(i>0){System.out.println("插入成功!");}} catch (SQLException e) {e.printStackTrace();}finally {jdbcUtils.release(connection,preparedStatement,null);}}
}

SQL注入

package com.kuang.lesson02;import com.kuang.lesson02.utlis.jdbcUtils;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class SQL注入 {public static void main(String[] args) throws SQLException {login(" ''or 1=1"," '' or 1=1");}public static void login(String username,String password) throws SQLException {Connection connection= null;//获取数据库连接PreparedStatement preparedStatement=null;ResultSet resultSet=null;try {connection = jdbcUtils.getConnection();String sql="select * from users where `NAME`=? AND `PASSWORD`=?";preparedStatement=connection.prepareStatement(sql);preparedStatement.setString(1,username);preparedStatement.setString(2,password);resultSet=preparedStatement.executeQuery();//查询executeQueryresultSet =statement.executeQuery(sql1);while(resultSet.next()){System.out.println("id="+resultSet.getObject("id"));System.out.println("name="+resultSet.getObject("NAME"));System.out.println("pwd="+resultSet.getObject("PASSWORD"));System.out.println("email="+resultSet.getObject("email"));System.out.println("birth="+resultSet.getObject("birthday"));System.out.println("======================================");}} catch (SQLException e) {e.printStackTrace();}finally {jdbcUtils.release(connection,statement,resultSet);}}
}

Statement和Preparedstatement的区别

10.6 使用IDEA连接数据库

10.7 事务

要么都成功,要么都失败

代码实现

package com.kuang.lesson04;import com.kuang.lesson02.utlis.jdbcUtils;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class TestTransaction {public static void main(String[] args) throws SQLException {Connection connection=null;PreparedStatement st=null;ResultSet resultSet=null;try {connection=jdbcUtils.getConnection();//关闭数据库的自动提交,自动会开启事务connection.setAutoCommit(false);//开启事务String sql1="update account set money=money-500 where name='A' ";st=connection.prepareStatement(sql1);st.executeUpdate();int i=1/0;//失败String sql2="update account set money=money+500 where name='B' ";st=connection.prepareStatement(sql2);st.executeUpdate();//业务完毕,提交事务connection.commit();System.out.println("成功!");} catch (SQLException e) {//如果失败,则默认回滚/*try {connection.rollback();} catch (SQLException ex) {ex.printStackTrace();}*/e.printStackTrace();}finally {jdbcUtils.release(connection,st,resultSet);}}
}

10.8 数据库连接池

数据库连接—执行完毕—释放
连接—释放 十分浪费资源
池化技术:准备一些预先的资源,过来就连接预先准备好的资源

编写连接池,实现一个接口 DataSource

开源数据源实现(拿来即用)

DBCP
C3P0
Druid:阿里巴巴
使用了这些数据库连接池之后,我们在项目开发中就不需要编写连接数据库的代码了!

DBCP

package com.kuang.lessons05.utils;import com.kuang.lesson02.utlis.jdbcUtils;
import org.apache.commons.dbcp.BasicDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;public class jdbcUtils_DBCP {private static DataSource dataSource=null;static {try {InputStream inputStream= jdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");Properties properties=new Properties();properties.load(inputStream);//创建数据源 工厂模式dataSource=BasicDataSourceFactory.createDataSource(properties);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}//获取连接public static Connection getConnection() throws SQLException {return dataSource.getConnection();//从数据源中获取连接}//释放连接资源public static void release(Connection conn, Statement sta, ResultSet res) throws SQLException {if(res!=null) res.close();if(sta!=null) sta.close();if(conn!=null) conn.close();}
}============================test DBCP============================
public class TestDBCP {public static void main(String[] args) throws SQLException {Connection connection=null;PreparedStatement preparedStatement=null;try {connection= jdbcUtils_DBCP.getConnection();//区别//使用? 占位符代替参数String sql="INSERT INTO users(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)values(?,?,?,?,?)";preparedStatement=connection.prepareStatement(sql); //预编译SQL,先写sql,然后不执行//手动给参数赋值preparedStatement.setInt(1,5);preparedStatement.setString(2,"ssmb");preparedStatement.setString(3,"123456");preparedStatement.setString(4,"ssmb@qq.com");preparedStatement.setString(5, String.valueOf(new Date(new java.util.Date().getTime())));//执行int i=preparedStatement.executeUpdate();if(i>0){System.out.println("插入成功!");}} catch (SQLException e) {e.printStackTrace();}finally {jdbcUtils_DBCP.release(connection,preparedStatement,null);}}
}

C3P0

package com.kuang.lessons05.utils;import com.kuang.lesson02.utlis.jdbcUtils;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;public class jdbcUtils_c3p0 {private static DataSource dataSource=null;static {try {//创建数据源 工厂模式dataSource= new ComboPooledDataSource("MySQL");} catch (Exception e) {e.printStackTrace();}}//获取连接public static Connection getConnection() throws SQLException {return dataSource.getConnection();//从数据源中获取连接}//释放连接资源public static void release(Connection conn, Statement sta, ResultSet res) throws SQLException {if(res!=null) res.close();if(sta!=null) sta.close();if(conn!=null) conn.close();}}============================test C3P0============================
public class TestC3P0 {public static void main(String[] args) throws SQLException {Connection connection=null;PreparedStatement preparedStatement=null;try {connection= jdbcUtils_c3p0.getConnection();//区别//使用? 占位符代替参数String sql="INSERT INTO users(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)values(?,?,?,?,?)";preparedStatement=connection.prepareStatement(sql); //预编译SQL,先写sql,然后不执行//手动给参数赋值preparedStatement.setInt(1,6);preparedStatement.setString(2,"ssmb");preparedStatement.setString(3,"123456");preparedStatement.setString(4,"ssmb@qq.com");preparedStatement.setString(5, String.valueOf(new Date(new java.util.Date().getTime())));//执行int i=preparedStatement.executeUpdate();if(i>0){System.out.println("插入成功!");}} catch (SQLException e) {e.printStackTrace();}finally {jdbcUtils_c3p0.release(connection,preparedStatement,null);}}
}

10.9 悲观(行级)锁和乐观锁

34道作业题

SELECT ename,sal*12 yearsal FROM emp
SELECT ename,sal
FROM emp
ORDER BY
sal ASC, ename ASC; -- sal在前,起主导,只有sal相等的时候,才会考虑启用ename排序。SELECT ROUND(RAND()*100,0) FROM emp SELECT ename, sal + comm AS salcomm FROM emp;SELECT ename, (sal + IFNULL(comm,0))*12 AS salcomm FROM emp;SELECT ename,job,
(CASE job WHEN 'MANAGER' THEN SAL*1.1 WHEN 'SALESMAN' THEN SAL*1.5 ELSE SAL END) AS newsal
FROM empSELECT e.ename,e.sal,s.grade
FROM emp e
INNER JOIN salgrade s
ON e.sal BETWEEN s.losal AND s.hisalSELECT a.ename '员工名',b.ename '领导名'
FROM emp a
JOIN emp b
ON a.mgr=b.empno=====================  作业题  ====================-- 1、取得每个部门最高薪水的人员名称
SELECT ename,t.*
FROM emp e
JOIN (SELECT deptno,MAX(sal) maxsal FROM emp GROUP BY deptno) t
ON e.deptno=t.deptno AND e.sal=t.maxsal-- 2、哪些人的薪水在部门的平均薪水之上
SELECT ename,sal
FROM emp e
JOIN (SELECT deptno,AVG(sal) avgsal FROM emp GROUP BY deptno) t
ON e.deptno=t.deptno AND sal>t.avgsal-- 3.取得部门中(所有人的)平均的薪水等级,
SELECT deptno,AVG(sal),AVG(s.grade)
FROM emp e
JOIN salgrade s
ON e.sal BETWEEN s.losal AND s.hisal
GROUP BY deptno-- 4、不准用组函数(Max),取得最高薪水(给出两种解决方案)
SELECT sal
FROM emp
ORDER BY sal DESC
LIMIT 1SELECT sal FROM emp
WHERE sal NOT IN( SELECT DISTINCT a.sal
FROM emp a
JOIN emp b
ON a.sal<b.sal
)-- 5、取得平均薪水最高的部门的部门编号(至少给出两种解决方案)
SELECT deptno,AVG(sal) avgsal
FROM emp
GROUP BY deptno
ORDER BY avgsal DESC
LIMIT 1SELECT deptno,AVG(sal) avgsal
FROM emp
GROUP BY deptno
HAVING  avgsal=(SELECT MAX(t.avgsal) FROM (SELECT deptno,AVG(sal) avgsal FROM emp GROUP BY deptno)t
)-- 6、取得平均薪水最高的部门的部门名称
SELECT e.deptno,AVG(sal) avgsal,d.dname
FROM emp e
JOIN dept d
ON e.deptno=d.deptno
GROUP BY deptno
HAVING  avgsal=(SELECT MAX(t.avgsal) FROM (SELECT deptno,AVG(sal) avgsal FROM emp GROUP BY deptno)t
)SELECT e.deptno,AVG(sal) avgsal,d.dname
FROM emp e
JOIN dept d
ON e.deptno=d.deptno
GROUP BY deptno
ORDER BY avgsal DESC
LIMIT 1-- 7、求平均薪水的等级最低的部门的部门名称SELECT e.deptno,AVG(grade) avggrade,d.dname
FROM emp e
JOIN salgrade s
ON e.sal BETWEEN s.losal AND s.hisal
JOIN dept d
ON e.deptno=d.deptno
GROUP BY deptno
ORDER BY avggrade
LIMIT 1SELECT t.deptno,s.grade,d.dname,t.avgsal
FROM (SELECT deptno,AVG(sal) avgsal FROM emp GROUP BY deptno) t
JOIN salgrade s
ON t.avgsal BETWEEN s.losal AND s.hisal
JOIN dept d
ON t.deptno=d.deptno
ORDER BY grade
LIMIT 1SELECT t.*,s.grade
FROM (SELECT e.deptno,d.dname,AVG(sal) avgsal FROM emp e JOIN dept d ON e.deptno=d.deptno GROUP BY deptno) t
JOIN salgrade s
ON t.avgsal BETWEEN s.losal AND s.hisal
WHERE s.grade = (SELECT grade FROM salgrade WHERE (SELECT AVG(sal) AS avgsal FROM emp GROUP BY deptno ORDER BY avgsal ASC LIMIT 1) BETWEEN losal AND hisal);-- 8、取得比普通员工(员工代码没有在 mgr 字段上出现的)的最高薪水还要高的领导人姓名SELECT DISTINCT mgr
FROM emp
WHERE mgr IS NOT NULLSELECT MAX(sal)
FROM emp
WHERE empno NOT IN(SELECT DISTINCT mgr FROM emp WHERE mgr IS NOT NULL)SELECT ename,sal,empno
FROM emp
WHERE sal>(SELECT MAX(sal) FROM emp WHERE empno NOT IN(SELECT DISTINCT mgr FROM emp WHERE mgr IS NOT NULL)
)  AND empno IN(SELECT DISTINCT mgr FROM emp WHERE mgr IS NOT NULL)-- 9、取得薪水最高的前五名员工
SELECT ename,sal
FROM emp
ORDER BY sal DESC
LIMIT 5-- 10、取得薪水最高的第六到第十名员工
SELECT ename,sal
FROM emp
ORDER BY sal DESC
LIMIT 5,5-- 11、取得最后入职的 5 名员工
SELECT ename,hiredate
FROM emp
ORDER BY hiredate DESC
LIMIT 5-- 12、取得每个薪水等级有多少员工
SELECT grade,COUNT(*)
FROM emp e
JOIN salgrade s
ON e.sal BETWEEN s.losal AND s.hisal
GROUP BY grade-- 13.面试题
CREATE TABLE SC
(SNO VARCHAR(200),CNO VARCHAR(200),SCGRADE VARCHAR(200)
);CREATE TABLE S
(SNO VARCHAR(200 ),SNAME VARCHAR(200)
);CREATE TABLE C
(CNO VARCHAR(200),CNAME VARCHAR(200),CTEACHER VARCHAR(200)
);INSERT INTO C ( CNO, CNAME, CTEACHER ) VALUES ( '1', '语文', '张');
INSERT INTO C ( CNO, CNAME, CTEACHER ) VALUES ( '2', '政治', '王');
INSERT INTO C ( CNO, CNAME, CTEACHER ) VALUES ( '3', '英语', '李');
INSERT INTO C ( CNO, CNAME, CTEACHER ) VALUES ( '4', '数学', '赵');
INSERT INTO C ( CNO, CNAME, CTEACHER ) VALUES ( '5', '物理', '黎明');
COMMIT;INSERT INTO S ( SNO, SNAME ) VALUES ( '1', '学生 1');
INSERT INTO S ( SNO, SNAME ) VALUES ( '2', '学生 2');
INSERT INTO S ( SNO, SNAME ) VALUES ( '3', '学生 3');
INSERT INTO S ( SNO, SNAME ) VALUES ( '4', '学生 4');
COMMIT;INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '1', '1', '40');
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '1', '2', '30');
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '1', '3', '20');
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '1', '4', '80');
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '1', '5', '60');
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '2', '1', '60');
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '2', '2', '60');
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '2', '3', '60');
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '2', '4', '60');
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '2', '5', '40');
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '3', '1', '60');
INSERT INTO SC ( SNO, CNO, SCGRADE ) VALUES ( '3', '3', '80');
COMMIT;SELECT sname
FROM s
WHERE sname NOT IN(SELECT sname
FROM sc
JOIN s ON s.sno=sc.sno
JOIN c ON c.cno=sc.cno
WHERE cteacher='黎明'
)SELECT sc.sno,s.sname,AVG(scgrade)scgrade
FROM sc
JOIN s
ON sc.sno=s.sno
WHERE sc.sno=(SELECT sno
FROM sc
WHERE scgrade<60
GROUP BY sno
HAVING COUNT(sno)>=2)SELECT sc.sno,s.sname
FROM s
LEFT JOIN sc ON s.sno=sc.sno
RIGHT JOIN c ON c.cno=sc.cno
WHERE sc.cno IN ('1','2')
GROUP BY sc.sno
HAVING COUNT(*)=2
ORDER BY s.sno-- 14、列出所有员工及领导的姓名
SELECT a.ename,IFNULL(b.ename,'没有领导')
FROM emp a
LEFT JOIN emp b
ON a.mgr=b.empno-- 15、列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
SELECT a.ename,a.hiredate,b.ename,b.hiredate,d.dname
FROM emp a
JOIN emp b
ON a.mgr=b.empno
JOIN dept d
ON a.deptno=d.deptno
WHERE a.hiredate<b.hiredate-- 16、列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
SELECT d.dname,e.*
FROM emp e
RIGHT JOIN dept d
ON e.deptno=d.deptno-- 17、列出至少有 5 个员工的所有部门
SELECT d.dname,COUNT(*)
FROM emp e
RIGHT JOIN dept d
ON e.deptno=d.deptno
GROUP BY d.dname
HAVING COUNT(*)>=5-- 18、列出薪金比"SMITH"多的所有员工信息.
SELECT *
FROM emp
WHERE sal>(SELECT sal FROM emp WHERE ename='SMITH'
)-- 19、列出所有"CLERK"(办事员)的姓名及其部门名称,部门的人数.
SELECT ename,job,dname,d.deptno
FROM emp e
JOIN dept d
ON e.deptno=d.deptno
WHERE job='CLERK'SELECT deptno,COUNT(*)
FROM emp
GROUP BY deptnoSELECT t1.*,t2.deptcount
FROM (SELECT ename,job,dname,d.deptno
FROM emp e
JOIN dept d
ON e.deptno=d.deptno
WHERE job='CLERK') t1
JOIN (SELECT deptno,COUNT(*) AS deptcount
FROM emp
GROUP BY deptno
) t2
ON t1.deptno=t2.deptno-- 20、列出最低薪金大于 1500 的各种工作及从事此工作的全部雇员人数.
SELECT job,COUNT(*)
FROM emp
GROUP BY job
HAVING MIN(sal)>1500-- 21、列出在部门"SALES"<销售部>工作的员工的姓名,假定不知道销售部的部门编号.
SELECT ename,e.deptno
FROM emp e
JOIN dept d
ON e.deptno=d.deptno
WHERE dname='SALES'-- 22、列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,雇员的工资等级.
SELECT e.ename,d.dname,ee.ename,s.grade
FROM emp e
JOIN dept d
ON e.deptno=d.deptno
JOIN salgrade s
ON e.sal BETWEEN s.losal AND s.hisal
LEFT JOIN emp ee
ON e.mgr=ee.empno
WHERE e.sal>(SELECT AVG(sal) FROM emp)-- 23、列出与"SCOTT"从事相同工作的所有员工及部门名称.
SELECT ename,dname
FROM emp e
JOIN dept d
ON e.deptno=d.deptno
WHERE job=(SELECT job
FROM emp
WHERE ename='SCOTT') AND ename!='SCOTT'-- 24、列出薪金等于部门 30 中员工的薪金的其他员工的姓名和薪金.
SELECT ename,sal
FROM emp
WHERE sal IN(SELECT sal FROM emp WHERE deptno=30) AND  deptno <> 30-- 25、列出薪金高于在部门 30 工作的所有员工的薪金的员工姓名和薪金.部门名称.
SELECT ename,sal,d.dname
FROM emp e
JOIN dept d
ON e.deptno=d.deptno
WHERE sal >(SELECT MAX(sal) FROM emp WHERE deptno=30)-- 26、列出在每个部门工作的员工数量,平均工资和平均服务期限.
SELECT dname,COUNT(e.ename),IFNULL(AVG(sal),0),IFNULL(AVG(TIMESTAMPDIFF(YEAR,hiredate,NOW())),0)
FROM emp e
RIGHT JOIN dept d
ON e.deptno=d.deptno
GROUP BY d.deptno在mysql当中怎么计算两个日期的“年差”,差了多少年?TIMESTAMPDIFF(间隔类型, 前一个日期, 后一个日期)TIMESTAMPDIFF(YEAR, hiredate, NOW())间隔类型:SECOND   秒,MINUTE   分钟,HOUR   小时,DAY   天,WEEK   星期MONTH   月,QUARTER   季度,YEAR   年-- 27、列出所有员工的姓名、部门名称和工资。
SELECT e.ename,d.dname,e.sal
FROM emp e
JOIN dept d
ON e.deptno=d.deptno-- 28、列出所有部门的详细信息和人数
SELECT d.*,COUNT(e.ename)
FROM emp e
RIGHT JOIN dept d
ON e.deptno=d.deptno
GROUP BY dname-- 29、列出各种工作的最低工资及从事此工作的雇员姓名SELECT *
FROM emp
WHERE sal IN(SELECT MIN(sal)
FROM emp
GROUP BY job)SELECT *
FROM emp e
JOIN (SELECT job,MIN(sal) minsal
FROM emp
GROUP BY job) t
ON e.job=t.job AND e.sal=t.minsal-- 30、列出各个部门的 MANAGER(领导)的最低薪金
SELECT deptno,MIN(sal)
FROM emp
WHERE job='MANAGER'
GROUP BY deptno-- 31、列出所有员工的年工资,按年薪从低到高排序
SELECT ename,(sal+IFNULL(comm,0))*12 income
FROM emp
ORDER BY sal -- 32、求出员工领导的薪水超过 3000 的员工名称与领导名称
SELECT a.ename,b.ename,b.sal
FROM emp a
JOIN emp b
ON a.mgr=b.empno
WHERE b.sal>3000-- 33、求出部门名称中,带'S'字符的部门员工的工资合计、部门人数.
SELECT  t.dname,FORMAT(IFNULL(SUM(sal),0),0),COUNT(e.ename)
FROM emp e
RIGHT JOIN (SELECT deptno,dname
FROM dept
WHERE dname LIKE '%S%') t
ON e.deptno=t.deptno
GROUP BY t.deptno-- 34、给任职日期超过 30 年的员工加薪 10%.UPDATE emp SET sal=sal*1.1
WHERE TIMESTAMPDIFF(YEAR,hiredate,NOW())>40

MySql+JDBC相关推荐

  1. 架构周报| 浅析MySQL JDBC连接配置上的两个误区

    经典案例 \\ 浅析MySQL JDBC连接配置上的两个误区:相信使用MySQL的同学都配置过它的JDBC驱动,多数人会直接从哪里贴一段URL过来,然后稍作修改就上去了,对应的连接池配置也是一样的,很 ...

  2. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 数据库报错

    -- 查询mysql 数据库链接空闲时间持有最大空闲时间,单位为秒 SHOW VARIABLES WHERE VAriable_name = 'interactive_timeout'; -- 会出现 ...

  3. logstash mysql eror_Logstash安装记录(报错com.mysql.jdbc.Driver not loaded的解决)

    Logstash是es官方标配的ELK中的"L",它们三者的关系是这样:"E"指elasticsearch,用来提供核心的搜索服务:"L"指 ...

  4. weblogic 配置mysql数据源Cannot load driver class: com.mysql.jdbc.Driver的问题

    这两天在学习weblogic,因为我本身用mysql较多,所以在weblogic配置数据源时,就 选择了mysql,但是你在测试时会发现报一个错误: Cannot load driver class: ...

  5. MySql JDBC

    1.什么是数据库? 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以通过SQL对数据库中的数据进行增加.修改.删除.及查询操作. 数据库系统类型(历史发展): ...

  6. java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 解决方法 java.lang.ClassNotFoundException: com.

    java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 解决方法 java.lang.ClassNotFoundException: com.m ...

  7. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    昨天数据库做了一些改动,早上再打开的项目的时候就出现了这样的问题 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communicat ...

  8. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'rtjhyt' in 'field list'

    今天向数据库中插入语句遇到了这样的异常: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'rtjh ...

  9. mysql jdbc tomcat_Tomcat+MySql+jdbc

    Tomcat+MySql+jdbc Linux下安装配置 Jdk+Tomcat+MySql+jdbc 1.安装JDK 下载 jdk-7-linux-i586.rpm http://java.sun.c ...

  10. Loading class `com.mysql.jdbc.Driver'. This is dep

    异常信息: Loading class com.mysql.jdbc.Driver'. This is deprecated. The new driver class iscom.mysql.cj. ...

最新文章

  1. 如何快速融入团队(二)
  2. h1.1 hadoop简介
  3. 杭州网络推广浅析网站优化如何更快的提升收录?
  4. dos拼接字符串以及截取字符串
  5. undertow ssl_SSL与WildFly 8和Undertow
  6. 天玑机器人颈椎_天玑骨科手术机器人亮相机器人大会 误差不到1毫米
  7. 最近新学的小东西和单词
  8. 爱奇艺的测试工程师笔试题
  9. Jquery图片放大镜效果
  10. python自学-分享一位小伙伴的python自学之路,走了哪些弯路?
  11. 防止重复提交表单的两种方法
  12. JProfiler11安装,选择IDE
  13. 丽江旅游线路规划丽江游玩小贴士丽江游玩攻略花费
  14. vos系统是什么?vos网络电话系统怎样搭建?
  15. A Beginner‘s Guide To Understanding Convolutional Neural Networks(part 1)
  16. 让ChatGPT来制作Excel表格,ChatGPT实现文本和表格的相互转换
  17. 附件怎么插到公众号里
  18. [源码分享] HIVE表数据量统计邮件
  19. 免费获得Java 7并发食谱
  20. python求一个小于该自然数的所有素数(或质数)

热门文章

  1. Mambo V4.6 正式发布了!
  2. Spark多级目录输出,且输出不同值,重写MultipleTextOutputFormat
  3. JAVA 加盐加密方法
  4. STM32定时器配置
  5. Linux系统和C语言简介
  6. 分享了一篇文章:《张烊:户外广告设计赏析-2》
  7. [分享]ElasticSearch架构解析与最佳实践
  8. 【技巧总结】java位运算
  9. 孙玄辜教授:基于Linux内核的时间轮算法设计实现【附代码】
  10. zeal刷新不出来_Zeal下载教程及文档加载失败解决方法