⑥ 类中:
package com.jdbc;
import com.mysql.jdbc.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1、注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
//2、获取连接
//url的格式是:“jdbc:mysql://mysql的ip:端口号/操作的数据库”
String url=“jdbc:mysql://127.0.0.1:3306/kc_db01”;
//username是你的mysql用户名
String username=“root”;
//password是你的mysql密码
String password=“123456”;
Connection conn= (Connection) DriverManager.getConnection(url, username, password);
//3、定义sql
String sql=“update emp set salary=666 where ename=‘zhangsan’”;
//4、获取执行sql的Statement对象
Statement stat=conn.createStatement();
//5、执行sql语句,count就是影响的行数
int count=stat.executeUpdate(sql);
//6处理结果
System.out.println(“影响的行数:”+count);
//7、释放资源(先开后释放)
stat.close();
conn.close();
}
}
数据库之前:
运行结果:
运行之后数据库:
一、DriverManager
===============
DriverManager(驱动管理类)作用:
1、注册驱动
2、获取数据库连接
1、注册驱动:
Class.forName(“com.mysql.jdbc.Driver”);
注册驱动的书写方法,表面上没有使用 DriverManager类,选中Driver,ctrl+b看源码可知
package com.mysql.jdbc;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException(“Can’t register driver!”);
}
}
}
它使用了 DriverManager.registerDriver()的方法
在MySQL5之后的驱动包,可以省略注册驱动的步骤
自动加载jar包中的META-INF/services/java.sql.Driver文件的驱动类
2、获取连接
static Connection getConnection(String url,String user,String password)
参数
1、url:连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…
举例:jdbc:mysql://127.0.0.1:3306/db1(本机127.0.0.1,本机域名:localhost)
细节: 如果连接的是本机mysql服务器,并且mysql默认端口号是3306 ,则url可以简写为:jdbc:mysql://数据库名称?参数键值对如:jdbc:mysql:///db1
配置userSSL=false参数,禁用安全连接方式,解决警告提示
2、user:用户名
3、password:密码
解决警告提示:
?userSSL=false
String url=“jdbc:mysql://127.0.0.1:3306/db1?useSSL=false”;
二、Connection
============
Connection(数据库连接对象)作用:
1、获取执行SQL的对象
2、管理事务
2.1、获取执sql对象
- 普通执行SQL对象
Statement createStatement()
- 预编译SQL的执行SQL对象:防止SQL注入
PrepareStatement prepareStatement(sql)
- 执行存储过程对象
CallableStatement prepareCall(sql)
2.2、事务管理
2.2.1、mysql事务管理
开启事务:BEGIN;/START TRANSACTION(start transaction)
提交事务:COMMIT;
回滚事务:ROLLBACK;
(MySQL默认自动提交事务)
JDBC事务管理:
Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean autoCommit);true为自动提交事务,false为手动提交事务(开启事务)
提交事务:commit()
回滚事务:rollback()
2.2.2、演示jdbc的事务
复制前面弄过的类到包下
package com.jdbc;
import com.mysql.jdbc.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCConnectionDemo {
public static void main(String[] args) throws Exception {
//1、注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
//2、获取连接
//url的格式是:“jdbc:mysql://mysql的ip:端口号/操作的数据库”
String url=“jdbc:mysql://127.0.0.1:3306/kc_db01”;
//username是你的mysql用户名
String username=“root”;
//password是你的mysql密码
String password=“123456”;
Connection conn= (Connection) DriverManager.getConnection(url, username, password);
//3、定义sql
String sql1=“update emp set salary=6666 where ename=‘zhangsan’”;
String sql2=“update emp set salary=6666 where ename=‘lisi’”;
//4、获取执行sql的Statement对象
Statement stat=conn.createStatement();
//选中要处理的异常部分,ctrl+alt+t快捷键生成
try {
//开启事务
conn.setAutoCommit(false);
//执行sql
int count1=stat.executeUpdate(sql1);
//处理结果
System.out.println(“影响的行数:”+count1);
//执行时sql
int count2=stat.executeUpdate(sql2);
//处理结果
System.out.println(“影响的行数:”+count2);
//提交事务
conn.commit();
} catch (Exception e) {
e.printStackTrace();
//回滚事务(回到开启事务之前,即什么也没处理前)
conn.rollback();
}finally {
//7、释放资源(先开后释放)
stat.close();
conn.close();
}
}
}
运行之前数据库emp表:
运行结果:
运行之后数据库emp表:
try之中的发生了异常 ,就会 被catch捕获,发生回滚,回滚到还没有开启事务之前,就是数据没有修改之前,若是没有用事务,就会导致可能一个成功一个失败,这是我们不愿意看到的。 启用了事务,用了回滚事务,可以保证多个事务要么同时成功,要么同时失败。
三、Statement
===========
Statemen作用:
3.1、执行sql语句
int executeUpdate(sql): 执行DML(对数据的增删改)、**DDL(对表和库的增删改)**语句
返回值:(1)DML语句影响的行数(2)DDL语句执行后,执行成功也可能返回0
ResultSet executeQuery(sql):执行**DQL(对数据的查询操作)**语句
返回值:ResultSet结果对象
四、ResultSet
===========
ResultSet(结果集对象)作用:
1.封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象
获取查询结果
boolean next():(1)将光标从当前位置向前移动一行(2)判断当前行是否是有效行
返回值:当前行有数据返回true,当前没数据返回false。
xxx getXxx(参数):获取数据
解释:xxx表示数据类型;如int getInt(参数);String getString(参数);
参数:对于int是列的编号,从1开始,对于String是列的名称。
使用步骤:
1、游标向下移动一行,并判断该行是否有数据:next()
2、获取数据:getXxx(参数)
示例:
while(rs.next()){
rs.getXxx(参数);
}
实例:
package com.jdbc;
import com.mysql.jdbc.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCDemo3_ResultSet {
public static void main(String[] args) throws Exception {
//1、注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
//2、获取连接
//url的格式是:“jdbc:mysql://mysql的ip:端口号/操作的数据库”
String url=“jdbc:mysql://127.0.0.1:3306/kc_db01”;
//username是你的mysql用户名
String username=“root”;
//password是你的mysql密码
String password=“123456”;
Connection conn= (Connection) DriverManager.getConnection(url, username, password);
//3、定义sql
String sql=“select *from emp”;
//4、获取执行sql的Statement对象
Statement stmt=conn.createStatement();
//5、执行sql语句
ResultSet rs=stmt.executeQuery(sql);
//6处理结果
while(rs.next()){
//获取数据 getXxx();括号中可以写所在行,也可以写列名
int id=rs.getInt(1);
String ename=rs.getString(2);
int salary=rs.getInt(3);
//另一种写法:写行的名称
// int id=rs.getInt(“id”);
// String ename=rs.getString(“ename”);
// int salary=rs.getInt(“salary”);
System.out.println(id);
System.out.println(ename);
System.out.println(salary);
System.out.println(“-----------”);
}
//7、释放资源(先开后释放)
rs.close();
stmt.close();
conn.close();
}
}
数据库中emp表
运行之后:
ResultSet案例
需求:查询account账户数据,封装为Account对象中,并且存储到ArrayList集合中
创建一个pojo包,用来存放对象的。
创建了一个类,提供getSet方法
package com.pojo;
public class Account {
private int id;
private String ename;
private int salary;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
//为了更好的显示,重写toString()方法
@Override
public String toString() {
return “Account{” +
“id=” + id +
“, ename='” + ename + ‘’’ +
“, salary=” + salary +
‘}’+“\n”;
}
}
jdbc包下创建的类中
package com.jdbc;
import com.mysql.jdbc.Connection;
import com.pojo.Account;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class JDBCDemo4_ResultSet {
public static void main(String[] args) throws Exception {
//1、注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
//2、获取连接
//url的格式是:“jdbc:mysql://mysql的ip:端口号/操作的数据库”
String url=“jdbc:mysql://127.0.0.1:3306/kc_db01”;
//username是你的mysql用户名
String username=“root”;
//password是你的mysql密码
String password=“123456”;
Connection conn= (Connection) DriverManager.getConnection(url, username, password);
//3、定义sql
String sql=“select *from emp”;
//4、获取执行sql的Statement对象
Statement stmt=conn.createStatement();
//5、执行sql语句
ResultSet rs=stmt.executeQuery(sql);
//6处理结果
//创建集合对象
List list=new ArrayList<>();
while(rs.next()){
//创建Account对象
Account account=new Account();
//获取数据 getXxx();括号中可以写所在行,也可以写列名
int id=rs.getInt(1);
String ename=rs.getString(2);
int salary=rs.getInt(3);
//赋值数据
account.setId(id);
account.setEname(ename);
account.setSalary(salary);
list.add(account);
}
System.out.println(list);
//7、释放资源(先开后释放)
rs.close();
stmt.close();
conn.close();
}
}
运行结果:
五、PreparedStatement
===================
5.1、PreparedStatement作用:
1、预编译SQL语句并执行:预防SQL注入问题
5.2、SQL注入
SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
演示普通登录:
首先数据录kc_db1下的emp表为:
package com.jdbc;
import com.mysql.jdbc.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCDemo5_UserLogin {
public static void main(String[] args) throws Exception {
//2、获取连接
//url的格式是:“jdbc:mysql://mysql的ip:端口号/操作的数据库”
String url=“jdbc:mysql://127.0.0.1:3306/kc_db01”;
//username是你的mysql用户名
String username=“root”;
//password是你的mysql密码
String password=“123456”;
Connection conn= (Connection) DriverManager.getConnection(url, username, password);
String name=“zhangsan”;
String pwd=“1233”;
//3、定义sql
String sql=“select *from emp where ename='”+name+“‘and password=’”+pwd+“'” ;
System.out.println(“这条SQL语句是:”+sql);
//4、获取执行sql的Statement对象
Statement stat=conn.createStatement();
//5、执行sql语句
ResultSet rs = stat.executeQuery(sql);
//6处理结果,rs有值说明查找成功
if(rs.next()){
System.out.println(“登录成功”);
}else{
System.out.println(“登录失败”);
}
//7、释放资源(先开后释放)
rs.close();
stat.close();
conn.close();
}
}
运行结果:
输入其他(不成功的原因是数据库中没有账号密码为这个的):
5.2.1、 sql注入演示:
对于这条sql语句来说不点在于密码,账号任意
String name=“随便写的名”;
String pwd=" ’ or ‘1’='1";
运行结果:
这条SQL语句是:select *from emp where ename=‘随便写的名’and password=’ ’ or ‘1’=‘1’
sql注入的本质就是改变原有的SQL语句,加入or之后1=1恒为真,所以这条语句就是true
5.3、PreparedStatement解决SQL注入
①获取PreparedStatement对象
//sql语句中的参数,使用?占位符代替
String sql=“select *from user where username=? and password=?”;
//通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt=conn.prepareStatement(sql);
②设置参数
PreparedStatement对象:setXxx(参数1,参数2):表示给参数1(?的位置)赋值为参数2
Xxx:数据类型;任意setInt(参数1,参数2)
参数:
- 参数1:表示?的位置编号,从1开始
- 参数2: ?的值
③执行sql
executeUpdate();/excuteQuery();括号内不需要传递sql。
创建类:
package com.jdbc;
import com.mysql.jdbc.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
public class JDBCDemo5_UserLogin {
public static void main(String[] args) throws Exception {
//2、获取连接
//url的格式是:“jdbc:mysql://mysql的ip:端口号/操作的数据库”
String url=“jdbc:mysql://127.0.0.1:3306/kc_db01”;
//username是你的mysql用户名
String username=“root”;
//password是你的mysql密码
String password=“123456”;
Connection conn= (Connection) DriverManager.getConnection(url, username, password);
String name=“随便写的名”;
String pwd=" ’ or ‘1’='1";
//3、定义sql
String sql=“select *from emp where ename=? and password=?” ;
//4、获取的PreparedStatement对象
PreparedStatement pstmt = conn.prepareStatement(sql);
//设置参数
pstmt.setString(1, name);
pstmt.setString(2, pwd);
//5、执行sql语句
ResultSet rs =pstmt.executeQuery();
System.out.println(“这条SQL语句是:”+sql);
//6处理结果,rs有值说明查找成功
if(rs.next()){
System.out.println(“登录成功”);
}else{
System.out.println(“登录失败”);
}
//7、释放资源(先开后释放)
rs.close();
pstmt.close();
conn.close();
}
}
运行结果:
这样就防止了sql注入,setXxx会对传入的参数会进行转义,不会拼接成字符串而是\’ or\ ’ 1\’ = \’ 1\’
输入正确的:
5.4、PrepareStatement原理
PrepareStatement好处:
1、预编译SQL,性能更高
2、防止sql注入。
my.ini配置文件可以看到日志
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
预编译功能默认关闭
①:PreparedStatement预编译功能开启:userServerPrepStmts=true
在sql语句?之后书写参数
String url=“jdbc:mysql://127.0.0.1:3306/kc_db01”?userServerPrepStmts=true;
开启就会要prepare预编译:
关闭之后就没有Prepare阶段
六、数据库连接池简介
==========
①数据库连接池是个容器,负责分配管理数据库连接(Connection)
②他允许应用程序重复使用一个现有的数据录连接,而不是再重新建立一个(其实就是提前建立好连接之后直接用)
③释放空闲时间超过最大空闲时间的数据库链接来避免因为没有释放数据库连接而引起的数据库连接遗漏
6.1、数据库连接池优点
①资源重用(用完放回,而不释放)
②提升系统的响应速度(提前申请好了,要用是直接重连接池拿即可)
③避免数据录连接遗漏(某一资源超过最大时间强制会放回)
6.2、数据录库连接池实现
标准接口:DataSource
官方(SUN)提供的数据库连接池标准接口,由第三方组织实线这个接口
功能:获取连接
Connection getConnection()
常见的数据库连接池:
DBCP
C3P0
Druid(德鲁伊):Druid连接池是阿里巴巴开源的数据库连接池项目,功能强大,性能优秀,是Java语言最好的数据库连接池之一。
6.3、Driud使用步骤
1、导入Driud的jar包
2、定义配置文件
3、加载配置文件
4、获取数据库连接池对象
5、获取连接
1、导入Druid的jar包,直接赋值jar包到lib目录下即可
选中jar包右键选择添加库,选择jar的作用范围为模块即可
2、定义配置文件druid.properties
内容一般为:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/kc_db01?useSSL=false&useServerPrepStmts=true
username=root
password=123456
#初始化连接数量
initialSize=5
#最大连接数量
maxActive=10
#最大等待时间
maxWait=3000
直接赋值刚才写的配置文件druid.properties复制到src下
类下:
package com.druid;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;
public class druidDemo {
public static void main(String[] args) throws Exception {
//1、导入jar包
//2、定义配置文件
//3、加载配置文件
Properties prop=new Properties();
//加载
prop.load(new FileInputStream(“jdbc-demo/src/druid.properties”));
//4、获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//5、获取数据库连接Connection
Connection connection = dataSource.getConnection();
System.out.println(connection);
//打印当前路径
System.out.println(System.getProperty(“user.dir”));//E:\jdbc
}
}
运行结果:
七、完成商品品牌数据的增删改查操作
=================
查询:查询所有数据
添加:添加品牌
修改:根据id修改
删除:根据id删除
准备环境:
数据库表tb-brand
实体类Brand
测试用例
表的信息
=====
drop table if exists tb_brand;
– 创建tb_brand表
create table tb_brand
(
– id 主键
id int primary key auto_increment,
– 品牌名称
brand_name varchar(20),
– 企业名称
company_name varchar(20),
– 排序字段
ordered int,
– 描述信息
description varchar(100),
– 状态:0:禁用1启用
status
int
)
character set utf8;
– 添加数据
insert into tb_brand (brand_name, company_name, ordered, description, status
)
values (‘三只松鼠’,‘三只松鼠股份有限公司’,5,‘好吃不上火’,0),
(‘华为’,‘华为技术有限公司’,100,‘华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界’,1),
(‘小米’,‘小米科技有限公司’, 50,‘are you ok’, 1);
SELECT * FROM tb_brand;
整列编辑:alt+鼠标左键
快捷生成方法:alt+insert
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是附赠给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等
详细大厂面试题答案、学习笔记、学习视频等资料领取,点击资料领取直通车免费领取!
前端视频资料:
Brand
测试用例
表的信息
=====
drop table if exists tb_brand;
– 创建tb_brand表
create table tb_brand
(
– id 主键
id int primary key auto_increment,
– 品牌名称
brand_name varchar(20),
– 企业名称
company_name varchar(20),
– 排序字段
ordered int,
– 描述信息
description varchar(100),
– 状态:0:禁用1启用
status
int
)
character set utf8;
– 添加数据
insert into tb_brand (brand_name, company_name, ordered, description, status
)
values (‘三只松鼠’,‘三只松鼠股份有限公司’,5,‘好吃不上火’,0),
(‘华为’,‘华为技术有限公司’,100,‘华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界’,1),
(‘小米’,‘小米科技有限公司’, 50,‘are you ok’, 1);
SELECT * FROM tb_brand;
整列编辑:alt+鼠标左键
快捷生成方法:alt+insert
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-pIDAv9U6-1713640888468)]
[外链图片转存中…(img-H8CwUQ68-1713640888468)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
[外链图片转存中…(img-43xLLrCX-1713640888468)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
[外链图片转存中…(img-AYLwTUGe-1713640888469)]
最后
本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是附赠给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等
详细大厂面试题答案、学习笔记、学习视频等资料领取,点击资料领取直通车免费领取!
[外链图片转存中…(img-SopECZxI-1713640888469)]
前端视频资料: