java学习--JDBC数据库操作

文章目录[x]
  1. 1:测试数据库连接
  2. 2:测试插入数据(sql注入问题)
  3. 3:preparedStatement连接
  4. 4:查询数据库
  5. 5:测试时间类型
  6. 6:Clob将文件内容写入数据库
  7. 7:使用资源文件
  8. 7.1:创建资源文件
  9. 7.2:封装工具类

JDBC(Java Data Base Connectivity,Java数据库连接),是一种用于执行SQL语句的Java API,为多种关系数据库提供统一访问。

概述

  • 什么是JDBC?

它由一组用Java语言编写的类和接口组成的java API

  • JDBC API

由Sun公司提供 ,供程序员调用的接口与类,集成在java.sql和javax.sql包中

  • JDBC 驱动

由数据库厂商提供

注意: JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。

  • JDBC访问数据库步骤

1:加载一个Driver驱动
2:创建数据库连接(Connection)
3 :创建SQL命令发送器Statement
4:通过Statement发送SQL命令并得到结果
5:处理结果(select语句)
6:关闭数据库资源
ResultSet
Statement
Connection。

环境

数据库:mysql

可视化操作软件:Navicat

IDE:IntelliJ IDEA Community

其他:mysql驱动包

测试数据库连接

连接前先要导入驱动包

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
 * 测试跟数据库建立连接
 */
public class Demo01 {
    //加载类驱动
    public static void main(String[] args) {
            Connection conn = null;
        try {
            //加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            long start = System.currentTimeMillis();
            //建立连接
             conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/sgyzjdbc","root","123456");
            long end = System.currentTimeMillis();
            System.out.println("消耗的时间:"+(end-start)+"ms");
            System.out.println(conn);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }catch (SQLException e) {
            e.printStackTrace();
        }finally {
                try {
            if (conn!=null){
                    conn.close();
                }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
        }
    }
}

测试插入数据(sql注入问题)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * 测试Sql语句
 * sql注入问题
 */
public class Demo02 {
    //加载类驱动
    public static void main(String[] args) {
        try {
            //加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            //建立连接
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/sgyzjdbc?characterEncoding=utf-8","root","123456");
//            System.out.println(conn);

            Statement stmt = conn.createStatement();
            String sql = "insert into user (username,time,password) values ('小草',now(),77777)";
            stmt.execute(sql);
            //测试sql注入
            String id= "5";
            //下面语句即可实现注入
//            id = "5 or 1=1";
//            sql = "delete from user where id="+id;
//            stmt.execute(sql);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

这里的Statement对象连接方式是不安全的会存在sql注入风险,因为可以拼接字符串

preparedStatement连接

import java.sql.*;
/**
 * 测试preparedstatement的用法
 */
public class Demo03 {
    //加载类驱动
    public static void main(String[] args) {
        try {
            //加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            //建立连接
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/sgyzjdbc?characterEncoding=utf-8","root","123456");

            String sql = "insert into user (username,time,password) values (?,?,?)";
            PreparedStatement ps = conn.prepareStatement(sql);

            ps.setString(1,"洛尘曦");
            ps.setDate(2, new Date(System.currentTimeMillis()));
            ps.setString(3,"99999");
//            ps.setObject();   也可以实现
            System.out.println("插入一行语句成功");
            ps.execute();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
这种方式是安全的,因为要预编译。

查询数据库

import java.sql.*;

/**
 * 测试excuteQuery查询语句的的用法
 */
public class Demo04 {
    //加载类驱动
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs =null;
        try {
            //加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            //建立连接
           conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/sgyzjdbc?characterEncoding=utf-8","root","123456");

            String sql = "select * from user where id>?";
            ps = conn.prepareStatement(sql);

            ps.setObject(1,2);  //查询id大于2的数据
           rs= ps.executeQuery();
            while (rs.next()){
                System.out.println(rs.getInt(1)+"---"+rs.getString(2)+"---"+rs.getDate(3)+"---"+rs.getString(4));
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                if (rs!=null){
                    rs.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (ps!=null){ps.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (conn!=null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

测试时间类型

import java.sql.*;
/**
 * 测试时间类型
 */
public class Demo07 {
    //加载类驱动
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps1 = null;
        try {
            //加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            //建立连接
           conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/sgyzjdbc?characterEncoding=utf-8","root","123456");
             ps1 = conn.prepareStatement("insert into s_user (name,pwd,time,loginTime) values (?,?,?,?)");

            ps1.setObject(1,"上官易泽");  //查询id大于2的数据
            ps1.setObject(2,"123456");  //查询id大于2的数据
            java.sql.Date date = new java.sql.Date(System.currentTimeMillis());
            ps1.setObject(3,date);  //查询id大于2的数据
            Timestamp stmp =new Timestamp(System.currentTimeMillis());
            ps1.setObject(4,stmp);
            ps1.execute();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                if (ps1!=null){ps1.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (conn!=null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

Clob将文件内容写入数据库

import java.io.*;
import java.sql.*;
/**
 * 将文件内容写入数据库,以及读出操作
 */
public class Demo08 {
    //加载类驱动
    public static void main(String[] args) throws IOException {
        Connection conn = null;
        PreparedStatement ps1 = null;
        ResultSet rs =null;
        Reader r =null;
        try {
            //加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            //建立连接
           conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/sgyzjdbc?characterEncoding=utf-8","root","123456");
            ps1 = conn.prepareStatement("insert into student (name,text) values (?,?)");
            ps1.setObject(1,"洛尘");
            ps1.setClob(2, new FileReader(new File("print.txt")));  //将文本文件的内容输入数据库中

            //将程序中的字符串输入到数据库中
            ps1.setClob(2,new BufferedReader(new InputStreamReader(new ByteArrayInputStream("aaaaaaaaaaa".getBytes()))));
            ps1 = conn.prepareStatement("select * from student where id=?");
            ps1.setObject(1,2);         
                //读数据
//            rs = ps1.executeQuery();
//            while (rs.next())
//            {
//                Clob c = rs.getClob("text");
//                r = c.getCharacterStream();
//                int temp = 0;
//                while ((temp=r.read())!=-1){
//                    System.out.println((char)temp);
//
//                }

//
//            }
               ps1.executeUpdate();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                if (r!=null){r.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (ps1!=null){ps1.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (conn!=null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

使用资源文件

因为建立连接还有关闭操作每次都要重复,我们可以将它封装成一个工具类

创建资源文件

创建一个下图一样的文件,将数据库的信息放入其中,在程序中访问就可以了-->这样以后再修改数据库啥的直接修改资源文件就可以了

封装工具类

import java.io.IOException;
import java.sql.*;
import java.util.Properties;
/**
*
*工具类
*/
public class JDBCUtil {
static Properties pro = null;//帮助我们读取和处理资源文件的信息
static {//加载JDBCUtil类的时候才会条用一次
pro = new Properties();
try {
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}

public static Connection getMysqlConn(){
try {
//加载驱动类
Class.forName(pro.getProperty("mysqlDriver"));
//建立连接
return DriverManager.getConnection(pro.getProperty("mysqlURL"),pro.getProperty("mysqlUser"),pro.getProperty("mysqlPwd"));
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

public static void close(ResultSet es, Statement ps,Connection conn){
try {
if (es!=null){es.close();
}
} catch (SQLException e) {
e.printStackTrace();
}

try {
if (ps!=null){ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}

try {
if (conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}

public static void close(Connection conn){

try {
if (conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}

public static void close(Statement ps,Connection conn){
try {
if (ps!=null){ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}

try {
if (conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}

}

 

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00