JDBC连接数据库
JDBC,数据库目的?
数据库驱动
看到驱动 你会先想到什么?
生活中:声卡、显卡、网卡,都是电脑必备的,没有电脑就无法启动。
我们的程序会通过数据库驱动和数据库打交道。
JDBC
SUN公司未来简化 开发人员(对数据库的统一)操作,提供了一个(JAVA操作数据库的)规范,俗称: JDBC
这些规划的实现由具体的厂商去做~
java程序访问数据库mysql,有一套标准JDBC( java database connect)
驱动程序:由数据库厂商提供
jar包:mysql/oracle
注册驱动:
看清楚了,注册驱动就只有一句话:
Class.forName(“com.mysql.jdbc.Driver”);
DriverManage
DriverManager类用于加载JDBC驱动并且创建与数据库的连接。
DriverManger(驱动管理器)的作用有两个:
注册驱动:这可以让JDBC知道要使用的是哪个驱动 获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了
Connnection
Connection con = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb1”,”root”,”123”);
Connection接口代表Java程序和数据库的连接,只有获得该连接对象后,才能访问数据库,并操作数据表。
Connection对象表示连接,与数据库的通讯都是通过这个对象展开的:
Connection最为重要的一个方法就是用来获取Statement对象;
Statement
Statement stmt = con.createStatement();
//Statement是用来向数据库发送要执行的SQL语句的!
Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sq|语句, executeUpdate执行完后, 将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)。
Statement.executeQuery方法用于向数据库发生查询语句,executeQuery方法返回代表查询结果的ResultSet对象。
Statement是用来向数据库发送SQL语句的,这样数据库就会执行发送过来的SQL语句:
void executeUpdate(String sql):执行更新操作(insert、update、delete等)
1.使用executeUpdate(String sql)方法完成数据添加操作,示例操作:
Statement statement = connection.createStatement();
String sql = "insert into user(...) values(...)";
int num = statement.executeUpdate(sql);
if(num>0){
System.out.println("插入成功");
}
2.使用executeUpdate(String sql)方法完成数据删除操作,示例操作:
Statement statement = connection.createStatement();
String sql = "delete from user where id =1";
int num = statement.executeUpdate(sql);
if(num>0){
System.out.println("删除成功");
}
3.使用executeUpdate(String sql)方法完成数据修改操作,示例操作:
Statement statement = connection.createStatement();
String sql = "update user set name ='' where name = ''";
int num = statement.executeUpdate(sql);
if(num>0){
System.out.println("修改成功");
}
ResultSetexecuteQuery(String sql):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet
使用executeUpdate(String sql)方法完成数据查询操作,示例操作:
Statement statement = connection.createStatement();
String sql = "select * from user where id =1";
ResultSet rs= statement.executeQuery(sql);
if(rs.next()){
System.out.println("");
}
ResultSet
ResultSet接口用于保存JDBC执行查询时返回的结果集,该结果集封装在一个逻辑表格中。
ResultSet接口中定义了大量的getXxx()方法,而采用哪种getXxx()方法取决于字段的数据类型。
boolean next():使“行光标”移动到下一行,并返回移动后的行是否存在
XXX getXXX(int col):获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0
从数据库获取数据,返回结果表
ResultSet就是一张二维的表格,它内部有一个“行光标”,光标默认的位置在“第一行上方”,我们可以调用rs对象的next()方法把“行光标”向下移动一行,当第一次调用next()方法时,“行光标”就到了第一行记录的位置,这时就可以使用ResultSet提供的getXXX(int col)方法来获取指定列的数据了:
rs.next();//光标移动到第一行
rs.getInt(1);//获取第一行第一列的数据
当你使用rs.getInt(1)方法时,你必须可以肯定第1列的数据类型就是int类型,如果你不能肯定,那么最好使用rs.getObject(1)。在ResultSet类中提供了一系列的getXXX()方法,比较常用的方法有:
Object getObject(int col)
String getString(int col)
int getInt(int col)
double getDouble(int col)
关闭
与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。
rs.close();
stmt.close();
con.close();
MySQl数据库
常用命令
创建数据库:create database 数据库名称 ;
删除数据库:drop database 数据库名称 ;
使用数据库:use 数据库名称 ;
创建数据库表:create table 表名( 字段名称1 字段类型[default 默认值] [约束], …) ;
删除数据库表:drop table 表名 ;
查看表结构: desc 表名称 ;
查看全部数据库:show databases ;
查看一个数据库全部表: show tables ;
SQL语法基础(Structured Query Language,结构查询语句)强大的数据库语言
DML-数据操作语言:检索或修改数据
DDL-数据定义语言:定义数据的结构,创建、修改、删除
DCL-数据控制语言:定义 数据库用户的权限
步骤:
1)下载jar包,驱动包
https://mvnrepository.com/search?q=mysql
2)idea创建一个project,jdbc2011
3)src平齐目录中lib目录,把jar放进去
4)通知本项目,我要依赖这个jar包,这样才能调用
5)选择file菜单下的 project structure菜单
选择modules模块,选择Dependencies页夹
6)把jar绑定这个工程,我们代码中才能使用它
+号,选择第一个jars。。。
7)到你自己的位置
IdeaProjects\jdbc2011\lib\mysql-connector-java-5.1.32.jar
成功的条件:jar前面多了个小箭头,可以点开,展示package就代表成功
操作步骤:
idea创建一个project项目,项目名为:jdbc2011 ,然后新建一个lib文件夹,拖入jar包
配置jar包调用环境,点击File - Project~
选择Modules - DEpendencles - 最后选择+号,选择第一个jars。。。
弹出窗口后选择配置的jar包,选择后点击ok
配置完成,可以调用了
我的第一个JDBC程序格式
public class TestJDBC {
public static void main(String[] args){
//1. 加载驱动
Class.forName("com.mysql.jdbc.Driver");//固定写法
//2. 用户信息和url
//useUnicode=true&characterEncoding=utf8&&useSSL=true
String url ="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&&useSSL=false";
//mysql 默认3306
//协议://主机地址:端口号/数据库名?参数1&参数2&参数3
//Oracle--1521
//jdbc:oralce:thin:@localhost:1521:sid
String name = "root";//数据库账号
String password = "123456";//数据库密码
//3. 连接成功,返回数据库对象 connection代表数据库 PrepareStatement 执行SQL的对象
Connection connection= DriverManager.getConnection(url,name,password);
//connection代表数据库
connection.rollback();//事务回滚
connection.commit();//事务提交
connection.setAutoCommit();//数据库设置自动提交
//4. 执行SQL的对象 statement 执行SQL的对象
Statement statement = connection.createStatement();
statement.executeQuery();
statement.execute();
statement.executeUpdate();//更新,插入,删除,返回一个受影响的行数
//5. 执行SQL的对象 去执行SQL 可能存在结果,查看返回结果
String sql="SELECT * FROM users";
//ResultSet 查询的结果集,封装了所以的查询结果
//获得指定的数据类型
ResultSet resultSet = statement.executeQuery(sql);//返回的结果集,结果集中封装了我们全部查询的结果
resultSet.getObject();//在不知道列类型下使用
//如果知道则指定使用
resultSet.getString();
resultSet.getInt();
resultSet.getChar();
//遍历,指针
while(resultSet.next()){
resultSet.next(); //移动到下一个
resultSet.afterLast();//移动到最后
resultSet.beforeFirst();//移动到最前面
resultSet.previous();//移动到前一行
resultSet.absolute(row);//移动到指定行
System.out.println("id+"+resultSet.getObject("id"));
System.out.println("name+"+resultSet.getObject("NAME"));
System.out.println("password+"+resultSet.getObject("PASSWORD"));
System.out.println("email+"+resultSet.getObject("email"));
System.out.println("birthday+"+resultSet.getObject("birthday"));
}
//6. 释放连接
resultSet.close();
statement.close();
connection.close();//耗资源
}
}
执行JDBC连接代码
import java.sql.*;
public class TestJDBC {
public static void main(String[] args)
throws ClassNotFoundException, SQLException {
//通过java访问mysql数据库,查询
//这个对象获取数据库链接
//注册驱动,输入链接地址,用户名,密码
String driver = "com.mysql.cj.jdbc.Driver";
//mysql 8.0 (oracle) 把驱动包路径改了,
//8.0之前 com.mysql.jdbc.Driver
//8.0之后 com.mysql.cj.jdbc.Driver
//访问本机的mysql数据库,端口3306,数据库名
String url = "jdbc:mysql://localhost:3306/mysql-db?serverTimezone=Asia/Shanghai&characterEncoding=UTF8";
String username = "root";
String password = "root";
Class.forName(driver);
//获取到数据库链接
Connection cn = DriverManager.getConnection(url, username, password);
//创建一个Statement语句对象
Statement stat = cn.createStatement();
//执行SQL语句
String sql = "select * from student";
//把查询的结果(表记录)存放到ResultSet对象中,结果集
ResultSet rs = stat.executeQuery(sql);
//获取这个表有几个字段,元数据(描述数据的数据)
int cols = rs.getMetaData().getColumnCount();
System.out.println("表的列数:" + cols);
//展示表的字段名称
//索引值是从1开始(数据库要求)
for(int i=1;i<=cols;i++){
//"\t"代表转义,代表tab键,多个空格
System.out.print(rs.getMetaData().getColumnName(i) + "\t");
}
System.out.println();//换行
//展示数据,行数while循环,next()取下一条记录,如果没有,循环就结束
//next()有记录就返回ture,如果到最后面了,就返回false
while (rs.next()){
for (int i = 1; i <= cols; i++) {
//获取他的字段内容
System.out.print(rs.getString(i)+"\t");
}
System.out.println(); //换行
}
}
}
SQL注入:
sql存在漏洞,会被攻击导致数据泄露== SQL会被拼接 or==
public class SQL注入 {
public static void main(String[] args) {
login("root","123456");//正常登陆
//SQL注入
login("' or '1=1","123456");
}
public static void login(String name,String password){
Connection conn =null;
Statement st = null;
ResultSet rs =null;
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/mysql-db?serverTimezone=Asia/Shanghai&characterEncoding=UTF8";
String username = "root";
String password = "root";
Class.forName(driver);
Connection cn = DriverManager.getConnection(url, username, password);
Statement stat = cn.createStatement();
String sql = "select * from users where `NAME`='"+ name +"' AND `PASSWORD`='"+ password +"'" ;
ResultSet resultSet = statement.executeQuery(sql);
while (rs.next()){
System.out.println(rs.getString("NAME"));
}
//6. 释放连接
resultSet.close();
statement.close();
connection.close();//耗资源
}
}
PreparedStatement对象
PreparedStatement 可以防止SQL注入 ,效率更高。
PreparedStatement防止lSQL注入的本质,把传递进来的参数当做字符
假设其中存在转义字符,比如说 ’ 会被直按转义
新增
删除
查询
//区别
//使用问好占位符代替参数
String sql = "insert into users(id,`NAME`) values(?,?)";
pstm = connection.prepareStatement(sql);//预编译sql,先写sql然后不执行
//手动给参数赋值
pstm.setInt(1,4);//id
pstm.setString(2,"qingfeng");
pstm.setString(2,"1043051018");
pstm.setString(2,"[email protected]");
//注意点:
//sql.Date 数据库 java.sqL.Date()
//util.Date Java new Date().getTime()获得时问激
st.setDate( parameterlndex: 5,new java.sql.Date(new Date( ).getTime()));
//执行
int i = pstm.executeUpdate();
if (i>0){
System.out.println("插入成功");
}
使用IDEA连接数据库
选择你的数据库
连接数据库
选择要显示的数据库