JDBC_学习笔记(婷姐教的)
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_学习笔记(婷姐教的)相关推荐
- 【Arduino学习笔记】手把手教你使用ESP8266----①接线篇
在物联网时代搞技术就必须跟网络沾上边,这两天把前段时间淘宝上淘的ESP8266模块拿出来捣鼓了一下,初学Arduino,对硬件模块没啥了解,刚开始简直无从下手,在几个技术QQ群求教未果,技术大大们对我 ...
- (学习笔记)手把手教你学51单片机:C语言基础以及流水灯的实现
一.进制 二进制:0和1 前缀0b 十六进制:四个二进制为一位,0-9加上A-F(或a-f) 前缀0x 二.C语言变量类型和范围 字符型.整型.长整型.浮点型.每一种又分为有符号/无符号 ...
- (学习笔记)手把手教你学51单片机:变量进阶与点阵LED
一.变量的作用域 作用域:变量的有效范围.分为:局部变量和全局变量. 1.1局部变量 在函数内部声明的变量,只在本函数内部可以使用. 1.2全局变量 在函数外声明的变量就是全局变量. 二.变量的存储类 ...
- window环境下安装mysql(超级详细--婷姐教的)
window环境下安装mysql 一.卸载 1.软件的卸载 ①通过控制面板 ②通过电脑管家等软件卸载 ③通过安装包中提供的卸载功能卸载 2.清理残余文件 ①清除安装残余文件 ②清除数据残余文件 ③清理 ...
- ES6学习笔记(三):教你用js面向对象思维来实现 tab栏增删改查功能
前两篇文章主要介绍了类和对象.类的继承,如果想了解更多理论请查阅<ES6学习笔记(一):轻松搞懂面向对象编程.类和对象>.<ES6学习笔记(二):教你玩转类的继承和类的对象>, ...
- MySQL学习笔记——尚硅谷李玉婷经典版MySQL基础笔记(一)
MySQL学习笔记--尚硅谷李玉婷经典版MySQL基础笔记(一) MySQL学习笔记目录 MySQL学习笔记--尚硅谷李玉婷经典版MySQL基础笔记(一) 一.基础知识 1.MySQL的语法规范 2. ...
- 腾讯T2大牛亲自教你!5214页PDF的进阶架构师学习笔记,终局之战
我,来自大山. 我,不甘平凡. 笔者80后,出生在江西一个偏远的山村.虽然出生时已经不是那个温饱都是问题的年代,但是也谈不上有个幸福的童年.家里很穷.幼儿园并没有读,因为家里觉得花那个钱没有必要,小学 ...
- 腾讯T3大牛亲自教你!这么香的技术还不快点学起来,书籍+视频+学习笔记+技能提升资源库
为什么想跳槽? 简单说一下当时的状况,我在这家公司做了两年多,这两年多完成了一个大项目,作为开发的核心主力,开发压力很大,特别是项目上线前的几个月是非常辛苦,几乎每晚都要加班到12点以后,周末最多只有 ...
- JavaWeb学习笔记(5)-B站尚硅谷
文章目录 十四.书城项目第三阶段--优化 (1)页面jsp动态化 (2)抽取页面中相同的内容 A.登录成功的菜单 B.base.css.jQuery标签 C.每个页面的页脚 D.manager模块的菜 ...
最新文章
- 【知识碎片】Asp.Net 篇
- 相机成像原理_数码相机的工作原理
- android 静态方法 构造方法,android基础-Java篇02:类和对象、构造方法、访问权限控制、重载、this关键字、static关键字...
- python struct pack一个数组_Python中struct.pack的一个疑问
- Bounding-box_regression详解
- tensorflow 转张量类型为float_一文看懂TensorFlow计算图
- cactiez v11使用配置mysql_cactiez应用监控部署手册.doc
- Android Multimedia框架总结(十)Stagefright框架之音视频输出过程
- bootstrap-table 表格加载中....处理
- python中home定义是什么_搞清楚Python中self的含义
- 《OSPF网络设计解决方案(第2版)》一1.4 TCP/IP协议簇
- 自制计算机考试系统,用WPS表格制作考试系统 -电脑资料
- 《自卑与超越》读书笔记优秀范文3200字
- Tibco Designer -- 构建EAR文件
- 英雄联盟|王者|穿越火线 bgm AI配乐大赛分享
- 网络云盘前端项目启动
- UVA 487 - Boggle Blitz
- Qt编写安防视频监控系统18-云台控制
- speedoffice(word)如何修改行间距
- 简单图+Havel_Hakimi定理