1.初识MySQL
JavaEE;企业级Java开发 主要是Web
前端(页面展示,数据!)
后端(连接点:连接数据库JDBC,连接前端(控制,跳转视图,给前端传数据)
数据库(存数据,txt,excel,world)
只会写代码,会写数据库,基本混饭吃
操作系统,数据结构和算法,不错的混饭吃
离散数学,数字电路,体系结构,编译原理+实战经验 高级混饭吃
1.1为什么学习数据库
- 岗位需求 boss直聘看看
- 现在的大数据时代,得数据者得天下
- 被迫需求:存数据
- 数据库是所有软件中最核心的存在 DBA
5.MySQL函数
5.3数据库级别的MD5加密
CREATE DATABASE school
DROP DATABASE school
CREATE TABLE `textmd5`(
`id` INT(4) NOT NULL,
`name` VARCHAR(20) NOT NULL,
`pwd` VARCHAR(50) NOT NULL,
PRIMARY KEY(`id`)
)
INSERT INTO `textmd5` VALUES
(1,'张三','123456'),
(2,'wangwu','123456'),
(3,'lisi','123456')
UPDATE `textmd5` SET `pwd`=MD5(`pwd`) WHERE id=1
10.JDBC(重点)
10.1数据库驱动
驱动:声卡,显卡,数据库
应用程序无法与数据库直接交换信息
我们的程序会通过数据库驱动,和数据库打交道
如果没和一个数据库沟通都需要一个驱动,都需要一套程序,显然是不符合实际情况的
10.2JDBC
sum公式为了简化开发人员的(对数据库的统一)操作,提供了一个(Java操作数据库的)规范,俗称JDBC
这些规范的具体实现有具体的厂商去做~
对于开发人员来说,我们只需要掌握JDBC的接口操作即可!
包
java.sql
javax.sql
mysql-connector-java-8.0.11
10.3第一个JDBC程序
创建测试数据库
。。。。。
//创建数据库
//建表
//插入值
- 创建一个普通项目
- 导入数据库驱动
3.编写测试代码
小问题
取消勾选
就iok了
- 代码
package com.kuang.lesson01;
import java.sql.*;
//我的第一个JDBC程序
public class jdbcFirst {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动 ····>>打开sqlyog
Class.forName("com.mysql.cj.jdbc.Driver");//固定写法,加载驱动
/*抛出异常,
mysql80使用com.mysql.cj.jdbc.Driver,
而ymsql5使用"com.mysql.jdbc.Driver"
*/
//2.用户信息和url ..>输入url,用户名,密码。。。
//useUnicode=true&characterEncoding=utf8&useSSL=false
String url="jdbc:mysql://localhost:3306/cjgl? useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8";
String username="root";
String password="123";
//3.连接成功,数据库对象 ...>成功,即出现了对象
/*
connection 代表数据库
*/
Connection connection = DriverManager.getConnection(url, username, password);
//4.执行sql的对象 ....>
/*
statement 代表执行sql的对象
*/
Statement statement = connection.createStatement();
//5.执行sql的对象去执行sql
String sql="SELECT * FROM `course` WHERE ccredit=3";
ResultSet resultSet = statement.executeQuery(sql);//resultset 返回的结果集,结果集封装了我们全部查询出来的结果
while (resultSet.next()){
System.out.println("cno="+resultSet.getObject("cno"));
System.out.println("cname="+resultSet.getObject("cname"));
System.out.println("ccredit="+resultSet.getObject("ccredit"));
System.out.println("cdept="+resultSet.getObject("cdept"));
System.out.println("--------------------------------------");
}
//6.释放连接
resultSet.close();
statement.close();
connection.close();
/*
口诀:贾琏欲执事(加连预执释)
引入依赖,加载驱动 连接数据库 创建预编译语句 设置参数,执行sql 关闭连接,释放资源
*/
}
}
步骤总结
1.加载驱动
2.连接数据库DriverManager
3.获取执行sql的对象 >statement
4.返回的结果集
5.释放的连接
自己用sqyog对应做一下,都是一样的,一个是图形,一个是代码
DriverManager
//DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.cj.jdbc.Driver");//固定写法,加载驱动
Connection connection = DriverManager.getConnection(url, username, password);
//connection代表数据库,
//设置数据库自动提交
//事物提交
//事物回滚
connection.commit();
connection.rollback();
connection.setAutoCommit();
URL
String url="jdbc:mysql://localhost:3306/cjgl?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8";
//mysql 默认端口号3306
//协议
//jdbc:mysql://主机号:端口号/数据库名?参数1&参数2&参数3
//oralce--1521
//jdbc:oracle:thin:@localhost:1521:sid
statement执行sql的对象 vs prepareStatement()执行sql的对象
//编写sql
Statement statement = connection.createStatement();
statement.execute();//执行任何sql
statement.executeQuery();//执行查询操作,返回resultSet
statement.executeUpdate();//更新,插入,删除,都是用它,返回一个受影响的行数
statement.executeBatch();/多个语句
ResultSet查询的结果集,封装了所有的查询结果
- 获得指定的数据类型
resultSet.getObject();//在不知道类型的情况下使用
resultSet.getBoolean();
resultSet.getString();
resultSet.getShort();
- 遍历
// [1,12,34,56,4,6]
resultSet.beforeFirst();//移动到最前面
resultSet.afterLast();//移动到最后面
resultSet.next();//移动到下一个
resultSet.previous();//移动到前一行
resultSet.absolute(row);//移动到指定行
释放资源
//6.释放连接
resultSet.close();
statement.close();
connection.close();//耗资源,用完关掉
10.4statement对象(重要)
jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sq|i语句, executeUpdate执行完后, 将会返回一-个整数(即增删改语句导致了数据库几行数据发生了变化)。
Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表 查询结果的ResultSet对象。
CURD操作-create
CURD是一个数据库技术中的缩写词,一般的项目开发的各种参数的基本功能都是CURD。 它代表创建(Create)、更新(Update)、读取(Read)和删除(Delete)操作。
使用executeUpdate(String sql)方法完成数据添加操作,实例操作
Statement statement = connection.createStatement();
String sql01="insert into user() values()";
int num=statement.executeUpdate(sql01);
if (num>0){
System.out.println("插入成功");
}
CRUD操作之delete
使用executeUpdate(String sql)方法完成数据删除,示例操作:
Statement statement = connection.createStatement();
String sql01="delete from user where id =1";
int num=statement.executeUpdate(sql01);
if (num>0){
System.out.println("删除成功");
}
CURD-update
使用executeUpdate(String sql)方法完成数据修改,示例操作:
Statement statement = connection.createStatement();
String sql01="update from user set name='' where id =1";
int num=statement.executeUpdate(sql01);
if (num>0){
System.out.println("修改成功");
}
CURD-read
使用executeUpdate(String sql)方法完成数据修改,示例操作:
Statement statement = connection.createStatement();
String sql03="SELECT * FROM `course` WHERE ccredit=3";
ResultSet resultSet = statement.executeQuery(sql03);
while (resultSet.next()){
//根据获取列的数据类型,分别调用rs的相应方法映射到java对象中
}
代码实现:
一、提取工具类
1.创建utils包(,封装原有的方法,主要提供一些连接方法)
package com.kuang.lesson02.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JdbcUtils {
//在src下面的文件都可以通过反射得到
private static String driver=null;//提升作用域
private static String url=null;//
private static String username=null;//
private static String password=null;
static {
try{
InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db");//输入流
Properties properties = new Properties();//获取Properties的文件信息
properties.load(in);//加载
driver= properties.getProperty("driver");//导出文件中的其余属性
url= properties.getProperty("url");
username= properties.getProperty("username");
password= properties.getProperty("password");
//驱动只需要加载一次
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
//2.获取连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, username, password);
}
//3.释放连接资源
public static void relase(Connection conn, Statement st, ResultSet rs){
if (rs!=null){
try{
rs.close();
}catch (Exception e){
e.printStackTrace();
}
}
if (st!=null){
try {
st.close();
}catch (Exception e){
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
2.建立一个专门放登录信息的db
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/cjgl?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username=root
password=123
二、测试增删改操作
package com.kuang.lesson02;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class TextInsert {
public static void main(String[] args) {
Connection connection = null;
Statement st = null;
ResultSet rs = null;
try {
connection = JdbcUtils.getConnection();//获取数据库连接
st = connection.createStatement();//返回数据库操作对象
String sql = "INSERT INTO `t1` (`id`,`xm`,`score`)VALUES(20,'chenlon',12)";
int i = st.executeUpdate(sql);
if (i > 0) {
System.out.println("插入成功");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.relase(connection, st, rs);
}
}
}
package com.kuang.lesson02;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class TextDelet {
public static void main(String[] args) {
Connection connection = null;
Statement st = null;
ResultSet rs = null;
try {
connection = JdbcUtils.getConnection();//获取数据库连接
st = connection.createStatement();//返回数据库操作对象
String sql = "DELETE\tFROM t1 WHERE id=20";
int i = st.executeUpdate(sql);
if (i > 0) {
System.out.println("删除成功");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.relase(connection, st, rs);
}
}
}
package com.kuang.lesson02;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class TextUpdate {
public static void main(String[] args) {
Connection connection = null;
Statement st = null;
ResultSet rs = null;
try {
connection = JdbcUtils.getConnection();//获取数据库连接
st = connection.createStatement();//返回数据库操作对象
String sql = "UPDATE t1 SET xm=\"cl\",score=200 WHERE id=1";
int i = st.executeUpdate(sql);
if (i > 0) {
System.out.println("更新成功");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.relase(connection, st, rs);
}
}
}
三、查询
package com.kuang.lesson02;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TextQuery {
public static void main(String[] args) {
Connection conn=null;
Statement st=null;
ResultSet rs=null;
try {
conn = JdbcUtils.getConnection();//加载驱动
st=conn.createStatement();//获取执行对象了
//sql
String sql="select * from t1 where id=1";
rs = st.executeQuery(sql);
if (rs.next()){
System.out.println( rs.getString("xm"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.relase(conn,st,rs);
}
}
}
sql注入问题
sql注入的问题
sql存在漏洞,会被攻击,导致数据漏洞
sql会被拼接,or
package com.kuang.lesson02;
import com.kuang.lesson02.utils.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) {
//login("111111","WANG");
login("'or'1=1","'or'1=1");//拼接一个违法字符串,技巧
}
public static void login(String sno,String sname){
Connection conn=null;
Statement st=null;
ResultSet rs=null;
try {
conn = JdbcUtils.getConnection();//加载驱动
st=conn.createStatement();//获取执行对象了
//SELECT * FROM `student` WHERE sno='111111' AND sname='WANG'
//假如SELECT * FROM `student` WHERE name=''or'1=1' AND pwd=''or'1=1'
String sql="SELECT * FROM `student` WHERE sno='"+sno+"' AND sname='"+sname+"'";
rs = st.executeQuery(sql);
if (rs.next()){
System.out.println( rs.getString("sname"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.relase(conn,st,rs);
}
}
}
10.5PreparedStatement
PreparedStatement可以防止sql注入,效率更高!!
1新增
package com.kuang.lesson03;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.*;
public class TextInsert {
public static void main(String[] args) {
Connection conn=null;
PreparedStatement st=null;
ResultSet rs=null;
try {
conn = JdbcUtils.getConnection();
//区别,写insert into。。但是values后面的要另外写
//使用问号占位符
String sql="INSERT INTO `t1` (`id`,`xm`,`score`)VALUES(?,?,?)";
st=conn.prepareStatement(sql);//预编译sql,先写sql,然后不执行
//手动给参数赋值
// INSERT INTO `t1` (`id`,`xm`,`score`)VALUES(20,'chenlon',12)
st.setInt(1,4);
st.setString(2,"chenlon");
st.setInt(3,12);
//执行
int i = st.executeUpdate();
if (i>0){
System.out.println("成功");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.relase(conn,st,null);
}
}
}
2.删除
package com.kuang.lesson03;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TextDlete {
public static void main(String[] args) {
Connection conn=null;
PreparedStatement st=null;
ResultSet rs=null;
try {
conn = JdbcUtils.getConnection();
//区别,写insert into。。但是values后面的要另外写
//使用问号占位符
String sql="delete from t1 where id=?";
st=conn.prepareStatement(sql);//预编译sql,先写sql,然后不执行
//手动给参数赋值
// INSERT INTO `t1` (`id`,`xm`,`score`)VALUES(20,'chenlon',12)
st.setInt(1,4);
//执行
int i = st.executeUpdate();
if (i>0){
System.out.println("删除成功");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.relase(conn,st,null);
}
}
}
3.改
package com.kuang.lesson03;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.*;
//除了sql,update的三个都一样
public class TextUpdate {
public static void main(String[] args) {
Connection conn=null;
PreparedStatement st=null;
ResultSet rs=null;
try {
conn = JdbcUtils.getConnection();
//区别,写insert into。。但是values后面的要另外写
//使用问号占位符
String sql="update t1 set `xm`= ? where id=?";
st=conn.prepareStatement(sql);//预编译sql,先写sql,然后不执行
//手动给参数赋值
// INSERT INTO `t1` (`id`,`xm`,`score`)VALUES(20,'chenlon',12)
st.setString(1,"chenlon");
st.setInt(2,1);
//执行
int i = st.executeUpdate();
if (i>0){
System.out.println("更新成功");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.relase(conn,st,null);
}
}
}
4.查
package com.kuang.lesson03;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TextSelect {
public static void main(String[] args) {
Connection conn=null;
PreparedStatement st=null;
ResultSet rs=null;
try {
conn= JdbcUtils.getConnection();
String sql="select * from t1 where id=?";//编写sql
st=conn.prepareStatement(sql);//预编译
st.setInt(1,1);//传参数
rs=st.executeQuery();//执行
if (rs.next()){
System.out.println(rs.getString("xm"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.relase(conn,st,rs);
}
}
}
5.防止sql注入
package com.kuang.lesson03;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.*;
public class SQL注入 {
public static void main(String[] args) {
//login("111111","WANG");
login("'or'1=1","'or'1=1");//拼接一个违法字符串,技巧
}
public static void login(String sno,String sname){
Connection conn=null;
PreparedStatement st=null;
ResultSet rs=null;
try {
conn = JdbcUtils.getConnection();//加载驱动
//PrepareStatement防止SQL注入的本质,把传递进来的参数当作字符,假设其中存在转义字符,,会被直接转义
String sql="SELECT * FROM `student` WHERE sno=? AND sname=?";//Mybatis
st=conn.prepareStatement(sql);//预编译
st.setString(1,sno);
st.setString(2,sname);
rs = st.executeQuery();
if (rs.next()){
System.out.println( rs.getString("sname"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.relase(conn,st,rs);
}
}
}
10.7使用IDEA连接数据库
1.连接数据库
2.连接成功后,可以选择数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8uP0NJC9-1651658200953)(https://raw.githubusercontent.com/doyoudooo/imageBackup/main/202205041755391.png)]
3.查看数据库双击数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aOTcqnuW-1651658200953)(https://raw.githubusercontent.com/doyoudooo/imageBackup/main/202205041755393.png)]
4.更新数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f0NYjwDT-1651658200953)(https://raw.githubusercontent.com/doyoudooo/imageBackup/main/202205041755394.png)]
5.连接失败
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cZEZ4OSM-1651658200954)(https://raw.githubusercontent.com/doyoudooo/imageBackup/main/202205041755395.png)]
10.8事务
要么都成功,要么都成功
ACID原则
原子性:要么全部完成,要么都不完成
一致性:总数不变
隔离性:多进程互不干扰
持久性:一旦提交不可逆,持久化到数据库了
隔离性的问题:
脏读:一个事务读取了另一个没有提交的事务
不可重复的:在同一个事务内,重复读取了表中的数据,表中数据发生了变化
虚读(幻读):在一个事务内,读取到了别人插入的数据,导致前后独处的数据不一致
代码实行
1.开启事务conn.setAutoCommit(false);//开启事务
2.一组事务执行完毕,提交事务,
3.可以在catch语句中显示的定义,回滚语句,但默认就会回滚
package com.kuang.lesson04;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TextTrasaction {
public static void main(String[] args) {
Connection conn=null;
PreparedStatement st=null;
ResultSet rs=null;
try {
conn= JdbcUtils.getConnection();
//关闭自动提交功能,自动会开启事务
conn.setAutoCommit(false);//开启事务
String sql1="update account set balance=balance-100 where aID= '001'";
st=conn.prepareStatement(sql1);
st.executeUpdate();
String sql2="update account set balance=balance+100 where aID= '002'";
st=conn.prepareStatement(sql2);
st.executeUpdate();
//提交事务
conn.commit();
System.out.println("成功");
} catch (SQLException e) {
try {
conn.rollback();//如果失败,则回滚
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}finally {
JdbcUtils.relase(conn,st,rs);
}
}
}
10.9数据库连接池
数据库连接-----执行完毕------释放
连接----释放 十分浪费系统资源
池化技术:准备一些预先的资源,过来就连接预先准备好的
10SQL
5
---------开门----业务员:等待连接—服务------------服务器关闭:关门------------
常用连接数:10个
最小连接数:10
最大连接数:15 业务最高承载上限
排队等待
排队超时100ms
编写连接池,实现一个接口 Datasourse
开源数据源实现
DBCP,C3P0
Druid:阿里巴巴
使用了这些数据库连接池之后,我们在项目开发中就不需要编写连接数据库的代码了!!
DBCP
需要用到的jar包
common dbcp1-4
common pool1.6
IDEA连接数据库
1.选择mysql
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pSNXAFMh-1651658200955)(https://raw.githubusercontent.com/doyoudooo/imageBackup/main/202205041755396.png)]
2.配置数据库用户,密码,数据库
3.调整时区!!!
win+R>>cmd
mysql -hlocalhost -uroot -p
123
设置时区
set global time_zone = ‘+8:00’;
如果有其他问题请看
rintln(“成功”);
} catch (SQLException e) {
try {
conn.rollback();//如果失败,则回滚
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}finally {
JdbcUtils.relase(conn,st,rs);
}
}
}
## 10.9数据库连接池
数据库连接-----执行完毕------释放
连接----释放 十分浪费系统资源
**池化技术**:准备一些预先的资源,过来就连接预先准备好的
10SQL
5
---------开门----业务员:等待连接---服务------------服务器关闭:关门------------
常用连接数:10个
最小连接数:10
最大连接数:15 业务最高承载上限
排队等待
排队超时100ms
编写连接池,实现一个接口 Datasourse
> 开源数据源实现
>
> DBCP,C3P0
>
> Druid:阿里巴巴
使用了这些数据库连接池之后,我们在项目开发中就不需要编写连接数据库的代码了!!
> DBCP
需要用到的jar包
common dbcp1-4
common pool1.6
# IDEA连接数据库
## 1.选择mysql
[外链图片转存中...(img-pSNXAFMh-1651658200955)]
## 2.配置数据库用户,密码,数据库
[外链图片转存中...(img-VOMn4K0B-1651658200955)]
## 3.调整时区!!!
win+R>>cmd
mysql -hlocalhost -uroot -p
123
> 设置时区
set global time_zone = '+8:00';
如果有其他问题请看
https://blog.csdn.net/liuqiker/article/details/102455077