JDBC初级 上

JDBC链接

一、JDBC简介:

    JDBC是一个接口集合(JDBC API),一个链接并且操作数据库的准则(设计标准),它封装了对数据库进行链接及操作的一些方法,数据库厂商可以根据这个API及其相应的数据库协议编写相应的数据库驱动,通过这个驱动程序员可以运用JAVA语言对数据库进行操作。同时JDBC提供了一套简单的管理机制驱动管理器,管理第三方驱动程序向驱动管理器注册。

    思想:根据API编写的程序都可以与驱动管理器进行通信,而驱动管理器通过驱动程序与实际数据库进行通信。

JDBC

二、JDBC分类

    第一类:JDBC/ODBC桥(不常用),驱动将JDBC翻译成ODBC,然后使用一个ODBC驱动程序与数据库进行通信。

    第二类:驱动程序由部分Java代码(类库)和本地代码组成(与平台相关),用于与数据库的客户端API进行通信。(不常用)

    第三种:驱动将一种与数据库无关的协议发送到服务器,通过服务器将请求转换成数据库相关的协议。

    第四种:驱动程序是纯Java类库,将JDBC请求直接翻译成数据库相关的协议。(最常用)

    目的:降低数据库使用者和数据库开发者之间的耦合。

三、连接方法

扫描二维码关注公众号,回复: 962784 查看本文章

    ①直接连接

   manager类:

package testJDBC;
/**
 * @date:2017/11/26
 * @time:19:53
 */
public class Manager {
    private String name;
    private String password;

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "姓名:" + name +" "+ "密码" + password;
    }
}

    连接 
package testJDBC;

import java.sql.*;

/**
 * @date:2017/11/26
 * @time:15:39
 * 功能:普通方法链接数据库
 */
public class TJDBC {

    public static void main(String[] args) throws Exception {
        Manager manager = new Manager();
        String result = null;
        Class.forName("com.mysql.jdbc.Driver");      //注册驱动程序
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/student",
                "root","123456");   //连接到数据库
        Statement stat = connection.createStatement();    //得到活动,可同时创建一个或者多个,有些数据库只可创建一个

        String si = "insert manager values('wang','0123');";
        String sd = "delete from manager where username = 'yuang';";
        String su = "update manager set username = 'yuang';";
        stat.executeUpdate(sd);    //删除数据库中的数据
        stat.executeUpdate(si);    //向数据库中从插入数据
        stat.executeUpdate(su);    //更新数据库的信息

        String sm = "select * from manager;";
        ResultSet rs = stat.executeQuery(sm);       //得到查询返回集
        //ResultSet rs1 = stat.executeQuery(sm);    //一个statement对象只能有一个结果集
        while (rs.next()){
            manager.setName(rs.getString("username"));
            manager.setPassword(rs.getString("password"));
            result = manager.toString();
            System.out.println(result);
        }
        
        connection.close();   //使用完之后应该立即关闭,可以放在带资源的try块中
        stat.close();
        rs.close();

    }
}
   

    ②读取配置文件

    配置文件database.properties   

jdbc.drivers com.mysql.jdbc.Driver
jdbc.url jdbc:mysql://localhost:3306/student
jdbc.username root
jdbc.password 123456
   

    连接数据库   

package testJDBCExecSql;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class DAO {
    private static InputStream in = null;
    private static Properties pope = new Properties();     //读取数据库配置文件
    private static Connection conn = null;       //获得连接
    public static Connection getConnectoin() {


            try {
                in = Files.newInputStream(Paths.get("E:\\IdeaWorkSpace\\database.properties"));
                pope.load(in);

                String driver = pope.getProperty("jdbc.drivers");
                String url = pope.getProperty("jdbc.url");
                String username = pope.getProperty("jdbc.username");
                String password = pope.getProperty("jdbc.password");

                conn = DriverManager.getConnection(url, username, password);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }

        return conn;
    }

    public static void closeConnecton() {
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

    注:注册数据库驱动有两种方法,上面例子介绍了最常用的方法。

    第二种方法:System.setProperty("com.mysql.jdbc.Driver");

    这种方法可以提供多个数据库驱动,中间用“,”隔开。


四、操作数据库

    ①常规方法:

   

package testJDBCExecSql;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.*;
import java.util.Properties;

/**
 * @date:2017/11/27
 * @time:12:07
 * 功能:通过配置文件链接数据库
 * 功能:通过配置文件链接数据库,普通方法对数据库进行操作
 */
public class ExecSQL {
    public static void main(String[] args){
        ManagerS manager = null;
     //   Properties props = new Properties();  //读取java的配置文件,
        Connection conn = null;
        String result = null;
        Statement stat = null;    //得到活动,可同时创建一个或者多个,有些数据库只可创建一个
        ResultSet rs = null;

        String si = "insert manager values('wang','0123');";
        String sd = "delete from manager where username = 'yuang';";
        String su = "update manager set username = 'yuang';";

        try (InputStream in = Files.newInputStream( //应用文件存储连接数据库的信息,然后读取数据库.相对路径默认是工程路径
                Paths.get("src\\testJDBCExecSql\\database.properties") )){
//            props.load(in);    //从流中读取键值对
//
//            String drivers = props.getProperty("jdbc.drivers"); //通过键值获取相应的数据
//
//            if(drivers != null)
//                Class.forName(drivers);    //注册数据库驱动
//
//
//                String url = props.getProperty("jdbc.url");     //获取连接url
//                String username = props.getProperty("jdbc.username");   //获取用户名
//                String password = props.getProperty("jdbc.password");   //获取密码
//                conn = DriverManager.getConnection(url,username,password);   //连接数据库
//
//                System.out.println(drivers);     //将数据库连接的基本数据输出
//                System.out.println(url);
//                System.out.println(username);
//                System.out.println(password);
                conn = DAO.getConnectoin();

                stat = conn.createStatement();

                stat.executeUpdate(sd);    //删除数据库中的数据
                stat.executeUpdate(si);    //向数据库中从插入数据
                stat.executeUpdate(su);    //更新数据库的信息

                String sm = "select * from manager;";
                rs = stat.executeQuery(sm);       //得到查询返回集
                //ResultSet rs1 = stat.executeQuery(sm);    //一个statement对象只能有一个结果集

                while (rs.next()){
                    manager = new ManagerS();   //刚才忘了定义所以报错,空指针
                    manager.setName(rs.getString("username"));
                    manager.setPassword(rs.getString("password"));
                    result = manager.toString();
                    System.out.println(result);
//                  manager.setName(rs1.getString("username"));
//                  manager.setPassword(rs1.getString("password"));
//                  result = manager.toString();
//                  System.out.println(result);
                }
        } catch (IOException e) {
            System.out.println("找不到文件");
        } catch (SQLException e1) {
            System.out.println("数据库异常");
        } finally {
            try {
                conn.close();   //使用完之后应该立即关闭,可以放在带资源的try块中
                stat.close();
                rs.close();
            } catch (SQLException e) {
                System.out.println("关闭失败");
            }

        }

    }

}

    ②预处理方式

   

package testJDBCExecSql;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.*;
import java.util.Properties;
import java.util.Scanner;

/**
 * @date:2017/11/27     
 * @time:16:52
 *
 * 功能:通过配置文件链接数据库,同时通过预备查询,来查询数据
 */  
public class Prepared {
    public static void main(String[] args){

        Properties pops = new Properties();
        Connection conn = null;
        int stuno = 0;
        Scanner s = new Scanner(System.in);
        PreparedStatement pstat = null;

        try {

            conn = DAO.getConnectoin();
            String select  = "select stuno,stuname,stusex from t_student where stuno = ? "; //预定义的查询语句

            pstat = conn.prepareStatement(select);    //得到一个活动
            System.out.println("请输入学生学号(如:001):");
            pstat.setString(1,s.nextLine());    //根据宿主变量的序号来绑定宿主变量的值,宿主变量的值一旦绑定就会存在,

                                                              //除非调用clearParameters 来清空或者重新绑定新的值
            ResultSet rs = pstat.executeQuery();
            while (rs.next()){
                System.out.print("姓名:"+rs.getString("stuname") + " ");
                System.out.println("性别:"+rs.getString("stusex"));

            }


        } catch (SQLException e) {
            e.printStackTrace();
        }

        finally {
            try {
                conn.close();
                pops.clear();
                pstat.close();

            } catch (SQLException e) {
                e.printStackTrace();
            }

        }

    }
}
    注:一个Connection对象可以创建一个或者多个Statement对象,但是一个Statement对象,只能有一个打开的结果集。使用完这些链接资源之后必须及时的关闭。
    预处理语句在涉及到变量的时候应用,一般不用,相应的查询被预备两次,数据库通常会直接重用查询策略。

    能用sql解决不用java语句。




     

猜你喜欢

转载自blog.csdn.net/qq_32270067/article/details/78669711