jdbc(mysql)数据库连接

0.将驱动引入项目

  • 在项目根目录新建文件夹lib,把数据库驱动mysql-connector-java-5.1.7-bin.jar放入该文件夹。
  • 右键点击项目名称->properties->Java Build Path->Libraries->Add JARs->找到驱动文件->搞定

  什么是mysql-connector-java-5.1.7-bin.jar

  数据库驱动。

  为什么要另外引入一个jar包sun公司怎么没有实现这些功能

  因为市面上有很多数据库mysql oracle sqlserver,每个数据库内部实现不同,sun公司提供标准接口,数据库提供商负责实现接口,把所有实现类打包成.jar文件。有了这个jar包,java程序就可以驱动着数据库做事。

 

*1.加载驱动


* 也叫注册驱动
* Class.forName("com.mysql.jdbc.Driver")
*
*2.获取连接对象


* Connection conn = DriverManager.getConnection("url",user,password);

  例如:jdbc:mysql://127.0.0.1:3306/myschool
* url - jdbc:subprotocol:subname 形式的数据库 url  

  • URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。
  • 也可认为由4部分组成:协议、主机、端口、路径
  • URL的一般语法格式为:
  • (带方括号[]的为可选项):
  • protocol :// hostname[:port] / path / [;parameters][?query]#fragment


*3.获取sql执行器对象


* Statement 对象
* Statement statement = conn.createStatement();

*PreparedStatement(Statement的子接口)表示预编译的sql语句的对象,

 

*SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。 

 

*PreparedStatement pst = conn.prepareStatement(sql);

 (相对于statement执行器对象)

  1.代码可读性性高,由于是预编译sql语句对象,可以设置占位符

  2.解决了statement拼串造成的sql 注入安全问题

  3.由于是预编译之后发送的,减轻了服务器压力,提高了程序性能

                

*CallableStatement(PreparedStatement 的子接口)--用于执行sql存储过程的接口

String sql = "call pro_…"

* CallableStatement cas = conn.prepareCall(sql)

 

*4.执行并返回处理结果


* 增删改 sql语句 executeUpdate()-->返回值为sql语句操作的数据行数,行数为0则数据库指令操作不成功
* 查询sql语句-->executeQuery()-->返回java.sql.ResultSet结果集对象,你所查询的表数据
* 用next方法判断数据库结果集中是否有下一行元素,光标最初位于第一行之前
*
*5.关闭资源


* 关闭资源的顺序,先创建的后关闭
* 增删改sql语句 ----只需要关闭连执行器(Statement/PrepareStatement)和连接对象(Connection)
* 查询 ,需要关闭ResultSet结果集对象,执行器对象(Statement/PrepareStatement)和连接对象(Connection)

 

 

package com.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
 *1.加载驱动
 *    也叫注册驱动
 *    Class.forName("com.mysql.jdbc.Driver")
 *
 *2.获取连接对象
 *    Connection conn = DriverManager.getConnection("url",user,password);
 *    url - jdbc:subprotocol:subname 形式的数据库 url
 *
 *3.获取sql执行器对象
 *    Statement 对象
 *    Statement statement = conn.createStatement();
 *
 *4.执行并返回处理结果
 *    增删改 sql语句 executeUpdate()-->返回值为sql语句操作的数据行数,行数为0则数据库指令操作不成功
 *    查询sql语句-->executeQuery()-->返回java.sql.ResultSet结果集对象,你所查询的表数据
 *        用next方法判断数据库结果集中是否有下一行元素,光标最初位于第一行之前
 *
 *5.关闭资源
 *    关闭资源的顺序,先创建的后关闭
 *    增删改sql语句 ----只需要关闭连执行器(Statement/PrepareStatement)和连接对象(Connection)
 *    查询 ,需要关闭ResultSet结果集对象,执行器对象(Statement/PrepareStatement)和连接对象(Connection)

 * @author Administrator
 *
 */
public class Test05 {
    public static void main(String[] args) {
        //1.加载驱动/注册驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //2.连接对象,在捕获异常外声明该对象,后续方法关闭该对象
        Connection connection = null;
        //3.执行器对象 ,在捕获异常外声明该对象,后续方法关闭该对象
        Statement statement = null;
        try {
            //获取连接对象
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool","root","root");
            System.out.println("连接数据库成功");
            //获取执行器对象
            statement=connection.createStatement();
            //sql执行器对象用来向数据库发送sql语句,并执行sql语句,带有int返回值executeUpdate();
            String sql = "update grade set gradename='9年级' where gradeid=9";
            int count =statement.executeUpdate(sql);
            if(count>0){
                System.out.println("修改成功 ");
            }else{
                System.out.println("修改失败");
            }
            
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("数据库连接失败");
        }finally{
            //先创建的后关闭
            try {
                statement.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        
    }
}

 

 

 

posted @ 2019-11-23 17:08  MRCHENH  阅读(335)  评论(0编辑  收藏  举报