博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jdbc连接一些问题和常规操作
阅读量:6151 次
发布时间:2019-06-21

本文共 2952 字,大约阅读时间需要 9 分钟。

第一个问题:jdbc对mysql的注册驱动有两种方式第一种方式就是用反射来加载驱动,

这是com.mysql.jdbc.Driver()的源码,当你用反射去加载Driver这个类时,静态代码块就会被加载!这样就会完成mysql的驱动加载,

第二种就是,不用反射,你用new的方式加载数据库驱动,因为Driver这个就是一个实现类,但你new对象的方式有弊端,第一你产生了硬编码为什么这样说呢!

 

你可能会说那你第一种方式就不是硬编码了码,如果我使用properties文件用键值对的方式存储“com mysql.jdbc.Driver”存储起来,如果我要用oracle数据库,我就修改键值对的值就行了,

第二个问题就是你加载了两次new Driver()这个类也就是加载了两次驱动,为什么这样说呢?你想你new com.mysql.jdbc.Driver()这个类的时候,就在加载驱动,这是一次;在上面的第一种加载mysql的动态驱动的方法,哪个静态代码块也被加载了,因为静态代码块在new对象的时候会被首先执行,静态代码块也就被被执行了,里面的驱动也就被加载了!

在扯一下闲篇,你是否想过既然new对象的方式加载了两次,那就把静态代码块去掉,那如果你去掉那第一种方式用反射的方式岂不是没用了!

先贴一下两种方式的连接数据库的方式

第一种,利用反射

Class.forName("com.mysql.jdbc.Driver");    //利用反射加载mysql数据库驱动        Connection conn = null;        PreparedStatement st = null;        try {            //获取数据库连接对象            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day101","root","123456");            conn.setAutoCommit(false);//设置为手动提交sql语句,jdbc默认是自动提交,可以手动提交,但是自动提交不会有事务回滚哦!会出现脏读等现象            String sql = "update account set name=? where id=?";             st = conn.prepareStatement(sql);//获取预编译对象并且预编译sql,            //关于PreparedStatement和Statement的区别我在下一篇博客讲解            st.setObject(1,"5");//设置占位符jdbc的占位符索引从1开始            st.setObject(2, 1);             int i = st.executeUpdate();//如果i为1的话表示执行更新语句没毛病            conn.commit();//提交更新操作        } catch (SQLException e) {            try {                conn.rollback();//如果发生异常就执行回滚,防止发生脏读等不友好的操作,                //关于脏读和其他的一些数据库不友好的操作我在写一篇博客            } catch (SQLException e1) {                e1.printStackTrace();            }        }finally{            try {                /**                 * 下面的操作是执行关闭操作,步骤为从下往上关闭                 * 这里解释一下,如果你先关闭Connection这个对象的话,那么会导致后面的                 * PreparedStatement对象无效(注意这里只是无效,并没有释放物理连接哦)                 */                st.close();                conn.close();            } catch (SQLException e) {                e.printStackTrace();            }        }

 第二种方式 :利用new对象的方式进行数据库连接

Connection conn = null;		PreparedStatement st = null;		try {			//加载数据库驱动			DriverManager.registerDriver(new com.mysql.jdbc.Driver());			//获取数据库连接对象			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day101","root","123456");			conn.setAutoCommit(false);//设置为手动提交sql语句,jdbc默认是自动提交,可以手动提交			String sql = "update account set name=? where id=?"; 			st = conn.prepareStatement(sql);//获取预编译对象并且预编译sql,			//关于PreparedStatement和Statement的区别我在下一篇博客讲解			st.setObject(1,"5968");//设置占位符jdbc的占位符索引从1开始			st.setObject(2, 1);			int i = st.executeUpdate();//如果i为1的话表示执行更新语句没毛病			conn.commit();		} catch (SQLException e) {					}finally{			try {				/**				 * 下面的操作是执行关闭操作,步骤为从下往上关闭				 * 这里解释一下,如果你先关闭Connection这个对象的话,那么会导致后面的				 * PreparedStatement对象无效(注意这里只是无效,并没有释放物理连接哦)				 */				 if(st!=null){					 st.close();				 }				if(conn!=null){					conn.close();				}			} catch (SQLException e) {				e.printStackTrace();			}		}

  上面的两种方式你都要导入mysql的jar

转载于:https://www.cnblogs.com/tranquilityMan/p/10990214.html

你可能感兴趣的文章
execnet: rapid multi-Python deployment
查看>>
windows修改3389端口
查看>>
关于JavaScript词法
查看>>
FreeSwitch中的会议功能(4)
查看>>
MySQL中创建用户分配权限(到指定数据库或者指定数据库表中)
查看>>
监控利器--nagios
查看>>
ubuntu安装和查看已安装
查看>>
通过ping检测网络故障的典型次序
查看>>
Android事件处理的两种模型
查看>>
忠诚的含义
查看>>
我的友情链接
查看>>
机器学习PartIII:测试算法和NFL定理
查看>>
Python开发
查看>>
DHCP服务介绍及Linux下DHCP服务的管理配置
查看>>
网络安全系列之八 Cookie注入(注入中转)
查看>>
DVWA系列之15 文件包含漏洞利用
查看>>
开源GIS之--移动GIS
查看>>
js new Date()
查看>>
如何根据动态SQL代码自动生成DTO
查看>>
mysql 的用户管理
查看>>