zoukankan      html  css  js  c++  java
  • JDBC

    JDBC

      JDBC概念

    • 什么是JDBC:Java DataBase Connectivity 使用Java语言连接数据库的技术

    JDBC概述

    • 本质:就是官方定义的操作数据库的一套规范、规则,都是接口。各个数据库厂商去实现这套接口,提供对应的数据库驱动jar包。我们可以使用这个驱动jar包,来完成连接数据库操作数据库的功能

    • 快速入门:

      • 步骤

     1     // 1. 添加数据库驱动jar包
     2         // 2. 注册驱动  Driver com.mysql.jdbc.Driver ClassNotFoundException
     3         Class.forName("com.mysql.jdbc.Driver");// 通过该类的路径反射生成该来的字节码对象
     4         // 3. 获取数据库的连接对象  Connection
     5         Connection connection =                    DriverManager.getConnection("jdbc:mysql://192.168.14.149:3306/java31", "root", "root");
     6         // 4. 准备sql语句
     7         String sql = "update account set balance = 20000 where username = '张三'";
     8         // 5. 获取执行sql语句的对象  Statement
     9         Statement statement = connection.createStatement();
    10         // 6. 通过statement对象执行sql语句
    11         int count = statement.executeUpdate(sql);
    12         // 判断如果count>0就代表执行成功
    13         if (count > 0)  {
    14            System.out.println("更新数据库成功!");    
    15         } else {
    16             System.out.println("更新数据库失败!");
    17         }
    18         // 打开的连接对象关闭  先打开后关闭  后打开先关闭
    19         statement.close();
    20         connection.close();

    介绍JDBC快速入门使用到的包和类

    • java.sql 所有与JDBC访问数据库相关的类和接口。

    • javax.sql 用到数据库连接池 数据库的扩展包,提供数据库操作额外一些功能,如:连接池

    • DrierManager 驱动管理 注册驱动 还有获取数据库连接对象

    • Connection 连接对象 用于创建执行sql对象 Statement 、PreparedStatement对象

    • Statement sql语句执行对象,用于将sql语句发送给数据库服务器

    • PreparedStatement sql语句执行对象 是Statement接口的子接口。

    • ResultSet 用于封装从数据库查询出来的结果值

    DriverManager类

    • 从JDBC3开始,可以不用注册驱动可以直接使用。Class.forName();

    • Connection getConnection(url,user,password): 可以获取到数据库的连接对象

    • Connection getConnection(String url,Properties info): 通过连接字符串和属性对象 获取数据连接对象

    • user 登录数据库用户名

    • password 登录数据库的密码

    • url 连接数据库的路径 对于mysql而言 jdbc:mysql:// 服务器ip地址:端口号3306/数据库名称?[参数名 =参数值]

    • 驱动类路径 com.mysql.jdbc.Driver

    • jdbc:mysql:// 服务器ip地址:端口号3306/数据库名称?[参数名 =参数值],如果数据库的服务器是在本地中,省略掉ip地址和端口号---> jdbc:mysql:///数据库名称?[参数名 =参数值]

      如果数据传输时引发了乱码,后面可以使用 参数 characterEncoding = utf8

      jdbc:mysql:///数据库名称?characterEncoding = utf8

    Connection接口

    作用: 连接数据库,它是一个接口,由具体的厂商来提供具体的实现类,代表的是一个连接对象。

    • Statement createStatement() 创建一个sql执行对象

    • PrepareStatement preparedStatement() 创建一个sql预处理对象

    Statement接口

    作用:用来执行sql语句,本质是把sql语句发送给数据库服务器

    • int executeUpdate(String sql) 用于把sql语句发送给服务器,执行增删改操作。返回值int 影响数据库的记录数(行数)

    • ResultSet executeQuery(String sql) 用于把sql语句发送给服务器,执行查询操作。返回值ResultSet 查询返回的结果集。

    PreparedStatement

    • 执行sq的l对象

    • 会防止一些sql非法注入问题,在拼接sql语句时,可能会造成安全性问题。如:" select * from account where username like '% " +username + " % ' and balance = ' " + balance + " ' + " or 1 = 1 "

    • 此时出现 " or 1=1 " 非法拼接问题。

    • 使用预编译的sql,参数使用?作为占位符

    • 操作:

      • 在sql语句中涉及到参数时使用?替代具体的数据 如: select * from user where username = ? and password = ?

      • 使用连接对象执行sql语句获取预编译对象 connection.preparedStatement(String sql)

      • 给?赋值:

        使用方法:setXxx(?索引下标,?对应的实际值)

      • 使用预编译对象执行sql,获取返回的结果集值--->preparedStatement.executeQuery();

      • 处理结果

      • 释放资源。

    释放资源

    • 需要释放的资源对象: ResultSet对象 Statement对象 Connection对象

    • 释放的顺序: 先开后关,后开先关 ResultSet----->Statement------>Connection

    • 释放资源:使用finally语句块,一定会被加载到。不能单独使用,需要搭配try语句块

    常用数据库数据类型和Java类型对照

    SQLJDBC方法JAVA
    int getInt() int
    bigInt getLong() long
    bit getBoolean() boolean
    varchar getString() String
    date/time/TimeStamp getDate/getTime/getTimeStamp java.util.Date/java.sql.Time/java.sql.Timestamp
    double getDouble() double

    备注:java.sql.Date/Time/TimeStamp(时间戳)三个共同的父类是----->java.util.Date

    数据库工具类 DBUtil

     1 // 数据库工具类
     2 public class DBUtil {
     3         // 定义四个常量值
     4         private static final String DRIVER = "com.mysql.jdbc.Driver";
     5         private static final String URL = "jdbc:mysql:///java31?characterEncoding=utf8";
     6         private static final String USER = "root";
     7         private static final String PASSWORD = "root";
     8         // 定义JDBC常用类和接口
     9         private static Connection con = null;
    10         private static Statement st = null;
    11         private static PreparedStatement ps = null;
    12         private static ResultSet set = null;
    13         
    14         static {
    15             try {
    16                 Class.forName(DRIVER);
    17                 con = DriverManager.getConnection(URL, USER, PASSWORD);
    18             } catch (Exception e) {
    19                 e.printStackTrace();
    20             }
    21         }
    22         // 针对查询的功能
    23         public static ResultSet select(String sql,Object[] args) {
    24             //String sql2   =  "select * from account where u_name = ? and password = ?"; 
    25             try {
    26                 // 获取预处理对象
    27                  ps = con.prepareStatement(sql);
    28                  // 使用sql语句中的占位符  ?
    29                  // 遍历数组
    30                  // 占位符 在sql中是有前后顺序的   u_name对应的问号 索引是 1 password对应的问号就是2
    31                  for (int i = 0; i < args.length; i++) {
    32                     // 把问号提换成具体的数据
    33                     ps.setObject(i+1, args[i]);
    34                 }
    35                // 执行sql语句 获取结果值
    36                set = ps.executeQuery();
    37             } catch (SQLException e) {
    38                 e.printStackTrace();
    39             }
    40             return set;
    41         }
    42         // 针对更新的功能  insert update delete  executeUpdate()
    43         public static int update(String sql,Object[] args) {
    44             // 获取预处理对象
    45             // 定义一个变量 用来记录印象数据库表的行数
    46             int count = 0;
    47              try {
    48                 ps = con.prepareStatement(sql);
    49                  // 使用sql语句中的占位符  ?
    50                  // 遍历数组
    51                  // 占位符 在sql中是有前后顺序的   u_name对应的问号 索引是 1 password对应的问号就是2
    52                  for (int i = 0; i < args.length; i++) {
    53                     // 把问号提换成具体的数据
    54                     ps.setObject(i+1, args[i]);
    55                 }
    56                // 执行sql语句 获取结果值
    57                count = ps.executeUpdate();
    58             } catch (SQLException e) {
    59                 // TODO Auto-generated catch block
    60                 e.printStackTrace();
    61             }
    62             // 返回给调用处 
    63             return count;
    64         }   
    65         // 关闭连接的方法
    66         public static void closeAll() {
    67             // 关闭时 先关闭ResultSet
    68                 if (set != null) {
    69                     try {
    70                         set.close();
    71                     } catch (SQLException e) {
    72                         e.printStackTrace();
    73                     }
    74                 }
    75 if (st != null) {
    76 try {
    77 st.close();
    78     } catch (SQLException e) {
    79 e.printStackTrace();
    80     }
    81     }
    82 if (con != null) {
    83 try {
    84 con.close();
    85     } catch (SQLException e) {
    86 e.printStackTrace();
    87     }
    88     }
    89     }
    90 }

    表与类的关系

    • 整个表可以看做成一个类

    • 表的每一行称之为一条记录,可以看做成一个类的实例

    • 表中的每一列可以看做成实例对象中的每个属性。

    • 实体类、model类需要和数据库中的类进行一一映射

      • 表中的列名和model类中的属性名保持一致

      • 表中的列字段数据类型和model类中的属性数据类型保持一致

    • 操作:数据库java31中的 account表

    account表结构信息

      •  需要创建封装层中的model类 -----> Account类

    Account类

    Account类

     表与实体类的对应关系如图所示:

    表与实体类对应关系

     

     

  • 相关阅读:
    定义模块与增加模块中的测试代码
    20150412自省
    Python中暂未解决的问题
    Node基础_文件系统
    Node基础_Buffer缓冲区
    Node基础_npm简介
    Node基础_模块化简介及详解
    Node基础_node简介
    Nosql_Mongoose简介及操作
    Nosql_MongoDB简单的查询练习
  • 原文地址:https://www.cnblogs.com/lk625/p/14248829.html
Copyright © 2011-2022 走看看