JDBC(JAVA学习)

1.JDBC的使用连接步骤:

a.导入驱动jar包
b.注册驱动
c.获取数据库连接对象 Connection
d.定义sql
  注意: sql的参数使用 ? 作为占位符
  	?占位符需要赋值
  	方法: setxxx(参数1,参数2)
  	参数1: ? 的位置编号, 从1开始
  	参数2: ? 的值
e.获取执行sql语句的对象 PreparedStatement
f.执行sql,接收返回结果
g.处理结果
h.释放资源

2.详解各个对象
1)DriverManager: 驱动管理对象

作用:
  a.注册驱动:告诉程序该使用哪一个数据库驱动jar
  b.获取数据库连接

2)Connection对象: 数据库连接对象

作用:
	a.获取执行sql 的对象
	  Statement	createStatement()
	b.管理事务:
		手动开启事务:setAutoCommit(boolean)
			方法参数设置成false.手动开启事务
		提交事务:commit()
		回滚事务:rollback()

3)Statement对象: 指定sql的对象

执行sql的三个方法:
  (1).boolean execute(String str)
      DDL/DML:返回fasle  DQL:返回true
        返回值: 指的是有没有结果
            因为 DML 和 DQL都有专门的执行方法,
            所以该方法通常用来指定DDL
  (2).int executeUpdate(String str)
      只能执行DML
        返回值: 表示影响了几行 
  (3).ResultSet executeQuery(String str)
      只能执行DQL
        返回值: 查询出来的结果集

      boolean next():游标向下移动一行
      	判断当前行是否是最后一行(是否有数据)
      	如果是,则返回false,如果不是则返回true


      getxxx(参数): 获取数据
      	xxx:代表数据类型
      	参数:
      	  1. int: 代表列的编号,从1开始 -> getString(1)
      	  2. String: 代表列的名字. -> getDouble("name");

    使用步骤:
      a.将游标向下移动一行
      b.判断是否有数据
      c.获取数据

4)PreparedStatement对象: 执行sql的对象

a.sql注入的问题
	输入用户名: 随意
    输入的密码: a' or 'b'='b  a' or '1' = '1  -> 恒成立
b.产生的原因:
    因为在做sql拼接的时候,有一些sql的特殊关键字参与了字符串的拼接,会造成安全性问题
c.解决sql注入问题:
	使用PreparedStatement对象来解决

d.预编译sql:参数使用? 作为占位符
	比如:select * from user where 
			username = ? and password = ?;

	?占位符需要赋值
    	方法: setxxx(参数1,参数2)
    	  	参数1: ? 的位置   编号, 从1开始
    	  	参数2: ? 的值

3.数据库连接池
概念:

其实就是一个容器,存放数据库连接的容器. 当系统初始化好后,这个容器就会被创建,在容器中会申请一些连接对象,
当用户来访问数据库时,就会从容器中获取连接对象 当用户访问完之后,会将连接对象归还给容器.

实现:

a.标准接口: DataSource -> javax.sql包
方法:
获取连接: getConnection()
归还连接: Connection.close()

b.市面上常见的连接池 a.Apache - dbcp b.c3p0 c.阿里 - druid

C3P0连接池:
使用第三方连接池步骤:

  a.导入jar包
  	c3p0-0.9.5.2.jar
  	mchange-commons-java-0.2.11.jar
  b.定义配置文件:
    名称(固定形式): c3p0.properties 或者 c3p0-config.xml
    driver = com.mysql.cj.jdbc.Driver
   代码:
url = jdbc:mysql://localhost:3306/jdbc_2107
user = root
password = 123456
存放配置文件的路径: 必须在类路径的根目录下 - 可以理解成存在文件src目录下

    c.创建数据库连接池对象: ComboPoolDtataSource

    d.获取连接: getConnection

代码实例:

public class JDBCUtils {
    //设置成静态成员变量
    static String driver;
    static String url;
    static String user;
    static String password;

    /*
        读取属性集(配置文件)
        必须在程序一开始执行就读取到配置文件
     */
    static{
        Properties pro = new Properties();
        try {
            pro.load(JDBCUtils.class.getResourceAsStream("db.properties"));
            driver = pro.getProperty("driver");
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //静态方法 - 获取数据库连接对象
    //使用配置文件避免硬编码方式
    public static Connection geConnection(){
        Connection conn = null;
        try {
            //1.导入驱动jar包
            //2.注册驱动
            Class.forName(driver);
            //3.获取数据库连接对象
            conn = DriverManager.getConnection(
                    url,
                    user,
                    password
            );
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return conn;
    }

    //封装 - close()
    public static void close(ResultSet rs, Statement stmt, Connection conn){
        try {
            //避免空指针
            if(rs != null){
                rs.close();
            }
            if(stmt != null){
                stmt.close();
            }
            if(conn != null){
                conn.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

5.JDBC的连接 和 连接池连接的区别

  a.通过连接池获取的连接关闭后,
  	连接对象返回给连接池,它的引用会设置为null
  b.通过JDBC获取的连接关闭后,
  	连接对象还在,但是状态是'已关闭状态'是不能再使用的.

Druid连接池:
1.使用步骤:

  a.导入jar包  
  b.定义配置文件:
    是properties形式,可以是任意名称,可以放在任意目录下
    (意味着不会自动加载,需要手动调用)
  c.加载配置文件. xx.properties
  d.获取数据库连接池对象: 
  	通过工厂方式来获取: DruidDataSourceFactory
  e.获取连接: getConnection

代码实例:

public class DruidUtils {
    //定义静态成员变量
    private static DataSource ds;

    //对连接池进行初始化操作
    static{
        try {
            //1.加载配置文件
            Properties pro = new Properties();
            pro.load(DruidUtils.class.getClassLoader()
                    .getResourceAsStream("druid.properties"));
            //2.获取DataSource
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /*获取连接*/
    public static Connection getConnection() throws SQLException {
        return  ds.getConnection();
    }

    /* 获取连接池方法*/
    public static DataSource getDataSource(){
        return ds;
    }

    /*释放资源*/
    public static void close(ResultSet rs, Statement stmt, Connection conn){
        try {
            //避免空指针
            if(rs != null){
                rs.close();
            }
            if(stmt != null){
                stmt.close();
            }
            if(conn != null){
                conn.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    /*释放资源 - 重载*/
    public static void close(Statement stmt, Connection conn){
        close(null,stmt,conn);
    }
}

2.定义工具类

  a.定义一个类(类名随意) DruidUtils
  b.提供静态代码块加载配置文件,初始化连接池对象
  c.提供方法
  	①.获取连接方法:通过数据库连接池获取连接
  	②.获取连接池的方法
  	③.释放资源

JDBCTemplate -> DBUtils(Apache)
1.Spring框架对JDBC的简单封装

提供了一个JDBCTemplate对象来简化JDBC的开发

2.使用步骤:

  a.导入jar包
  b.创建JDBCTemplate对象,依赖于DataSource
  c.调用JDBCTemplat的方法来完成CRUD操作

3.常用方法:

  update():DML语句 增删改操作
  queryForMap():查询结果将结果集封装成map集合
  queryForList():查询结果将结果集封装成list集合
  query():查询结果将结果集封装成JavaBean对象
  queryForObject():查询结果,将结果封装成对象

DAO:Data Access Object -> 数据访问对象
作用:数据库中拿到的数据将它封装成Java的对象

书写规范:

一张表对应一个实体类,再对应一个Dao
再对应一个测试类,测试dao中的所有方法

Dao有的方法:

a.增加一个对象
b.修改一个对象
c.根据id删除对象
d.根据id查询
e.查询全部 -> 分页查询,条件查询
f.查询总记录条数 -> 条件查询中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值