• JDBC对数据库进行操作


    一.使用JDBC查询数据库表t_user的所有数据

    1.User表
    名称 数据类型 主键 是否为空 说明
    ID number 是 用户编号
    NAME Varchar2(50) 用户名
    AGE varchar2(5) 用户年龄
    BIRTH date 用户生日
    PWD varchar2(20) 否 用户密码

    
    import java.sql.Connection;
    import java.sql.Date;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    public class JdbcMysqlTest {
    public static void main(String[] args) throws 
    ClassNotFoundException,SQLException {
    //1.加载jdbc驱动
    Class.forName("com.mysql.jdbc.Driver");
    //2.定义连接url
    String url = "jdbc:mysql://127.0.0.1:3306/neuedu";
    //3.获取数据库连接对象
    Connection conn = DriverManager.getConnection(url,"root","root");
    //4.获得statement对象(用来执行sql语句,并返回结果)
    Statement st = conn.createStatement();
    //5.执行查询或更新
    String sql = "select id,name,age,birth from t_user";
    ResultSet rs = st.executeQuery(sql);
    //6.处理结果(遍历获取查询出来的所有数据)
    while(rs.next()){
    int id = rs.getInt("id");
    String name = rs.getString("name");
    String age = rs.getString("age");
    Date birth = rs.getDate("birth");
    System.out.println(id+":"+name+":"+age+":"+birth);
    }
    //7.关闭连接(释放资源)
    rs.close();
    st.close();
    conn.close();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    程序运行结果如下:
    7:zhangsan:age:2015-09-01
    8:lisi:24:2015-09-01
    9:wangwu:25:2015-09-01
    10:wang:23:2015-09-01
    以上给大家粗略的介绍了一下JDBC中涉及到的常用相关类和接口,每个类和接口包含的方法介绍的不是十分全面,希望大家在后续的学习过程中,能充分的利用Java API这个工具,不断提升自己的学习能力。

    二.DBUtil类

    【例7-2】封装打开连接和关闭资源的DBUtil类。
    通常,无论是对数据进行查询操作,还是进行增删改操作,都需要打开连接,关闭资源等操作,因此,可以把对把打开连接和关闭连接封装到一个工具类里。本章后面所有例子对数据访问所用连接都是一样的。下面的DBUtil类封装了打开连接和关闭连接方法。
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    public class DBUtil {
    //该段代码完成加载数据库驱动,整个程序只需要加载一次,所以放在静态块中。
        static{
            try {
                Class.forName("com.mysql.jdbc.Driver");//oracle数据库驱动程序
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    //获取数据库连接方法
        public static Connection getConnection() throws SQLException{
            String url = "jdbc:mysql://127.0.0.1:3306/neuedu";
          Connection conn = DriverManager.getConnection(url,"root","root");
        return conn;
        }
    //释放资源
        public static void close(Statement st,Connection conn){
            try{
                if(st != null){
                    try {
                        st.close();
                        } catch (SQLException e) {                        
                        e.printStackTrace();
                    }
                }
            }finally{
                if(conn != null){
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                }
            }
        }
    }
        public static void close(ResultSet rs, Statement st, Connection conn) {
            try {
                if (rs != null) {
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            } finally {
                try {
                    if (st != null) {
                        try {
                            st.close();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    }
                } finally {
                    if (conn != null) {
                        try {
                            conn.close();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    使用DBUtil类操作数据库

    【例7-3】使用DBUtil类操作数据库
    import java.sql.Connection;
    import java.sql.Date;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.Time;
    import java.sql.Timestamp;
    import java.text.SimpleDateFormat;
    public class UserDao {
    //查询t_user表中所有数据
        public static void query() throws ClassNotFoundException, SQLException{
            Connection conn = null;
            Statement st = null;
            ResultSet rs = null;
            try{
                conn = DBUtil.getConnection();//直接调用DBUtil类的获取数据库连接方法
                String sql = "select id,name,age,birth from t_user";
                st = conn.createStatement();
                rs = st.executeQuery(sql);
                while(rs.next()){
                    String id = rs.getString(1);
                    String name = rs.getString(2);
                    int age = rs.getInt(3);
                    Timestamp ts= rs.getTimestamp("birth");
                    //对ts进行格式化
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    String birth = sdf.format(ts);
                    System.out.println(id + " $ " + name + " $ " + age + " $ " + birth);
                }
            }finally{
                DBUtil.close(rs, st, conn); //调用DBUtil方法释放资源。
            }
        }
    //在main()方法中调用查询操作。
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            query();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    运行结果分析:
    调用query()方法输出结果:
    7    z h a n g s a n    zhangsan   zhangsan  23    2015 年 09 月 01 日  15 : 15 : 068    2015年09月01日 15:15:06 8   20150901日 15:15:068  lisi    24    24   24  2015年09月01日 15:15:23
    9    w a n g w u    wangwu   wangwu  25    2015 年 09 月 01 日  15 : 15 : 5210    2015年09月01日 15:15:52 10   20150901日 15:15:5210  hello1    500    500   500  2015年09月01日 15:16:03

    三.PreparedStatement

    PreparedStatement对象表示预编译的 SQL 语句的对象,为解决Statement静态拼接所产生的SQL 注入问题,引入了PreparedStatement接口。PreparedStatement接口是Statement接口的子接口,允许使用不同的参数多次执行同样的SQL语句。Connection接口提供创建PreparedStatement对象的方法,可指定SQL语句:
    PreparedStatement prepareStatement(String sql) throws SQLException
    PreparedStatement对象继承了Statement,但PreparedStatement语句中包含了警告预编译的SQL语句,因此可以获得更高的执行效率。虽然使用Statement可以对数据库进行操作,但它只适用于简单的SQL语句。如果需要执行带参数的SQL语句时,我们必须利用PreparedStatement类对象。PreparedStatement对象用于执行带或不带输入参数的预编译的SQL语句,语句中可以包含多个用问号”?”代表的字段,在程序中可以利用setXxx()方法设置该字段的内容,从而增强了程序设计的动态性。
    PreparedStatement同Statement对象一样提供了很多基本的数据库操作方法,下面列出了执行SQL命令的3种方法。
    (1)ResultSet executeQuery():可以执行SQL查询并获取ResultSet对象
    (2)int executeUpdate():可以执行Update /Insert/Delete操作,返回值是执行该操作所影响的行数。
    (3)boolean execute():这是一个最为一般的执行方法,可以执行任意SQL语句,然后获得一个布尔值,表示是否返回ResultSet。

    【例7-5】使用PreparedStatement解决例7-4中登录功能的SQL注入问题。
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    public class SqlInject {
        public static void login(String name, String PWD) throws SQLException{
            Connection conn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            try{
                conn = DBUtil.getConnection();
                String sql = "SELECT * FROM t_user WHERE NAME=? AND PWD=?";
                ps = conn.prepareStatement(sql);
                //设置参数
                ps.setString(1, id);
                ps.setString(2, name);
                rs = ps.executeQuery();
                if(rs.next()){
                    System.out.println("登录成功..");
                }else{
                    System.out.println("登录失败..");
                }
            }finally{
                DBUtil.close(rs, ps, conn);
            }
        }    
        public static void main(String[] args) throws SQLException {
            login("123123", "sadfsdf' or 1=1 or ''='");//解决注入SQL                
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    利用PreparedStatement实现对用户表的增删改查操作。

    【例7-6】利用PreparedStatement实现对用户表的增删改查操作。
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.sql.Timestamp;
    import java.util.Date;
    public class UserDaoPreparedStatement {
        //插入操作
        public static void insert(String name, int age, Date birth)
                throws SQLException {
            Connection conn = null;
            PreparedStatement ps = null;
            try {
                conn = DBUtil.getConnection();
                String sql = "insert into t_user values(seq_user.nextval,?,?,?)";
                ps = conn.prepareStatement(sql);
                // 设置参数,有几个?就需要设置几个参数值
                ps.setString(1, name);
                ps.setInt(2, age);
                ps.setTimestamp(3, new Timestamp(birth.getTime()));
                int result = ps.executeUpdate();
                if (result > 0) {
                    System.out.println("insert 成功...");
                } else {
                    System.out.println("insert 失败...");
                }
            } finally {
                DBUtil.close(ps, conn);
            }
        }
        public static void main(String[] args) throws SQLException {
            insert("hello", 234, new Date());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
  • 相关阅读:
    【Linux私房菜】—— 网络的三种模式
    本地Image Registry Harbor安装
    一、网络基础知识
    Android hook方式抓包
    基于springboot+vue的在线音乐播放点播分享平台 elementui
    SpringCloud-GetWay 路由网关
    『亚马逊云科技产品测评』活动征文|AWS 存储产品类别及其适用场景详细说明
    C语言的冒泡排序
    C++入门(2):缺省参数、函数重载、引用
    Webix JavaScript UI-9.24.0 Crack
  • 原文地址:https://blog.csdn.net/weixin_45778311/article/details/134073003