JDBC入门到放弃

来源:互联网 发布:熟悉办公软件 编辑:程序博客网 时间:2024/06/05 08:20

JDCB原理图


JDBC简单列子

        //导入驱动类库        //注册驱动        DriverManager.registerDriver(new com.mysql.jdbc.Driver());        //连接数据库        String user="root";        String password="mysql520";        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", user, password);//test为数据库名称        //操作数据库        Statement st = conn.createStatement();        String sql="insert into student values(null,'guomei',22)";        st.execute(sql);//st.executeUpdate(sql);        //关闭资源        st.close();        conn.close();

注意:增删改使用st.executeUpdate或者st.execute(增删改查都可以,返回值 true=> 查询有结果集,false=> 查询没有结果集),现在查询需要使用st.executeQuery

        // 操作数据库        Statement st = conn.createStatement();        String sql="select * from student";        ResultSet resultSet = st.executeQuery(sql);        while (resultSet.next()) {            String name = resultSet.getString("name");            int age = resultSet.getInt("age");            int id = resultSet.getInt("id");            System.out.println("id:"+id+"======="+"name:"+name+"====="+age);        }


DriverManager细节

        // 1.注册驱动        DriverManager.registerDriver(new com.mysql.jdbc.Driver());//jar包里面就是使用这种方法来注册的,所以推荐使用反射方法        System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");        Class.forName("com.mysql.jdbc.Driver");// 推荐方式

Uri地址

//url完整 格式: 大协议:子协议://IP地址:端口号/库名?参数键=参数值
//完整:jdbc:mysql://127.0.0.1:3306/day05?useUnicode=true&characterEncoding=utf8
//简单:jdbc:mysql:///day05?useUnicode=true&characterEncoding=utf8,如果是连接本地localhost:3306的话,可以忽略

一般建议写完整的以及不需要写参数键=参数值

Conection细节

功能:

1.代表数据库的链接
2.可以根据该对象创建运送sql语句的Statement对象

方法:

****Statement createStatement() 创建statement对象
CallableStatement prepareCall(String sql) 调用数据库的存储过程(存储过程没学)
****PreparedStatement prepareStatement(String sql) 创建 PreparedStatement 对象(下面会介绍)

Statement 对象

该对象可以理解为一个 向数据库运送sql语句的 "小车";

方法:

[1] void addBatch(String sql) 向车上添加语句. (用于批量执行sql语句);
[2] insert update delete int[] executeBatch() 将车上的语句 运送给数据库执行. 返回值存放每个语句执行后影响的行数. 因为是多个语句,所以用数组装.
[3] void clearBatch() 清除车上的语句.
—-以上3个方法是批量执行sql相关的(下午最后一节课演示)———————-
[4] boolean execute(String sql) 执行一个sql语句. 如果该语句返回结果集 返回值为true(select). 如果该语句不返回结果集 返回false(insert update delete);
[5] ResultSet executeQuery(String sql) 执行一个有结果集的查询. 会将结果集包装到resultset对象中.(select)
[6] int executeUpdate(String sql) 执行一个没有结果集的语句. 会将语句影响的行数返回.(insert update delete)

结论:

执行查询语句时使用: executeQuery方法
执行增删改等语句时使用: executeUpdate方法


ResultSet对象

功能:

当执行的语句是查询语句时, resultSet对象用于封装查询结果.

方法:

[1] boolean next() 该方法让结果集中的指针(游标)往下移动一行.并且判断改行是否有数据。 有返回true,没有返回false
[2] String getString(int cloumnCount) 从当前指向的行中获得String 类型的数据. 根据列所在的索引位置取.
[3] String getString(String columnName) 从当前指向的行中获得String 类型的数据. 根据列名取.
[4] getXXX系列方法 有很多种, 没对针对的都是数据库中的不同类型.

数据库数据类型对应于Java数据类型


JDBCUtils工具类

import java.io.FileInputStream;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;public class JDBCUtils {    private static String driver;    private static String url;    private static String user;    private static String password;    static{        try {            //0读取配置文件            Properties prop  = new Properties();            InputStream is = new FileInputStream("src/db.properties");//把容易修改的内容放到db.properties中            prop.load(is);            is.close();            driver = prop.getProperty("driver");            url = prop.getProperty("url");            user = prop.getProperty("user");            password = prop.getProperty("password");            //1 注册驱动            Class.forName(driver);        } catch (Exception e) {            e.printStackTrace();        }    }    //1 获得连接    public static Connection getConnection(){        Connection conn = null;        try {            //2 获得连接            conn = DriverManager.getConnection(url, user, password);        } catch (Exception e) {            e.printStackTrace();            throw new RuntimeException("创建连接失败!");        }        return conn;    }    //2 释放资源        //1> 参数可能为空        //2> 调用close方法要抛出异常,确保即使出现异常也能继续关闭        //3>关闭顺序,需要从小到大    public  static void  close(Connection conn , Statement st , ResultSet rs){        try {            if(rs!=null){                rs.close();            }        } catch (SQLException e) {            e.printStackTrace();        }finally{            try {                if(st!=null){                st.close();                 }            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }finally{                try {                    if(conn!=null){                        conn.close();                           }                } catch (SQLException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        }    }/*  public static void main(String[] args) {        System.out.println(getConnection());    }*/}

db.properties文件

driver=com.mysql.jdbc.Driver;url=jdbc:mysql://localhost:3306/test;user=root;password=mysql520;


SQL小细节:

拼装SQL语句

        //拼装sql语句        String sql = "SELECT * FROM student WHERE NAME='"+name+"' AND   PASSWORD='"+password+"';";

解决SQL注入问题

    //演示使用PrepareStatement对象,解决sql注入问题    public void fun2() throws Exception{        String name ="xxx' OR 1=1 -- ";        String password ="1234";        //1 获得连接        Connection conn= JDBCUtils.getConnection();        //2 拼装sql语句        String sql = "SELECT * FROM student WHERE NAME=? AND   PASSWORD=?";        //3 获得PrepareStatement        PreparedStatement ps = conn.prepareStatement(sql);        //4 设置参数到ps对象中        ps.setString(1, name);        ps.setString(2, password);        //5 运送参数,执行sql并拿到结果    ResultSet rs =  ps.executeQuery();        //5 根据结果判断是否登录成功        if(rs.next()){            System.out.println("登录成功!");        }else{            System.out.println("登录失败!");        }        //6关闭资源        JDBCUtils.close(conn, ps, rs);    }


利用JDBC向数据库存储大文本

    //存储大文本必须使用PrepareStatement对象    public void fun1() throws Exception{        //1 获得连接        Connection conn = JDBCUtils.getConnection();        //2 书写sql        String sql = "insert into mytext values(null,?)";        //3 创建PrepareStatement        PreparedStatement ps = conn.prepareStatement(sql);        //4 设置参数        //参数1:参数的索引        //参数2:需要保存的文本的流        //参数3:文件长度        File file = new File("src/text.txt");        FileReader reader = new FileReader(file);        ps.setCharacterStream(1, reader, (int)file.length());        //5 执行sql        int result = ps.executeUpdate();        System.out.println(result);        //6关闭资源        JDBCUtils.close(conn, ps, null);        }

数据库的表需要有一列为text(列名字) text(列类型)

    create table mytext(        id int primary key AUTO_INCREMENT,        text text    )


利用JDBC向数据库存储图片

    //演示向mysql中存放图片    //存储图片必须使用PrepareStatement对象    public void fun1() throws Exception{        //1 获得连接        Connection conn = JDBCUtils.getConnection();        //2 书写sql        String sql = "insert into myblob values(null,?)";        //3 创建PrepareStatement        PreparedStatement ps = conn.prepareStatement(sql);        //4 设置参数        //参数1:参数的索引        //参数2:需要保存的图片的流        //参数3:图片文件长度        File f = new File("src/wg.PNG");        InputStream  is = new FileInputStream(f);        ps.setBinaryStream(1, is, (int)f.length());        //5 执行sql        int result = ps.executeUpdate();        System.out.println(result);        //6关闭资源        JDBCUtils.close(conn, ps, null);        }

图片一般定义为file类型

    create table myblob(        id int primary key AUTO_INCREMENT,        file blob    )


批量执行SQL:

    //1 使用Statement对象批量执行sql    public void fun1() throws Exception{        //1 获得连接        Connection conn = JDBCUtils.getConnection();        //2 获得Statement    Statement st =  conn.createStatement();        //3 添加多条sql语句到stst.addBatch("create table t_stu ( id int primary key auto_increment , name varchar(20) )");    st.addBatch("insert into t_stu values(null,'tom')");    st.addBatch("insert into t_stu values(null,'jerry')");    st.addBatch("insert into t_stu values(null,'jack')");    st.addBatch("insert into t_stu values(null,'rose')");        //4 执行sql    int[]  results = st.executeBatch();    System.out.println(Arrays.toString(results));        //5关闭资源        JDBCUtils.close(conn, st, null);        }    //2 使用PrepareStatement对象批量执行sql    public void fun2() throws Exception{        //1 获得连接        Connection conn = JDBCUtils.getConnection();        //2 书写sql语句        String sql = "insert into t_stu values(null,?)";        //3 创建PrepareStatement        PreparedStatement ps = conn.prepareStatement(sql);        //4 循环.添加参数        for(int i=0;i<100;i++){            ps.setString(1, "用户"+i);            ps.addBatch();        }        //5 批量执行        int[]  results =ps.executeBatch();        System.out.println(Arrays.toString(results));        //5关闭资源        JDBCUtils.close(conn, ps, null);        }
0 0