jdbc:java语言操作数据库

jdbc是使用Java语言操作关系型数据库的一套API,jdbc定义了操作所有的数据库的规则(接口)。各种数据库分别定义自己对于jdbc的一套实现类(驱动)。

jdbc的本质:

jdbc的好处:

使用不同的数据库时只需导入对应的驱动jar包。

package wryyyyy;

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

public class test
{
    public static void main(String[] args) throws ClassNotFoundException, SQLException
    {
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");//mysql5之后这条语句可以不写
        //2.获取连接
        /*
        1.如果连接的是本机的mysql并且端口是3306,那么可以简化书写:String url = "jdbc:mysql:///db1";
        2.配置useSSL=false参数,禁用安全连接方式,解决警告提示:String url = "jdbc:mysql:///db1?useSSL=false";
         */
        String url = "jdbc:mysql://127.0.0.1:3306/db1";//"jdbc:mysql://mysql的ip:端口/数据库名称"
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url,username,password);//指定连接哪个mysql以及ip,端口,数据库名称;用户名;密码
        //3.定义SQL语句
        String sql = "UPDATE ACCOUNT SET MONEY = 2000 WHERE ID = 1;";
        //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

DriverManager(驱动管理类):

1.注册驱动

Class.forName("com.mysql.jdbc.Driver");

2.获取数据库连接对象

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

 Connection(数据库连接对象):

1.获取执行SQL的对象

2.管理任务

package wryyyyy;

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

public class test_01
{
    public static void main(String[] args) throws ClassNotFoundException, SQLException
    {
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");//mysql5之后这条语句可以不写
        //2.获取连接
        /*
        1.如果连接的是本机的mysql并且端口是3306,那么可以简化书写:String url = "jdbc:mysql:///db1";
        2.配置useSSL=false参数,禁用安全连接方式,解决警告提示:String url = "jdbc:mysql:///db1?useSSL=false";
         */
        String url = "jdbc:mysql://127.0.0.1:3306/db1";//"jdbc:mysql://mysql的ip:端口/数据库名称"
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url,username,password);//指定连接哪个mysql以及ip,端口,数据库名称;用户名;密码
        //3.定义SQL语句
        String sql1 = "UPDATE ACCOUNT SET MONEY = 3000 WHERE ID = 1;";
        String sql2 = "UPDATE ACCOUNT SET MONEY = 3000 WHERE ID = 2;";
        //4.获取执行SQL的对象 statement
        Statement stmt = conn.createStatement();

        /*
        回滚事务,利用Java中的异常处理机制trycatch捕获异常,让回滚事务在catch中被执行
         */
        try
        {
            //开启事务
            conn.setAutoCommit(false);

            //5.执行SQL
            int count1 = stmt.executeUpdate(sql1);//返回一个影响的行数
            //6.处理结果
            System.out.println(count1);
            int i = 3/0;

            //5.执行SQL
            int count2 = stmt.executeUpdate(sql2);//返回一个影响的行数
            //6.处理结果
            System.out.println(count2);

            //提交事务
            conn.commit();
        }
        catch (Exception e)
        {
            //回滚事务
            conn.rollback();
            e.printStackTrace();
        }

        //7.释放资源
        stmt.close();
        conn.close();
    }
}

Statement(执行SQL语句):

ResultSet(结果集对象): 

 游标默认指向当前数据行的下一行,要获取数据,首先游标要往下移动一行,并且判断这一行是不是有效行。

package wryyyyy;

import org.junit.Test;

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

public class test_03
{
    /**
     * 执行对应的DML语句
     * @throws Exception
     */
    @Test
    public void testResultSet() throws Exception
    {
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");//mysql5之后这条语句可以不写
        //2.获取连接
        /*
        1.如果连接的是本机的mysql并且端口是3306,那么可以简化书写:String url = "jdbc:mysql:///db1";
        2.配置useSSL=false参数,禁用安全连接方式,解决警告提示:String url = "jdbc:mysql:///db1?useSSL=false";
         */
        String url = "jdbc:mysql://127.0.0.1:3306/db1";//"jdbc:mysql://mysql的ip:端口/数据库名称"
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url,username,password);//指定连接哪个mysql以及ip,端口,数据库名称;用户名;密码
        //3.定义SQL语句
        String sql = "select * from account";
        //4.获取执行SQL的对象 statement
        Statement stmt = conn.createStatement();
        //5.执行SQL
        ResultSet rs = stmt.executeQuery(sql);
        //6.处理结果
        //6.1 光标向下移动一行,并判断当前行是否有数据
        while (rs.next())
        {
            //6.2 获取数据
            int id = rs.getInt(1);
            String name = rs.getString(2);
            double money = rs.getDouble(3);

            System.out.println(id);
            System.out.println(name);
            System.out.println(money);
            System.out.println("---------------------");
        }
        //7.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}

PreparedStatement(继承于Statement)(预编译SQL语句的对象):

预编译SQL语句并执行,预防SQL注入的问题(SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法)

package wryyyyy;

import org.junit.Test;

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

public class test_04
{
    /**
     * 用户登录
     */
    @Test
    public void testResultSet() throws Exception
    {
        //获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1";//"jdbc:mysql://mysql的ip:端口/数据库名称"
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url,username,password);//指定连接哪个mysql以及ip,端口,数据库名称;用户名;密码

        //接收用户输入的用户名和密码
        String name = "张三";
        String pwd = "123";
        String sql = "select * from account where name = '"+name+"' and pwd = '"+pwd+"'";

        //获取执行SQL的对象 statement
        Statement stmt = conn.createStatement();

        //执行SQL
        ResultSet rs = stmt.executeQuery(sql);

        //判断是否登陆成功
        if(rs.next())
        {
            System.out.println("登陆成功");
        }
        else
        {
            System.out.println("登陆失败");
        }

        //7.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}

PreparedStatement作用-预编译SQL并执行SQL语句: 

  

package wryyyyy;

import org.junit.Test;

import java.sql.*;

public class test_05
{
    /**
     * 用户登录
     */
    @Test
    public void testResultSet() throws Exception
    {
        //获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1";//"jdbc:mysql://mysql的ip:端口/数据库名称"
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url,username,password);//指定连接哪个mysql以及ip,端口,数据库名称;用户名;密码

        //接收用户输入的用户名和密码
        String name = "张三";
        String pwd = "123";

        //定义SQL
        String sql = "select * from account where name = ? and pwd = ?";

        //获取stmt对象
        PreparedStatement pstmt = conn.prepareStatement(sql);

        //设置?的值
        pstmt.setString(1,name);
        pstmt.setString(2,pwd);

        //执行SQL
        ResultSet rs = pstmt.executeQuery();

        //判断是否登陆成功
        if(rs.next())
        {
            System.out.println("登陆成功");
        }
        else
        {
            System.out.println("登陆失败");
        }

        //7.释放资源
        rs.close();
        pstmt.close();
        conn.close();
    }
}

PreparedStatement原理:

当Java代码把SQL语句发送到服务器中时,mysql服务器:

检查和编译SQL执行时间比执行SQL大,如果没有使用预编译的话,每一次发送SQL语句都会走一遍这整个流程,而预编译SQL时,前面的模板是固定的,后面的?作为占位符来替代,当设置完值的时候,就只剩下执行了。

 PreparedStatement预编译功能开启:

useServerPreStmts=true

String url = "jdbc:mysql:///db1?useSSL=false&useServerPreStmts=true";

数据库连接池

在系统启动之前,初始化一个容器(就是集合),在这个容器里面提前申请很多个数据库的连接,连接用完之后归还。

 数据库连接池的实现:

Druid实现步骤:

package com.sunyinglian.druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;

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

/**
 * Druid的数据库连接池演示
 */
public class DruidDemo
{
    public static void main(String[] args) throws Exception
    {
        //1.导入jar包


        //2.定义配置文件


        //3.加载配置文件
        Properties prop = new Properties();
        /*
        获取当前路径:System.out.println(System.getProperty("user.dir"));
         */
        prop.load(new FileInputStream("test_module/src/druid.properties"));

        //4.获取连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);

        //5.获取数据库连接Connection
        Connection connection = dataSource.getConnection();

        System.out.println(connection);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值