使用JDBC,以及执行SQL语句

一.通过Java代码如何操作Mysql

通过Java代码如何操作Mysql C/S 客户端服务器模型
JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现。各种不同类型的数据库都依这种规范有相应的实现,都是由java类和接口组成。

二.使用JDBC的步骤:

<1>导入jdbc的Mysql实现依赖

导入依赖

<2>参数配置

jdbcUrl :唯一确定数据库 以及编码形式 中文
jdbc:mysql://127.0.0.1:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
jdbc:mysql :和mysql建立连接时使用的协议
127.0.0.1:3306 :mysql服务器所在的ip地址和端口号
ip地址:唯一的确定mysql服务器运行的主机 127.0.0.1 当前主机
端口号:能够确定mysql服务器是这台主机的哪一个进程 3306 mysql默认端口
IP 和 端口号帮助我们确定mysql服务器的位置。
school : 要操作的数据库的名字。

<3>加载驱动

登录名称:root;
登录密码:123456
加载驱动:

private String url = "jdbc:mysql://127.0.0.1:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
private String userName = "root";
private String password = "123456";
private String jdbcDriver = "com.mysql.jdbc.Driver"; //jdbc 驱动
private Connection connection;

<4>建立连接

 connection = DriverManager.getConnection(url, userName, password)

getConnection:就是jdbc提供给我们建立连接的方法 登录到mysql服务器的过程

<5>创建操作数据库对象

创建操作对象:

public void createConnection() {
    try {
        Class.forName(jdbcDriver);
        try {
            connection = DriverManager.getConnection(url, userName, password);
        if (!connection.isClosed()) {
                System.out.println("连接建立成功");
            } else {
                System.out.println("连接建立失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

<6>使用statement /PreparedStatement对象,执行sql语句

(1)使用statement对象,执行sql语句

在第一步定义对象

private Statement statement;

根据数据库中的表 添加数据,删除数据,改变数据,查询数据:

//添加数据
public void insertTest() {  
    String insertSql = "insert into test values(2,'小明')";

    try {
        statement.executeUpdate(insertSql);
        //executeUpdate所有会对数据库内容造成修改的sql语句都是调用这个方法执行的
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
//删除数据
public void deleteTest(){
    String deleteSql = "delete from test where id =200";

    try {
        statement.executeUpdate(deleteSql);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
//改变数据的值
public void updateTest(){
    String updateSql = "update test set name = '小张' where id = 1";

    try {
        statement.executeUpdate(updateSql);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

//查询数据
public void selectTest() {
    String selectSql = "select * from student";
    try {
        ResultSet resultSet = statement.executeQuery(selectSql); //resultSet 查询到的结果集的集合
        //executeQuery:执行查询数据的SQL语句专用
        while (resultSet.next()) {//resultSet.next()  判断集合是否有数据
            System.out.println("SID  " + resultSet.getString(1)
                    + "  Sname " + resultSet.getString(2) +
                    "  Sage " + resultSet.getString(3) +
                    " Ssex " + resultSet.getString(4)
            );
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

(2)使用PreparedStatement对象,执行sql语句

PrepareStatement对象的使用来执行语句:

//添加数据
public void insertTest() { 
    String insertSql = "insert into test values(?,?)";  //定义无参的sql语句
    PreparedStatement pre = null;
    try {
        pre = connection.prepareStatement(insertSql);//将无参数的sql语句提交给mysql
        //给无参数的sql语句提交参数
        pre.setInt(1, 201);
        pre.setString(2, "小红");
        pre.executeUpdate();  //执行这条sql

        pre.setInt(1, 202);
        pre.setString(2, "小李");
        pre.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            pre.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
//查询数据
public void selectTest() {
    String selectSql = "select Sname,Ssex from student where SID > ?";
    try {
        PreparedStatement pre = connection.prepareStatement(selectSql);
        pre.setString(1, "2");
        System.out.println(pre);
        ResultSet resultSet = pre.executeQuery();
        while (resultSet.next()) {//resultSet.next()  判断集合是否有数据
            System.out.println(
                    "Sname " + resultSet.getString(1) +
                            " Ssex " + resultSet.getString(2)
            );
        }
        System.out.println("-----------------------------------------------------");
        pre.setString(1, "3");
        System.out.println(pre);
        ResultSet resultSet1 = pre.executeQuery();
        while (resultSet1.next()) {//resultSet.next()  判断集合是否有数据
            System.out.println(
                    "Sname " + resultSet1.getString(1) +
                            " Ssex " + resultSet1.getString(2)
            );
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
//删除数据
public void deleteTest(){
String deleteSql = "delete from student where Sid = ?";
    try {
        PreparedStatement pre = connection.prepareStatement(deleteSql);
        pre.setInt(1,4);
        pre.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
//改变数据
public void updateTest(){
    String updateSql = "update student set Sname = '王明' where Sid = ?";
    try {
        PreparedStatement pre = connection.prepareStatement(updateSql);
        pre.setInt(1,1);
        pre.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

(3)使用statement /PreparedStatement对象的区别

1.结构完全相同,仅仅只是参数值不同
2.PreparedStatement 当执行多条同结构的sql语句时,PreparedStatement对象会先提交一个无参数的
sql语句进进行编译。
3.同结构的sql语句执行多次,PreparedStatement对象的执行效率要比statment对象高的多。
原因:PreparedStatement对象对于同结构的sql只编译一次。而statment对象有几条sql就需要执行几次
4.一个结构的sql语句只执行一次,statment对象更好。原因是:statment对象执行sql时编译和执行一次就完成。而PreparedStatement对象先编译无参数的sql,再提交参数
然后再执行。

综上:只有同结构的sql语句执行多次PreparedStatement对象的执行效率比statment对象高,如果执行一次statment对象更好。

(4)sql注入异常

结构化查询语言(SQL)是一种用来和数据库交互
的文本语言。SQL Injection 就是利用非法的SQL拼接,
从而达到入侵数据库的目的。 它的产生主要是由于程序
对用户输入的数据没有进行严格的过滤,导致非法的数据
库SQL操作语句的执行。
SQL 注入(SQL Injection)攻击具有很大的危害,
攻击者可以利用它读取、修改或者删除数据库内的数据,
获取数据库中的用户名和密码等敏感信息,甚至可以获得
数据库管理员的权限,而且SQL Injection 也很难防范,
一般的防火墙也无法拦截 SQL Injection 攻击。
PreparedStatement对象 能够有效的防止sql注入的攻击。

<7>关闭连接

使用过后关闭连接,避免资源浪费

public void closeConnection() {
    try {
        connection.close();  //当不在使用mysql时关闭mysql连接 方式资源浪费
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值