JDBC

  • 一.介绍什么是JDBC
  • 二.JDBC简单的使用步骤
    • 1.加载驱动
    • 2.获取连接
    • 3.执行增删改查
    • 4.关闭连接
  • 三.使用PreparedStatmment实现登录
    • PreparedStatement和Statement的区别
  • 四.JDBC的相关API
    • DriverManager驱动管理类
    • Connection裂解对象接口
    • Statement命令对象接口
    • PreparedStatement预编译命令对象接口
    • ResultSet结果接对象接口
  • 五.事物Transaction
    • 使用步骤
      • 1.开启新事物
      • 2.编写组成事物的一组sql语句
      • 3,结束事务
  • 六.批处理(Batch)
    • 相关API
      • addBatch
      • executeBatch
      • clearBatch
  • 七.Blob类型数据的读写
  • 八.Druid德鲁伊连接池的使用
  • 九.DBUtils的使用

一.介绍什么是JDBC

JDBC:Java Database Connectivity java和数据库的连接技术,sun公司推出的一套java应用程序访问数据库的技术规范。
规范方法:抽象类或接口.

二.JDBC简单的使用步骤

前提: 准备mysql的驱动包,加载到项目找那个

复制mysql-connector-java-5.1.37-bin.jar到项目的根目录下或libs目录下,然后右击build path——add to build path

1.加载驱动
2.获取连接
3.执行增删改查操作
4.关闭连接
案例:

public class TestConnection {public static void main(String[] args) throws SQLException {//1.加载驱动DriverManager.registerDriver(new Driver());//2.获取连接Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/girls", "root", "root");//3.执行增删改查//3-1.编写sql语句//删除
//      String sql = "delete from beauty where id = 9";//更新
//      String sql = "update beauty set name='关晓彤' where id = 7";//增加String sql = "insert into beauty values(null,'小龙女','女','1998-1-1','110',null,3)";//3-2.获取执行sql语句的命令对象Statement statement = connection.createStatement();//3-3.使用命令对象指向sql语句int update = statement.executeUpdate(sql);//3-4.处理执行结果  System.out.println(update>0?"success":"failure");//4.关闭连接statement.close();connection.close();       }
}

1.加载驱动

类的加载时机:
① new 对象
②加载子类时父类会被加载
③调用类中的静态成员
④ 通过反射
以上4种方式都可以加载类;
使用new 对象的方式加载类的不足:

DriverManager.deregisterDriver(new Driver());

1.属于编译器加载,如果在编译期间该类不存在,则直接报编译错误,也就是依赖性太强
2.导致Driver对象创建了两遍,效率较低.(new Driver() 一次,new完会加载Driver类,该类有个静态代码块,当中会再次常见该对象).

采用反射的方式加载类:
1.属于运行期间夹加载,大大降低了类的依赖性
2.Driver 对象仅仅创建1遍,效率较高.

Class.forName("com.mysql.jdbc.Driver");

2.获取连接

Connection connectin = DriverManager.getConnection(url,user,password);

3.执行增删改查

①编写sql命令

String sql = "select id,name,sex,borndate form beauty";

②获取执行sql的命令对象

Statement statement = connection.createStatement();

③执行sql语句

//执行增删改
//int updateRow = statement.executeUpdate(sql);
//执行查询,返回结果集
ResultSet set = statement.executeQuert(sql);

④处理执行后的结果

while(set.next()){int id=set.getInt(1);String name = set.getString(2);String sex = set.getString(3);Date date = set.getDate(4);System.out.println(id+"\t"+name+"\t"+sex+"\t"+date);
}

4.关闭连接

set.close();
statement.close();
connection.close();

三.使用PreparedStatmment实现登录

//使用PreparedStatement实现登录@Testpublic void testPreparedStatement() throws Exception{Scanner input  = new Scanner(System.in);System.out.println("Please input username:");String username = input.next();System.out.println("Please input password:");String pwd = input.next();//----------------以下为连接数据库的步骤---------------------------Properties info  = new Properties();info.load(new FileInputStream("src\\jdbc.properties"));String user = info.getProperty("user");String password = info.getProperty("password");String driver = info.getProperty("driver");String url = info.getProperty("url");//1.注册驱动Class.forName(driver);//2.获取连接Connection connection = DriverManager.getConnection(url, user, password);//3.执行查询//3-1 编写sqlString sql = "SELECT COUNT(*) FROM admin WHERE username =?  AND PASSWORD=?";//3-1 获取PreparedStatement命令对象PreparedStatement statement = connection.prepareStatement(sql);//预编译//3-2 设置占位符的值statement.setString(1, username);statement.setString(2, pwd);//3-3 执行sql命令
//      int update = statement.executeUpdate();//执行增删改,返回受影响的行数ResultSet set = statement.executeQuery();//执行查询,返回结果集if (set.next()) {int count = set.getInt(1);System.out.println(count>0?"Login Success!":"Login Failure!!");} //4.关闭set.close();statement.close();connection.close();}

PreparedStatement和Statement的区别

关系:
二者都是属于执行sql语句的命令接口,都提供了一系列执行sql语句的方法,PrepareStatement继承了Statement
使用PreparedStatement的好处:
①不再使用+拼接sql语句,减少语法错误,语义性强
②将模板sql(固定的部分)和参数部分进行了分离,提高维护性;
③有效的解决了sql注入问题
④大大减少了编译次数,效率较高
10条sql语句,仅仅只是参数不同
使用Statement,则需要编译10次,执行10次
使用PreparedStatement,只需编译1次,执行10次

四.JDBC的相关API

DriverManager驱动管理类

registDriver(Driver对象): 注册驱动,不推荐使用
getConnection(url,user,pwd) : 获取连接

Connection裂解对象接口

createStatement(): 生成命令对象
prepareStatement(sql): 生成预编译命令对象

Statement命令对象接口

executeUpdate(sql) : 执行增删改语句,返回受影响的行数
executeQuery(sql) : 执行查询语句,返回结果接
execute(sql) : 执行任意sql语句,返回boolean

PreparedStatement预编译命令对象接口

executeUpdate():执行增删改语句,返回受影响的行数
​executeQuery():执行查询语句,返回结果集
​execute():执行任意sql语句,返回boolean
setXX(占位符索引,占位符的值):设置对应索引的占位符的值,类型为XX类型
setObject(占位符索引,占位符的值):设置对应索引的占位符的值,类型为Object类型

ResultSet结果接对象接口

next(): 下移一行,返回当前行是否有值
previous():上移一行,返回当前行是否有值
getXX(列索引|列名|别名):返回对应列的值,接收类型为XX
getObject(列索引|列名|别名):返回对应列的值,接收类型为Object

五.事物Transaction

使用步骤

1.开启新事物

取消隐式事物自动提交的功能

setAutoCommit(false);

2.编写组成事物的一组sql语句

3,结束事务

commit(); 提交
rollback();  回滚

细节:
要求开启事务的连接对象和获取命令的连接对象必须是同一个,否则事务无效;

六.批处理(Batch)

相关API

addBatch

executeBatch

clearBatch

说明:批处理往往和PreparedStatement一起搭配使用,可以既减少编译此时,又减少运行次数,效率大大提高;追加url:?rewriteBatchedStatements=true

注:JDBC连接MySQL时,如果要使用批处理功能,请再url中加参数?rewriteBatchedStatements=true
PreparedStatement作批处理插入时使用values(使用value没有效果)

演示代码:

public class TestBatch {//么有使用批处理@Testpublic void testNoBatch() throws SQLException{//1.获取连接Connection connection = JDBCUtils.getConnection();//2.执行插入PreparedStatement statement = connection.prepareStatement("insert into admin values(null,?,?)");for(int i=1;i<=50000;i++){statement.setString(1,"john"+i);statement.setString(2, "0000");statement.executeUpdate();//执行}//3.释放资源JDBCUtils.close(null, statement, connection);}//使用批处理@Testpublic void testBatch() throws SQLException{//1.获取连接Connection connection = JDBCUtils.getConnection();//2.执行插入PreparedStatement statement = connection.prepareStatement("insert into admin values(null,?,?)");for(int i=1;i<=50000;i++){statement.setString(1,"john"+i);statement.setString(2, "0000");statement.addBatch();//添加sql语句到批处理包中if(i%1000==0){statement.executeBatch();//执行批处理包中的sql语句statement.clearBatch();//清空批处理包中的sql语句}}//3.释放资源JDBCUtils.close(null, statement, connection);}}

七.Blob类型数据的读写

MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。
MySQL的四种BLOB类型(除了在存储的最大信息量上不同外,他们是等同的)
实际使用中根据需要存入的数据大小定义不同的BLOB类型。
需要注意的是:如果存储的文件过大,数据库的性能会下降
案例演示:

/*** 此类用于演示Blob类型数据的存取* @author * 相关API:* * setBlob(占位符索引,InputStream对象)* getBlob(列索引或列名)* getBinaryStream(列索引或列名)* */
public class TestBlob {//存图片@Testpublic void testSave() throws SQLException, Exception{//1.获取连接Connection connection = JDBCUtils.getConnection();//2.执行修改语句PreparedStatement statement = connection.prepareStatement("update beauty set photo=? where id = 1");statement.setBlob(1, new FileInputStream("src\\6.jpg"));int update = statement.executeUpdate();//3.关闭连接JDBCUtils.close(null, statement, connection);}//读图片@Testpublic void testRead() throws SQLException, Exception{//1.获取连接Connection connection = JDBCUtils.getConnection();//2.执行修改语句PreparedStatement statement = connection.prepareStatement("select photo from beauty where id = 1");ResultSet set = statement.executeQuery();if(set.next()){//方式1:
//          Blob blob = set.getBlob("photo");
//          InputStream binaryStream = blob.getBinaryStream();//方式2:InputStream inputStream = set.getBinaryStream("photo");FileOutputStream fos = new FileOutputStream("src\\beauty.jpg");int len;byte[] b = new byte[1024];while((len=inputStream.read(b))!=-1){fos.write(b,0,len);}fos.close();inputStream.close();}//3.关闭连接JDBCUtils.close(null, statement, connection);}
}

八.Druid德鲁伊连接池的使用

开源框架的使用步骤:
1.导入jar包
2.看帮助
3.调用方法,去使用

public void testDataSource() throws Exception{Properties properties = new Properties();properties.load(new FileInputStream("src\\druid.properties"));//1.创建了一个指定参数的数据库连接池DataSource ds = DruidDataSourceFactory.createDataSource(properties);//2.从数据库连接池中获取可用的连接对象Connection connection = ds.getConnection();System.out.println("连接成功");//3.关闭连接connection.close();}
//测试C3P0数据库连接池的方式1:@Testpublic void testC3P0() throws Exception{ComboPooledDataSource cpds = new ComboPooledDataSource();cpds.setDriverClass( "com.mysql.jdbc.Driver" ); //loads the jdbc driver            cpds.setJdbcUrl( "jdbc:mysql://localhost:3306/girls" );cpds.setUser("root");                                  cpds.setPassword("root");    cpds.setInitialPoolSize(10);cpds.setMaxPoolSize(50);Connection connection = cpds.getConnection();System.out.println("连接成功");connection.close();}//测试C3P0数据库连接池的方式2:@Testpublic void testC3P02() throws Exception{ComboPooledDataSource cpds = new ComboPooledDataSource("hello");Connection connection = cpds.getConnection();System.out.println("连接成功");connection.close();    }

此类是通过德鲁伊数据库连接池获取连接对象,以后这么写

package com.atguigu.utils;import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;import javax.sql.DataSource;import com.alibaba.druid.pool.DruidDataSourceFactory;/*** 此类是通过德鲁伊数据库连接池获取连接对象* @author **/
public class JDBCUtilsByDruid {static DataSource ds;static{try {Properties properties = new Properties();properties.load(new FileInputStream("src\\druid.properties"));//1.创建了一个指定参数的数据库连接池ds = DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}public static Connection getConnection() throws Exception{//2.从数据库连接池中获取可用的连接对象return ds.getConnection();}/*** 功能:释放资源* @param set* @param statement* @param connection* @throws Exception*/public static void close(ResultSet set,Statement statement,Connection connection){try {if (set!=null) {set.close();}if (statement!=null) {statement.close();}if (connection!=null) {connection.close();}} catch (SQLException e) {throw new RuntimeException(e);}}
}

九.DBUtils的使用

功能: 封装了和数据库存取相关的一些方法
通用的增删改查等等
使用步骤:
1.导入jar包commons-dbutils-1.3.jar
2.看帮助
3.使用
QueryRunner类:

  •  update(connection,sql,params):执行任何增删改语句
    
  •  query(connection,sql,ResultSetHandler,params):执行任何查询语句
    

ResultSetHandler接口

  •  BeanHandler:将结果集的第一行,封装成对象,并返回                     new BeanHandler<>(XX.class)
    
  •  BeanListHandler:将结果集中的所有行,封装成对象的集合,并返回        new BeanListHandler<>(XX.class)
    
  •  ScalarHandler:将结果集中的第一行第一列,以Object形式返回   new ScalarHandler()
    

JDBC_学习笔记(婷姐教的)相关推荐

  1. 【Arduino学习笔记】手把手教你使用ESP8266----①接线篇

    在物联网时代搞技术就必须跟网络沾上边,这两天把前段时间淘宝上淘的ESP8266模块拿出来捣鼓了一下,初学Arduino,对硬件模块没啥了解,刚开始简直无从下手,在几个技术QQ群求教未果,技术大大们对我 ...

  2. (学习笔记)手把手教你学51单片机:C语言基础以及流水灯的实现

    一.进制 二进制:0和1 前缀0b       十六进制:四个二进制为一位,0-9加上A-F(或a-f)  前缀0x 二.C语言变量类型和范围 字符型.整型.长整型.浮点型.每一种又分为有符号/无符号 ...

  3. (学习笔记)手把手教你学51单片机:变量进阶与点阵LED

    一.变量的作用域 作用域:变量的有效范围.分为:局部变量和全局变量. 1.1局部变量 在函数内部声明的变量,只在本函数内部可以使用. 1.2全局变量 在函数外声明的变量就是全局变量. 二.变量的存储类 ...

  4. window环境下安装mysql(超级详细--婷姐教的)

    window环境下安装mysql 一.卸载 1.软件的卸载 ①通过控制面板 ②通过电脑管家等软件卸载 ③通过安装包中提供的卸载功能卸载 2.清理残余文件 ①清除安装残余文件 ②清除数据残余文件 ③清理 ...

  5. ES6学习笔记(三):教你用js面向对象思维来实现 tab栏增删改查功能

    前两篇文章主要介绍了类和对象.类的继承,如果想了解更多理论请查阅<ES6学习笔记(一):轻松搞懂面向对象编程.类和对象>.<ES6学习笔记(二):教你玩转类的继承和类的对象>, ...

  6. MySQL学习笔记——尚硅谷李玉婷经典版MySQL基础笔记(一)

    MySQL学习笔记--尚硅谷李玉婷经典版MySQL基础笔记(一) MySQL学习笔记目录 MySQL学习笔记--尚硅谷李玉婷经典版MySQL基础笔记(一) 一.基础知识 1.MySQL的语法规范 2. ...

  7. 腾讯T2大牛亲自教你!5214页PDF的进阶架构师学习笔记,终局之战

    我,来自大山. 我,不甘平凡. 笔者80后,出生在江西一个偏远的山村.虽然出生时已经不是那个温饱都是问题的年代,但是也谈不上有个幸福的童年.家里很穷.幼儿园并没有读,因为家里觉得花那个钱没有必要,小学 ...

  8. 腾讯T3大牛亲自教你!这么香的技术还不快点学起来,书籍+视频+学习笔记+技能提升资源库

    为什么想跳槽? 简单说一下当时的状况,我在这家公司做了两年多,这两年多完成了一个大项目,作为开发的核心主力,开发压力很大,特别是项目上线前的几个月是非常辛苦,几乎每晚都要加班到12点以后,周末最多只有 ...

  9. JavaWeb学习笔记(5)-B站尚硅谷

    文章目录 十四.书城项目第三阶段--优化 (1)页面jsp动态化 (2)抽取页面中相同的内容 A.登录成功的菜单 B.base.css.jQuery标签 C.每个页面的页脚 D.manager模块的菜 ...

最新文章

  1. 【知识碎片】Asp.Net 篇
  2. 相机成像原理_数码相机的工作原理
  3. android 静态方法 构造方法,android基础-Java篇02:类和对象、构造方法、访问权限控制、重载、this关键字、static关键字...
  4. python struct pack一个数组_Python中struct.pack的一个疑问
  5. Bounding-box_regression详解
  6. tensorflow 转张量类型为float_一文看懂TensorFlow计算图
  7. cactiez v11使用配置mysql_cactiez应用监控部署手册.doc
  8. Android Multimedia框架总结(十)Stagefright框架之音视频输出过程
  9. bootstrap-table 表格加载中....处理
  10. python中home定义是什么_搞清楚Python中self的含义
  11. 《OSPF网络设计解决方案(第2版)》一1.4 TCP/IP协议簇
  12. 自制计算机考试系统,用WPS表格制作考试系统 -电脑资料
  13. 《自卑与超越》读书笔记优秀范文3200字
  14. Tibco Designer -- 构建EAR文件
  15. 英雄联盟|王者|穿越火线 bgm AI配乐大赛分享
  16. 网络云盘前端项目启动
  17. UVA 487 - Boggle Blitz
  18. Qt编写安防视频监控系统18-云台控制
  19. speedoffice(word)如何修改行间距
  20. 简单图+Havel_Hakimi定理

热门文章

  1. 机器学习——决策树实践(预测隐形眼镜类型)
  2. 在闲鱼搜“离开北上广”,才知道这届年轻人有多不容易
  3. excel二级联动制作
  4. 登录MySQL服务器
  5. PHP在线横幅广告logo图标制作网站源码
  6. Codeforces 1339 B. Sorted Adjacent Differences
  7. spring resteasy单元测试
  8. 史上前端面试最全知识点
  9. Java8中的日期与时间处理
  10. 如何快速的找到动漫,电影资源