jdbc连接一些问题和常规操作

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

猜你喜欢

转载自www.cnblogs.com/tranquilityMan/p/10990214.html