MySQL 学习笔记(三)

编程入门 行业动态 更新时间:2024-10-14 00:30:54

MySQL <a href=https://www.elefans.com/category/jswz/34/1770117.html style=学习笔记(三)"/>

MySQL 学习笔记(三)

MySQL 学习笔记(三)


1、JDBC

1.1、数据库驱动

驱动:声卡,显卡,数据库

程序会通过数据库驱动,和数据库打交道

1.2、JDBC

SUN公司为了简化开发人员对数据库的统一操作,提供了一个JAVA操作数据库的规范,俗称JDBC

java.sql

javax.sql

1.3、第一个JDBC程序

创建一个数据库

CREATE DATABASE `jdbcStudy` CHARACTER SET utf8 COLLATE utf8_general_ci;USE `jdbcStudy`;CREATE TABLE `users`(`id` INT PRIMARY KEY,`NAME` VARCHAR(40),`PASSWORD` VARCHAR(40),`email` VARCHAR(60),birthday DATE
);INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)
VALUES('1','zhangsan','123456','zs@sina.com','1980-12-04'),
('2','lisi','123456','lisi@sina.com','1981-12-04'),
('3','wangwu','123456','wangwu@sina.com','1979-12-04')

使用JDBC连接

package com.young.lesson;import java.sql.*;public class firstJdbc {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1. 加载驱动Class.forName("com.mysql.jdbc.Driver");String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&&useSSL=false&serverTimezone=GMT%2B8";//2. 用户信息和urlString username="root";String password="TWJR2L_rdst.";//3. 连接成功,数据库对象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"));}//6. 释放连接resultSet.close();statement.close();connection.close();}}
  • 加载驱动 class.forname
  • 连接数据库 DriverManager
  • 获得执行sql的对象 Statement
  • 获得返回的结果集
  • 释放连接

1.4、JDBC对象的诠释

DriverManger

 Class.forName("com.mysql.jdbc.Driver");//加载驱动

url

String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&&useSSL=false&serverTimezone=GMT%2B8";// mysql --3306
//jdbc:mysql://主机地址:端口号/数据库名?参数1&参数2&参数3
// oracle --1521

Connection

Connection connection= DriverManager.getConnection(url,username,password);
//connection代表数据库
//可回滚、提交

Statement 执行SQL的对象

Statement statement = connection.createStatement();String sql="SELECT * FROM USERS";//编写SQL
statement.execute();//执行任何SQL
statement.executeUpdate();//更新、插入、删除,均使用,返回一个受影响hi昂的行数
statement.executeQuery();//查询返回ResultSet

ResultSet 查询结果集:封装了所有的结果

    resultSet.getObject();// 在不知道列类型的情况下使用    //在知道列类型的情况下使用resultSet.getString();resultSet.getInt();resultSet.getDouble();resultSet.getBoolean();resultSet.beforeFirst();//移动到最前面resultSet.afterLast();//移动到最后面resultSet.next();//移动到下一个resultSet.previous();//移动到前一行resultSet.absolute(row);//移动到指定行 

释放资源

      resultSet.close();statement.close();connection.close();

connection 连接十分占用内存,用完需要关掉!

1.5、Statement对象


用于向数据库发送SQL语句

代码实现

  1. 提取工具类

SQL注入的问题

sql存在漏洞,导致被攻击可能会泄露

public class SQLinject {public static void main(String[] args) {//login("young","123456");正常登录login("'or '1=1 ","123");//注入}public  static void login(String username,String password){Connection conn=null;Statement st=null;ResultSet re=null;try {conn = jdbcUtils.getConnection();st=conn.createStatement();String sql="SELECT * FROM users where `NAME`= '"+username+"' AND `password` ='"+password+"'";System.out.println(sql);re=st.executeQuery(sql);if(re!=null){System.out.println("登录成功!");while(re.next()){System.out.println("id="+re.getObject("id"));System.out.println("NAME="+re.getObject("NAME"));System.out.println("pwd="+re.getObject("PASSWORD"));System.out.println("email="+re.getObject("email"));System.out.println("birth="+re.getObject("birthday"));}}} catch (SQLException e) {e.printStackTrace();} finally{jdbcUtils.release(conn,st,re);}}
}

1.6、 PreparedStatement对象


可以防止SQL注入,并且效率更高

1、新增

2、更新

3、删除

4、查询

public class SQLinject {public static void main(String[] args) {//  login("biubiu","123456");//正常登录login("'' or 1=1","123");//注入}public  static void login(String username,String password){Connection conn=null;PreparedStatement st=null;ResultSet re=null;try {conn = jdbcUtils.getConnection();// PreparedStatement 防止SQL注入的本质:把传递进来的参数当作字符// 假设其中存在转移字符 比如说`会被直接转义String sql="SELECT * FROM users where `NAME`=? AND `password`=?";st=conn.prepareStatement(sql);st.setString(1,username);st.setString(2,password);re=st.executeQuery();if(re!=null){System.out.println("登录成功!");while(re.next()){System.out.println("id="+re.getObject("id"));System.out.println("NAME="+re.getObject("NAME"));System.out.println("pwd="+re.getObject("PASSWORD"));System.out.println("email="+re.getObject("email"));System.out.println("birth="+re.getObject("birthday"));}}} catch (SQLException e) {e.printStackTrace();} finally{jdbcUtils.release(conn,st,re);}}
}

1.7、 事务

ACID 原则

  • 原子性:要么全部完成,要么都不完成
  • 一致性:总数不变
  • 隔离性:多个进程互不干扰
  • 持久性:一旦提交不可逆

隔离性的问题:

  • 脏读:一个事务读取了另一个没用提交的事务
  • 不可重复读:在同一个事务内,重复读取表中的数据,数据发生了改变
  • 虚读(幻读):在一个事务内,读取到了别人插入到的数据,导致前后数据不一致

代码实现

1、开启事务

2、一组业务执行完毕,提交事务

3、可以在catch语句中执行回滚(但实际上已经有默认的回滚)

public class Transaction {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 money=money-100 where name='A'";st=conn.prepareStatement(sql1);st.executeUpdate();int x=1/0; //会报错String sql2="update account set money=money-100 where name='B'";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.release(conn,st,rs);}}
}

1.8、 数据库连接池

数据库连接–执行完毕–释放

连接–释放 十分浪费系统资源

池化技术:准备一些预先的资源,过来就连接预先准备好的

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

开源数据源实现

  • DBCP

  • C3P0

  • Druid

使用了这些数据库连接池之后,我们就不需要编写连接数据库的代码了!

DBCP

public class jdbcUtils_dpcp {private static DataSource dataSource=null;static {try{InputStream in = jdbcUtils_dpcp.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");Properties properties=new Properties();properties.load(in);//创建数据源 工厂模式 创建对象dataSource =  BasicDataSourceFactory.createDataSource(properties);}catch (Exception e){e.printStackTrace();}}//获取连接public static Connection getConnection() throws SQLException {return dataSource.getConnection();//从数据源中获取连接}//释放连接资源public  static  void  release(Connection conn, Statement st, ResultSet re){if(re!=null){try {re.close();} catch (SQLException e) {e.printStackTrace();}}if(st!=null){try {st.close();} catch (SQLException e) {e.printStackTrace();}}if(conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}

c3p0

public class jdbcUtils_c3p0 {private static DataSource dataSource=null;static {try{//创建数据源 工厂模式 创建对象dataSource= new ComboPooledDataSource();}catch (Exception e){e.printStackTrace();}}//获取连接public static Connection getConnection() throws SQLException {return dataSource.getConnection();//从数据源中获取连接}//释放连接资源public  static  void  release(Connection conn, Statement st, ResultSet re){if(re!=null){try {re.close();} catch (SQLException e) {e.printStackTrace();}}if(st!=null){try {st.close();} catch (SQLException e) {e.printStackTrace();}}if(conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}

更多推荐

MySQL 学习笔记(三)

本文发布于:2023-07-28 20:00:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1295034.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:学习笔记   MySQL

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!