第一个问题: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