zoukankan      html  css  js  c++  java
  • 2021.1.6

    1.JDBC概念

    • 什么是JDBC:使用java语言连接数据库的技术,使得java可以和数据库联合使用
    • 本质:是官方定义的一套操作数据库的规范,内部放的都是接口.数据库厂商去实现这一套接口,提供对应的数据库驱动jar包(内部放的是具体的接口实现),我们可以使用驱动jar包完成对数据库的连接和操作.所以就是不同的数据库就对应不同的jar包,所以才能完成对不同数据库的连接.

    快速入门连接

    • 步骤:6步骤
      1. 把mysql的jar包添加到工程的lib文件夹下面
      2. .添加数据库驱动,Driver,forname里面的数据是jar包里面Driver.class的地址
      3. 获取连接数据库的连接对象Connection
        jdbc:mysql-->表示连接的是mysql localhost:表示本地 3306:默认端口号 java31:表示连接的数据库
        两个root分别数数据库的账号和密码
      4. 准备sql语句
      5. 执行sql语句,先获取执行sql语句的对象,再通过对象执行Statement
      6. 通过statement对象执行sql语句
      7. 关闭流:因为之前的都是流操作,所以要关闭打开的连接对象connection statement
        符合先打开的后关闭 后打开的先关闭原则


    注意:最核心的就是sql语句,因为其他的基本上都是不变的,只有sql语句变得多啊

    回忆昨天:

    • 多表连接
      • 内连接:
        • 隐式内连接 用 逗号 隔开,连接条件使用where,没有inner join
        • 显示内连接:使用关键字 inner join 连接条件使用on 没有on就会出现笛卡尔现象
      • 外连接:
        • 左外连接:left [outer] join on 条件 --- >左表为主表,查询出来左表所有的信息
        • 右外连接:right [outer] join on 条件--- >右表连接,查询出来右表所有的信息
      • 子查询
        • 单行单列:可以使用比较运算符 > < >= <= != <> 条件放在where语句后面
        • 多行单列:使用in运算符 in(三散列数据) 条件放在where语句后面
        • 多行多列:放在from 后面,因为查询出来的是一张表,作为一张虚拟表可以进行二次查询的条件判断

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

    1. java.sql:所有与JDBC访问数据库相关的数据和接口都在此包之中

      • DriverManager;是一个类 , 驱动管理功能,注册驱动,获取数据库链接对象

      • Connection;是一个接口 , 连接对象,用于创建执行sql对象Statement,PreparedStatement对象

      • Statement;是一个接口,,,sql语句执行对象,用于将sql语句发送个数据库服务器

      • PreparedStatement: sql语句执行对象

      • ResultSet :是一个接口,结果集,把数据库查询出来的数据封装到集合里面

    2. javax.sql:用到数据库连接池,是数据库扩展包,提供数据库一些额外操作,比如:连接池

    3. DriverManager

      1. 从JDBC3往后,我们可以不用写注册驱动,也就是Class.forName,但是还是建议书写

      2. Connection DriverManager.getConnection(url,user,password):可以获得数据库的连接对象

        也可以通过Connection DriverManager.getConnection(String url,Properties info):通过连接字符串和属性对象,可以获得数据库的连接对象

      • user:登陆数据库用户名
      • password:登陆数据库的密码
      • url:数据库连接路径:对于mysql而言::-->jdbc:mysql://服务器ip地址:端口号/数据库名称 --->如果是本地服务器可以省略IP地址和端口号-->jdbc:mysql:///数据库名称----->如果出现乱码jdbc:mysql:///数据库名称?characterEncoding=utf8.
      • 驱动路径: com.mysql.jdbc.Driver
    4. Connection接口
      作用:连接数据库,是一个接口,由具体的厂商提供具体的实现类,代表一个连接对象

      • createStatement():创建一个sql执行对象
      • PrepareStatement prepareStatement();
        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类型对照

    sql jdbc方法 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

    `
    // 数据库工具类
    public class DBUtil {
    // 定义四个常量值
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql:///java31?characterEncoding=utf8";
    private static final String USER = "root";
    private static final String PASSWORD = "root";
    // 定义JDBC常用类和接口
    private static Connection con = null;
    private static Statement st = null;
    private static PreparedStatement ps = null;
    private static ResultSet set = null;

    	static {
    		try {
    			Class.forName(DRIVER);
    			con = DriverManager.getConnection(URL, USER, PASSWORD);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	// 针对查询的功能
    	public static ResultSet select(String sql,Object[] args) {
    		//String sql2   =  "select * from account where u_name = ? and password = ?"; 
    		try {
    			// 获取预处理对象
    			 ps = con.prepareStatement(sql);
    			 // 使用sql语句中的占位符  ?
    			 // 遍历数组
    			 // 占位符 在sql中是有前后顺序的   u_name对应的问号 索引是 1 password对应的问号就是2
    			 for (int i = 0; i < args.length; i++) {
    				// 把问号提换成具体的数据
    				ps.setObject(i+1, args[i]);
    			}
    		   // 执行sql语句 获取结果值
    		   set = ps.executeQuery();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return set;
    	}
    	// 针对更新的功能  insert update delete  executeUpdate()
    	public static int update(String sql,Object[] args) {
    		// 获取预处理对象
    		// 定义一个变量 用来记录印象数据库表的行数
    		int count = 0;
    		 try {
    			ps = con.prepareStatement(sql);
    			 // 使用sql语句中的占位符  ?
    			 // 遍历数组
    			 // 占位符 在sql中是有前后顺序的   u_name对应的问号 索引是 1 password对应的问号就是2
    			 for (int i = 0; i < args.length; i++) {
    				// 把问号提换成具体的数据
    				ps.setObject(i+1, args[i]);
    			}
    		   // 执行sql语句 获取结果值
    		   count = ps.executeUpdate();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		// 返回给调用处 
    		return count;
    	}	
    	// 关闭连接的方法
    	public static void closeAll() {
    		// 关闭时 先关闭ResultSet
    			if (set != null) {
    				try {
    					set.close();
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    			}
    			if (st != null) {
    				try {
    					st.close();
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    			}
    			if (con != null) {
    				try {
    					con.close();
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    			}
    	}
    

    }

    `
    表与类的关系

    • 整个表可以看做成一个类
    • 表的每一行称之为一条记录,可以看做成一个类的实例
    • 表中的每一列可以看做成实例对象中的每个属性。
    • 实体类、model类需要和数据库中的类进行一一映射
      • 表中的列名和model类中的属性名保持一致
      • 表中的列字段数据类型和model类中的属性数据类型保持一致
    • 操作:数据库java31中的 account表

    model类

    Account类

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

    项目分层
    ​ 合理的分层能够使项目的开发和维护更方便

  • 相关阅读:
    python基础 列表生成式
    docker 基础
    xpath例子
    redis删除以什么开头的key
    redis 关闭持久化
    python爬虫 保存页面
    python爬虫操作cookie
    SQl函数的写法
    加料记录(大屏幕)
    ios 调试
  • 原文地址:https://www.cnblogs.com/tushao/p/14243366.html
Copyright © 2011-2022 走看看