JavaJDBC(快速理解)

1.DBC是什么?

Java DataBase Connectivity(Java语言链接数据库)

2.JDBC的本质是什么?

JDBC是SUN公司制定的一套接口(interface)
	java.sql.*; (这个软件包下有不少接口。)

JDBC本质

3.JDBC开发前的准备工做,先从官网下载对应的驱动jar包,而后将其配置到环境变量classpath当中。

classpath=.;D:\course\06-JDBC\resources\MySql Connector Java 5.1.23\mysql-connector-java-5.1.23-bin.jar

以上的配置是针对于文本编辑器的方式开发,使用IDEA工具的时候,不须要配置以上的环境变量。
IDEA有本身的配置方式。

4.JDBC编程六步(须要背会)

第一步:注册驱动(做用:告诉Java程序,即将要链接的是哪一个品牌的数据库)

第二步:获取链接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通讯,重量级的,使用完以后必定要关闭通道。)

第三步:获取数据库操做对象(专门执行sql语句的对象)

第四步:执行SQL语句(DQL DML....)

第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集。)

第六步:释放资源(使用完资源以后必定要关闭资源。Java和数据库属于进程间的通讯,开启以后必定要关闭。)
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.Statement;

public class JDBCTest{ 
	public static void main(String[] args)
	{ 	
		Connection conn= null;
		Statement stmt = null;
		ResultSet rs = null;
		try{ 
			//1.注册驱动
			//第一种方式
			Driver driver = new com.mysql.jdbc.Driver();
			DriverManager.registerDriver(driver);
			//第二种方式(一下方法不须要返回值,咱们只须要它的类加载动做)
			class.forName("com.mysql.jdbc.Driver");
			//2.获取链接
			String url = "jdbc:mysql://127.0.0.1:3306/bjpowernode";
			String user = "root";
			String password = "333";
			conn = DriverManager.getConnection(url,user,password);

			System.out.println("数据库链接对象:"+conn);
			//com.mysql.jdbc.JDBC4Connection@34340fab

			//3.获取数据库操做对象(statement专门执行sql语句)
			 stmt = conn.createStatement();
			//4.执行sql
			String sql = "select empno as a,ename,sal from emp";
			rs= stmt.executeQuery(sql); //executeUpdate执行DML语句 executeQuery(sql)执行DQL语句
			//5.处理查询结果集
			
			while(rs.next())
			{ 
				int empno = rs.getInt("a");
				String ename = rs.getString("ename");
				double sal = rs.getDouble("sal");
				System.out.pritnln(empno+","+ename+","+sal);
			}
			
		}
		catch(SQLException e){ 
			e.printStackTrace();
		}finally{ 
			try{ 
				if(stmt !=null){ 
					stmt.close();
				}
			}catch(SQLException e){ 
				e.printStackTrace();
			}
			try{ 
				if(conn !=null){ 
					conn.close();
				}
			}catch(SQLException e){ 
				e.printStackTrace();
			}
		}
  }
}

使用属性配置文件

//jdbc.propertes属性配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/bjpowernode
user=root
password=333
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.Statement;
import java.util.*;

public class JDBCTest{ 
	public static void main(String[] args)
	{ 	
		//使用资源绑定器绑定属性配置文件
		ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
		String driver = bundle.getString("driver");
		String url = bundle.getString("url");
		String user = bundle.getString("user");
		String password = bundle.getString("password");
		
		Connection conn= null;
		Statement stmt = null;
		try{ 
			//1.注册驱动
			class.forName(driver);
			//2.获取链接

			conn = DriverManager.getConnection(url,user,password);
			System.out.println("数据库链接对象:"+conn);
			//com.mysql.jdbc.JDBC4Connection@34340fab

			//3.获取数据库操做对象(statement专门执行sql语句)
			 stmt = conn.createStatement();
			//4.执行sql
			String sql = "insert into dept(deptno,dname,loc) values(50,'人事部','北京')";
			int count = stmt.executeUpdate(sql);   //执行DML语句
			System.out.println(count == 1 ? "保存成功":"保存失败");

			//5.处理查询结果集
		}
		catch(Exception e){ 
			e.printStackTrace();
		}finally{ 
			try{ 
				if(stmt !=null){ 
					stmt.close();
				}
			}catch(SQLException e){ 
				e.printStackTrace();
			}
			try{ 
				if(conn !=null){ 
					conn.close();
				}
			}catch(SQLException e){ 
				e.printStackTrace();
			}
		}
  }
}

5.登陆功能实现(防止SQL注入,PreparedStatement)

package com.bjpowernode.jdbc;

import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/*实现功能: 1.需求:模拟用户登陆功能的实现。 2.业务描述: 程序运行的时候,提供一个输入的入口,可让用户输入用户名和密码 合法:显示登陆成功。 不合法:显示登陆失败。 3.数据准备: 在实际的开发中使用建模工具 4.Sql注入现象(安全隐患): 根本缘由 fdsa ''or 将用户名或密码的or 当作了sql语句 解决SQL注入问题: 要想用户信息不参与Sql语句编译,那么必须使用java.sql.PreparedStatement PreparedStatement是属于预编译数据库操做对象,编译一次执行屡次。 PreparedStatement ps = null; 其中一个?表明一个占位符,站位符不能用点引号括起来 String sql = "select * from t_user where loginName = ? and loginPwd = ?"; ps = conn.prepareStatement(sql); 给占位符传值 ps.setString(1,loginName); ps.setString(2,loginPwd); */
public class JDBCTest06 { 
    public static void main(String[] args)
    { 
        //初始一个界面
        Map<String,String> userLoginInfo = initUI();
     	boolean loginSuccess = login(userLoginInfo);
        System.out.println(loginSuccess? "登陆成功!":"登陆失败用户名密码错误!");
    }

    private static boolean login(Map<String, String> userLoginInfo) { 
        boolean loginSuccess = false;
        Connection conn = null;
        PreparedStatement  ps = null;//这里是PreParedStatement(预编译数据库操做对象)
        ResultSet rs = null;
        try{ 
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //链接语句
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/bjpowernode","root","333");
            //获取数据库操做对象
	    String sql = "select * from t_user where loginName = ? and loginPwd = ?";
	    ps = conn.prepareStatement(sql);
	    //给占位符传值
	    ps.setString(1,userLoginInfo.get("loginName"));
	    ps.setString(2,userLoginInfo.get("loginPwd"));
	    
	    rs = ps.executeQuery();	            
            if (rs.next())
            { 
                loginSuccess = true;
            }
        }catch (ClassNotFoundException e){ 
            e.printStackTrace();

        }catch (SQLException e)
        { 
            e.printStackTrace();
        }finally { 
            if (rs !=null){ 
                try { 
                    rs.close();
                }catch (SQLException e)
                { 
                    e.printStackTrace();
                }
            }
             if (ps !=null){ 
                try { 
                    ps.close();
                }catch (SQLException e)
                { 
                    e.printStackTrace();
                }
            }
            if (conn !=null)
            { 
                try{ 
                    conn.close();
                }catch (SQLException e)
                { 
                    e.printStackTrace();
                }
            }
        }
       return loginSuccess;
    }

    /* * 初始化用户页面 * @return 用户输入用户名密码等登陆信息 * */
    private static Map<String, String> initUI() { 
        Scanner s = new Scanner(System.in);
        System.out.println("用户名:");
        String loginName = s.nextLine();

        System.out.println("密码:");
        String loginPwd = s.nextLine();

        Map<String,String> userLoginInfo = new HashMap<>();
        userLoginInfo.put("loginName",loginName);
        userLoginInfo.put("loginPwd",loginPwd);

        return userLoginInfo;
    }
}

Statement的用处(须要SQL注入)

Statement存在SQL注入问题,是编译一次执行一次。PreparedStatement执行效率高。
须要先java

用户台输入desc降序,输入asc升序,此时须要使用Sql注入
String keyWords = desc或者asc

String sql = "select ename = from emp order by ename " + keyWords;

6.帐户转帐演示事务

sql脚本
drop table if exists t_act;
create table t_act(
	actno bigint,
	balance double(7,2)  //注意:7表示有效数字,2表示小数位个数 
)insert into t_act(actno,balance) values(111,20000);
insert into t_act(actno,balance) values(222,0);
commit;
select * from t_act;
重点三句:
	conn.setAutoCommit(false);
	conn.commit();
	conn.rollback();
public class HelloWorld { 
    public static void main(String []args) { 
	  Connection conn = null;
	  PreparedStatement ps = null;
	  try{ 
	    //注册驱动
		   Class.forName("com.mysql.jdbc.Driver");
		   //获取链接
		   conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode","root","333");
		   //将自动提交机制改成手动提交
		   conn.setAutoCommit(false);//开启事务
		   
		   //获取预编译的数据库操做系统
		   String sql = "update t_act set balance = ? where actno = ?";
		   ps = conn.prepareStatement(sql);
		   
		   //给替换符赋值
		   ps.setDouble(1,10000);
     		   ps.setInt(2,111);
		   int count = ps.executeUpdate();
		   
		   ps.setDouble(1,10000);
		   ps.setInt(2,222);
		   count +=ps.executeUpdate();
		   
		   //程序到这里表示成功
		   conn.commit();  //提交事务
		   Syste.out.println(count == 2 ?"转帐成功":"转帐成功")}catch(Exception e)
		  { 
		   if(conn != null)
		   { 
		    try{ 
		     //回滚事务
		     conn.rollback();
		    }catch(SQLException e)
		    { 
		     e.printStackTrace();
		    }
		   }
		   e.printStackTrace();
		  }
		}
	}

7.JDBC工具类封装

import java.sql.*;

public class DBUtil { 

    private DBUtil() { 
    }

    //工具类的构造方法是私有的;
    //由于工具类的方法是静态的,不须要实例化
    static { 
        try { 
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) { 
            e.printStackTrace();
        }
    }

    //获取数据库链接对象
    //@return 链接对象
    public static PreparedStatement createStatement(String sql) throws SQLException { 
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode", "root", "333");

        PreparedStatement ps = conn.prepareStatement(sql);

        return ps;
    }

    //关闭资源
    //conn 链接对象
    //ps 数据库操做对象
    //rs 结果集
    public static void close(Connection conn, Statement ps, ResultSet rs) { 
        if (rs != null) { 
            try { 
                rs.close();
            } catch (SQLException e) { 
                e.printStackTrace();
            }
        }
        if (ps != null) { 
            try { 
                ps.close();
            } catch (SQLException e) { 
                e.printStackTrace();
            }
        }
        if (conn != null) { 
            try { 
                conn.close();
            } catch (SQLException e) { 
                e.printStackTrace();
            }
        }
    }
}
相关文章
相关标签/搜索