1

JavaJDBC(快速理解)

 3 years ago
source link: https://my.oschina.net/u/4926007/blog/4877520
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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执行效率高。
需要先

用户台输入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();
            }
        }
    }
}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK