0


费时五日,肝此博文,JDBC,万字详解,若遇此文,愿有所获。

文章目录

🏆JDBC

  • JDBC就是使用java语言来操作关系型数据库的一套API

JDBC本质:操作所有关系型数据库的规则,即接口

🌲JDBC快速入门

//1.注册驱动Class.forName("com.mysql.jdbc.Driver");//固定格式,MySQL 5 之后的驱动包,可以省略此步不写//2.获取连接String url="jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";String username="root";String password="123456";Connection conn =DriverManager.getConnection(url, username, password);//3.定义sqlString sql="update acount set money=money+500 where name='张三'";//4.取执行sql的对象    createStatementStatement stem = conn.createStatement();//5.执行sqlint i = stem.executeUpdate(sql);//返回的是受影响的行数//6.处理结果System.out.println(i);//7.释放资源  因为先开的connection 后开的statement  所以释放的时候相反
        stem.close();
        conn.close();

🌲JDBC API 详解

🛴DriverManager

驱动管理类(工具类 里面全部都是静态方法 )

  1. 注册驱动
  2. 获取数据库连接:DriverManager.getConnection(url, username, password); - url:连接路径 - 语法:**jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2… - 如果连接的是本机的MySQL服务,并且默认端口是3306;则url可简写为: jdbc:mysql:///数据库名称?参数键值对1&**参数键值对2…- username:用户名- password:用户密码

🛴Connection

  • 数据库连接对象作用 1. 获取执行SQL的对象
//普通执行SQL对象StatementCreateStatement()//预编译SQL的执行SQL对象:防止SQL注入PreparedStatementprepareStatement(sql)

  1. 管理事务
// 1.开启事务setAutocommit(boolean autoCommit);//true为自动提交,false为手动提交// 2.提交事务commit();// 3.回滚事务rollback();

​ 👇👇👇小案例

String url="jdbc:mysql:///db1?useSSL=false";String username="root";String password="123456";Connection conn =DriverManager.getConnection(url, username, password);String sql1;String sql2;Statement stm1;Statement stm2;try{
            conn.setAutoCommit(false);

             sql1="update acount set money=100 where name='张三'";
             sql2="update acount set money=100 where name='李四'";

             stm1 = conn.createStatement();
             stm2 = conn.createStatement();int count1 = stm1.executeUpdate(sql1);int i=3/0;//这里遇到❌,直接跳到catch,在回滚到初始状态int count2 = stm2.executeUpdate(sql2);System.out.println(count1+"\n"+count2);

            conn.commit();}catch(Exception e){
            conn.rollback();//遇到错误的话 直接catch然后回滚到原来的状态,那么update的修改没用thrownewRuntimeException(e);}
        stm1.close();
        stm2.close();
        conn.close();

🛴Statement

  • 执行SQL语句
intexecuteUpdate(sql);//执行 DML(对表中数据的增删改),DDL(对数据库或者表的增删改查) 语句//返回值:(1)DML语句影响的行数(2)DDL语句执行后,执行成功也可能返回 0

ResultsetexecuteQuery(sql);//执行DQL语句//返回值:ResultSet结果集对象//基本使用方法String sql3="select *from acount";Statement stm3 = conn.createStatement();ResultSet res = stm3.executeQuery(sql3);while(res.next()){int id=res.getInt(1);String name=res.getNString(2);double money=res.getDouble(3);System.out.println(id+","+name+","+money);}
        res.close();
        stm3.close();

🛴ResultSet

  • 封装了DQL的查询结果
  • //常用方法:(1) booleannext();//判断下一行是否为空XxxgetXxx(参数);//获取数据,这个参数有重载,可以是列表的索引(从1开始)也可以是列表的名字

🎯小练习

  • 将这个Acount表> idnamemoney1张三3002李四5003王五1000> 中的数据封装为Acount对象,并且存储到ArrayList集合中publicclassJDBCdemo{publicstaticvoidmain(String[] args)throwsClassNotFoundException,SQLException{ArrayList<Acount> a =newArrayList<>();String url="jdbc:mysql:///db1?useSSL=false";String username="root";String password="123456";Connection conn =DriverManager.getConnection(url, username, password);String sql3;Statement stm3;try{ conn.setAutoCommit(false); sql3="select *from acount"; stm3 = conn.createStatement();ResultSet res = stm3.executeQuery(sql3);while(res.next()){Acount acount =newAcount();int id=res.getInt(1);String name=res.getNString(2);double money=res.getDouble(3); acount.setId(id); acount.setMoney(money); acount.setName(name); a.add(acount);} conn.commit(); res.close(); stm3.close(); conn.close();}catch(Exception e){ conn.rollback();thrownewRuntimeException(e);}System.out.println(a);}}

🛴 PreparedStatement

在这里插入图片描述


  • 预编译SQL语句并执行,性能更高
//这里的预编译默认是关闭的,需要自己手动打开    useServerPrepStmts=trueString url="jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true";
  • 防止SQL注入问题,将敏感字符进行转义

🧨PreparedStatement原理

  1. 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)
  2. 执行时就不用再进行这些步骤,速度更快
  3. 如果sql模板一样,只需要进行一次检查,编译
  • SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
Connection con =DriverManager.getConnection(url,user,word);String name="张三";String password="' or '1' = '1";String sql="select * from user where name=? and password=?";//SQL语句中的参数值使用 ? 占位符替代//通过Connection对象获取,并传入对应的SQL语句PreparedStatement pre = con.prepareStatement(sql);//设置参数值,第一个参数是?的索引从1开始,第二个参数是参数值
        pre.setString(1,name);
        pre.setString(2,password);//执行SQL,这里不需要在传递sql语句,因为创建 PreparedStatement的时候已经传入sql语句ResultSet res = pre.executeQuery();

🌲数据库连接池

  • 是一个容器,负责分配管理数据库连接(Connnection)
  • 允许应用程序重复使用一个现有的数据库连接,不需要再新建一个
  • 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
  • 优点1. 资源重用2. 提升系统影响速率3. 避免数据库连接遗漏

  • 标准接口:DataSource- 功能:获取连接 Connection getConnection()
  • 常见的数据库连接池- DBCP- C3P0- Druid(德鲁伊) - 功能强大,性能优秀,是Java语言最好的数据库连接池之一- Druid是阿里巴巴开源的数据库连接池项目

🔑Druid使用步骤

System.out.println(System.getProperty("user.dir"));//这个可以查询你当前的包所在的路径

  • 导入jar包druid- .jar 版本自选
  • 定义配置文件- driverClassName=com.mysql.jdbc.Driver//固定形式url=jdbc:mysqL:///db1?useSSL=false&useServerPrepStmts=trueusername=rootpassword=123456//初始化连接数量initialsize=5//最大连接数maxActive=10//最大等待时间maxWait=3000
  • 加载配置文件
  • 获取数据库连接池对象
  • 获取连接
//加载配置文件 使用PropertiesProperties pro =newProperties();
        pro.load(newFileInputStream("src/cx"));//获取连接池对象DataSource dataSource =DruidDataSourceFactory.createDataSource(pro);//获取数据库连接Connection connection = dataSource.getConnection();

🎈小练习

🎃表和对象类的创建
createtable brand(
    id  intPRIMARYkeyauto_increment,
    brand_name varchar(20),
    company_name varchar(20),
    ordered  int,
    description  varchar(20),statusint);insertinto brand(brand_name,company_name,ordered,description,status)values('三只松鼠','三只松鼠有限公司',5,'好吃不上火',0),('华为','华为技术有限公司',100,'把技术带到每一位人身上',1),('小米','小米有限公司',50,'are you ok',1);

privateInteger id;privateString brandName;privateString companyName;privateInteger ordered;privateString description;//不用int 因为有默认值0 因为status在0的意义下有特殊函数// Integer是对象类型,默认值是null不会对信息产生影响privateInteger status;//    get/set/toString方法直接自动生成就可以了
🎃查询所有数据
//获取连接 ConnectionProperties pro =newProperties();
        pro.load(newFileInputStream("src/cx"));//这个路径根据你实际放的位置填写DataSource dataSource =DruidDataSourceFactory.createDataSource(pro);Connection con = dataSource.getConnection();//定义SQL语句String sql="select *from brand";//获取Connection对象  PreparedStatments对象PreparedStatement pred = con.prepareStatement(sql);ResultSet res = pred.executeQuery();ArrayList<Brand> brands =newArrayList<>();while(res.next()){Brand brand =newBrand();
            brand.setId(res.getInt(1));
            brand.setBrandName(res.getNString(2));
            brand.setCompanyName(res.getNString(3));
            brand.setOrdered(res.getInt(4));
            brand.setDescription(res.getNString(5));
            brand.setStatus(res.getInt(6));
            brands.add(brand);}System.out.println(brands);//释放资源
        res.close();
        pred.close();
        con.close();}

🎃添加数据

String name="香飘飘";String company="飘香香";int order=666;String desc="绕地球一圈";int status=1;//这里简单模拟一下用户的输入,注意,以后也不需要接收id,因为id是非空且唯一的,系统可以自动生成//获取连接 ConnectionProperties pro =newProperties();
        pro.load(newFileInputStream("src/cx"));DataSource dataSource =DruidDataSourceFactory.createDataSource(pro);Connection con = dataSource.getConnection();//定义SQL语句String sql="insert into brand(brand_name,company_name,ordered,description,status) values(?,?,?,?,?)";//获取Connection对象  PreparedStatments对象PreparedStatement pred = con.prepareStatement(sql);//添加数据需要设置参数
        pred.setString(1,name);
        pred.setString(2,company);
        pred.setInt(3,order);
        pred.setString(4,desc);
        pred.setInt(5,status);//执行SQLint i = pred.executeUpdate();//通过接收受影响的返回的行数,判断是否添加成功System.out.println(i>0);//释放资源
        pred.close();
        con.close();

🎃根据id修改

String name="香飘飘";String company="香飘飘";int order=999;String desc="绕地球三圈";int status=1;int id=4;//这里要模拟接收要修改的id//获取连接 ConnectionProperties pro =newProperties();
        pro.load(newFileInputStream("src/cx"));DataSource dataSource =DruidDataSourceFactory.createDataSource(pro);Connection con = dataSource.getConnection();//定义SQL语句String sql="update brand set brand_name=?,company_name=?,ordered=?,description=?,status=? where id=?";//获取Connection对象  PreparedStatments对象PreparedStatement pred = con.prepareStatement(sql);//添加数据需要设置参数
        pred.setString(1,name);
        pred.setString(2,company);
        pred.setInt(3,order);
        pred.setString(4,desc);
        pred.setInt(5,status);
        pred.setInt(6,id);//执行SQLint i = pred.executeUpdate();//通过接收受影响的返回的行数,判断是否添加成功System.out.println(i>0);//释放资源
        pred.close();
        con.close();

🎃根据id删除

int id=4;//模拟接受id//获取连接 ConnectionProperties pro =newProperties();
        pro.load(newFileInputStream("src/cx"));DataSource dataSource =DruidDataSourceFactory.createDataSource(pro);Connection con = dataSource.getConnection();//定义SQL语句String sql="delete from brand where id=?";//获取Connection对象  PreparedStatments对象PreparedStatement pred = con.prepareStatement(sql);//添加数据需要设置参数
        pred.setInt(1,id);//执行SQLint i = pred.executeUpdate();System.out.println(i>0);//释放资源
        pred.close();
        con.close();
标签: 数据库 mysql java

本文转载自: https://blog.csdn.net/C_x_330/article/details/124637267
版权归原作者 C_x_330 所有, 如有侵权,请联系我们删除。

“费时五日,肝此博文,JDBC,万字详解,若遇此文,愿有所获。”的评论:

还没有评论