JDBC编程

目录

概念

JDBC示例

JDBC API

1.DriverManager

2.Connection

3.Statement

4.ResultSet

 5.PreparedStatement

数据库连接池

DataSource

Druid


概念

        JDBC全称Java DataBase Connectivity (java数据库连接),是一套操作关系型数据库的javaAPI。

        数据库驱动jar包:JDBC接口的实现类,由数据库厂商实现。

意义:

        面向接口编程,java代码不需要针对不同的数据库分别开发。

        在更换底层数据库时,也不需要大量更改代码。

JDBC示例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class Main {
    public static void main(String[] args) throws Exception{
       //1.注册驱动
        //Class.forName("com.mysql.jdbc.Driver");//加载类,8.0可以省略
        //2.获取连接
        //String url="jdbc:mysql://127.0.0.1:3306/mybase";
        //本机的mysql且端口为默认3306,可简写
        String url="jdbc:mysql:///mybase";
        String username="root";
        String password="111111";
        Connection conn=DriverManager.getConnection(url,username,password);
        //3.定义SQL
        String sql="update student set age=18 where name='wj'";
        //4.获取执行sql的对象 Statement
        Statement stmt=conn.createStatement();
        //5.执行sql
        int count=stmt.executeUpdate(sql);
        //6.处理结果
        System.out.println(count);
        //7.释放资源
        stmt.close();//先
        conn.close();//后
    }
}

JDBC API

1.DriverManager

        驱动管理类        工具类,全是静态方法

作用:

        1.注册驱动

static void registDriver(Driver driver)

#Driver类中静态代码块中调用了该方法。        

        2.获取数据库连接

static Connection getConnection(String url,String user,String password)

 String url="jdbc:mysql://127.0.0.1:3306/mybase";

url: jdbc:mysql://ip地址或域名:端口号/数据库名称?参数键值对1&参数键值对2...

        连接本机mysql服务器,并且服务器默认端口3306,可简写。

2.Connection

        与特定的数据库连接,执行SQL语句并在连接的上下文返回结果

作用:

        1.获取执行SQL的对象

i.普通执行SQL对象  Statement createStatement()

ii.预编译SQL的执行SQL对象:防止SQL注入  PreparedStatement preparedStatement(sql)

iii.执行存储过程的对象  CallableStatement prepareCall(sql)

        2.管理事务

i.开启事务  setAutoCommit(boolean autoCommit);//true为自动提交,false手动

ii.提交事务  commit();

iii.回滚事务  rollback()

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class connection {
    public static void main(String[] args) throws Exception{
        //1.注册驱动
        //Class.forName("com.mysql.jdbc.Driver");//加载类,8.0可以省略
        //2.获取连接
        //String url="jdbc:mysql://127.0.0.1:3306/mybase";
        //本机的mysql且端口为默认3306,可简写
        String url="jdbc:mysql:///mybase";
        String username="root";
        String password="111111";
        Connection conn= DriverManager.getConnection(url,username,password);
        //3.定义SQL
        String sql1="update student set age=20 where name='wj'";//check约束,0--100
        String sql2="update student set sex='男' where name='wj'";//有check约束,只能说男/女
        //4.获取执行sql的对象 Statement
        Statement stmt=conn.createStatement();
        //5.执行sql
        //6.处理结果
        try {
            conn.setAutoCommit(false);
            int count1=stmt.executeUpdate(sql1);
            System.out.println(count1);
            int count2=stmt.executeUpdate(sql2);
            System.out.println(count2);
            conn.commit();
        } catch (SQLException e) {
            conn.rollback();
            throw new RuntimeException(e);
        }
        //7.释放资源
        stmt.close();//先
        conn.close();//后
    }
}

3.Statement

作用:执行SQL语句

执行DML和DDL语句  int executeUpdate(sql);

                                   //DML语句返回影响的行数,DDL执行成功有可能返回0

执行DQL语句        ResultSet executeQuery(sql);//返回ResultSet结果集对象

4.ResultSet

        结果集对象  封装了DQL查询语句的结果

ResultSet stmt.executeQuery(sql);//返回ResultSet结果集对象

获取查询结果

  1. boolean next();//将光标下移,判断是否为有效行
  2. xxx getXxx(参数);//参数为:列号(从1开始)或列名;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class resultset {
    public static void main(String[] args) throws Exception{
        //1.注册驱动
        //Class.forName("com.mysql.jdbc.Driver");//加载类,8.0可以省略
        //2.获取连接
        //String url="jdbc:mysql://127.0.0.1:3306/mybase";
        //本机的mysql且端口为默认3306,可简写
        String url="jdbc:mysql:///mybase";
        String username="root";
        String password="111111";
        Connection conn= DriverManager.getConnection(url,username,password);
        //3.定义SQL
        String sql="select * from student";
        //4.获取执行sql的对象 Statement
        Statement stmt=conn.createStatement();
        //5.执行sql
        ResultSet rs=stmt.executeQuery(sql);
        //6.处理结果
        //6.1光标向下移动
        while(rs.next()){
            //6.2 获取数据 getXxx()
            int id=rs.getInt(1);
            String name=rs.getString(2);
            int age=rs.getInt(3);
            String sex=rs.getString(4);
            String address=rs.getString(5);
            System.out.println(id);
            System.out.println(name);
            System.out.println(age);
            System.out.println(sex);
            System.out.println(address);
            System.out.println("-------------");
        }
        //7.释放资源
        stmt.close();//先
        conn.close();//后
    }
}

 5.PreparedStatement

        继承自Statement

作用:预编译SQL语句并执行:预防SQL注入

SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。

        String name="' or '1'='1";
        System.out.println(name);
        //3.定义SQL
        String sql="update student set age=18 where name='"+name+"'";

 通过操作name,使得where语句恒为true

PreparedStatement的使用:

1.sql语句中的参数值用占位符?替代  where name = ?

2.获取PreparedStatement对象  PreparedStatement pstmt=conn.preparedStatement(sql);

3.设置参数  pstmt.setXxx(参数1,参数2);//给?赋值。

        Xxx为数据类型,参数1为?的位置从1开始,参数2为?的值

4.执行SQL  pstmt.executeUpdate();或executeQuery();  不需要传参

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class preparedStatement {
    public static void main(String[] args) throws Exception{
        //1.注册驱动
        //Class.forName("com.mysql.jdbc.Driver");//加载类,8.0可以省略
        //2.获取连接
        //String url="jdbc:mysql://127.0.0.1:3306/mybase";
        //本机的mysql且端口为默认3306,可简写
        String url="jdbc:mysql:///mybase?&uesServerPrepStmts=true";
        String username="root";
        String password="111111";
        Connection conn= DriverManager.getConnection(url,username,password);
        //3.定义SQL
        String sql="update student set age=8 where name=?";
        //4.获取执行sql的对象
        PreparedStatement pstmt=conn.prepareStatement(sql);
       //给?赋值
        pstmt.setString(1,"wj");
        //5.执行sql
        int count=pstmt.executeUpdate();
        //6.处理结果
        System.out.println(count);
        //7.释放资源
        pstmt.close();//先
        conn.close();//后
    }
}
String url="jdbc:mysql:///mybase?&uesServerPrepStmts=true";
uesServerPrepStmts=true开启预编译功能

预编译,性能更高

 相同模板的sql,只需要进行一次检查和编译

数据库连接池

        一个容器,负责分配、管理数据库连接

        应用程序从连接池里面取出现有的数据库连接,不需要重新建立一个(资源再用,提高速度)

        还会释放空闲时间过长的连接,避免遗漏

DataSource

        数据库连接池接口,由厂商实现

Druid

        德鲁伊数据库连接池

配置文件

#druid????
driverClassName = com.mysql.jdbc.Driver
#url
url=jdbc:mysql://127.0.0.1:3306/mybase?&uesServerPrepStmts=true
username=root
password=111111
#初始化连接数
initialSize = 5
#最大连接数
maxActive = 10
#最大等待时间
maxWait = 3000
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;

public class druid {
    public static void main(String[] args) throws Exception{
        //1.导入jar包druid
        //2.定义配置文件druid.properties
        //3.加载配置文件
        Properties prop=new Properties();
        prop.load(new FileInputStream("src/druid.properties"));
        //4.获取连接池对象
        DataSource dataSource= DruidDataSourceFactory.createDataSource(prop);
        //5.获取数据库连接
        Connection conn= dataSource.getConnection();
        System.out.println(conn);
        //System.out.println(System.getProperty("user.dir"));
    }
}
  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值