IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> JDBC笔记 -> 正文阅读

[大数据]JDBC笔记

JDBC

一、DriverManager:驱动管理对象

  1. 注册驱动:告诉程序该使用哪一个数据库驱动jar包

    Class.forName("com.mysql.jdbc.Driver");//写代码使用, mysql5版本之后的可以省略
  2. 获取数据库连接:

    方法:static Connection getConnection(String url,String user,String passworld);
    • url:指定连接的路径

      * 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
      * 例子:jdbc:mysql://localhost:3306/db3
      * 注意:如果是连接本机的mysql服务器,并且mysql服务器默认端口号为3306,则url可以简写为:jdbc:mysql:///db3
    • user:用户名

    • password:密码

二、Connection:数据库连接对象

  1. 获取执行sql的对象:

    • Statement createStatement( )

    • PreparedStatement preparedStatement(String sql)

  2. 管理事务:

    • 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务

    • 提交事务:commit( )

    • 回滚事务:roolback( )

三、Statement:执行sql的对象

  1. 执行sql:

    • boolean execute(String sql):可以执行任意的sql (了解)

    • int executeUpdate(String sql):执行DML(insert、update、delete)语句、DDl(create、alter、drop)语句

      • 返回值为影响的行数,可以通过这个影响的行数判断DML语句是否执行成功,返回值>0的则执行成功,反之,则执行失败

    • ResultSet executeQuery(String sql):执行DQL(select)语句

  2. 练习:

    public static void main(String[] args) {
     ? ?Connection conn = null;
     ? ?Statement stmt = null;
     ? ?try {
     ? ? ? ?//1. 注册驱动
     ? ? ? ?Class.forName("com.mysql.jdbc.Driver");
     ? ? ? ?//2. 定义sql语句
     ? ? ? ?String sql = "insert into account(id,name,salary) values(2,'李四',4000)";
     ? ? ? ?//3. 获取Connection对象
     ? ? ? ?conn = DriverManager.getConnection("jdbc:mysql:///db1", "root", "zzuli100011..");
     ? ? ? ?//4. 获取Statement对象
     ? ? ? ?stmt = conn.createStatement();
     ? ? ? ?//5. 执行sql语句
     ? ? ? ?int count = stmt.executeUpdate(sql);//返回影响的行数
     ? ? ? ?//6. 处理结果
     ? ? ? ?System.out.println(count);
     ? ? ? ?if(count>0){
     ? ? ? ? ? ?System.out.println("添加成功");
     ? ? ?  }else{
     ? ? ? ? ? ?System.out.println("添加失败");
     ? ? ?  }
     ?  } catch (ClassNotFoundException e) {
     ? ? ? ?e.printStackTrace();
     ?  } catch (SQLException e) {
     ? ? ? ?e.printStackTrace();
     ?  }finally {
     ? ? ? ?if(stmt != null){
     ? ? ? ? ? ?try {
     ? ? ? ? ? ? ? ?stmt.close();
     ? ? ? ? ?  } catch (SQLException e) {
     ? ? ? ? ? ? ? ?e.printStackTrace();
     ? ? ? ? ?  }
     ? ? ?  }
     ? ? ? ?if(conn != null){
     ? ? ? ? ? ?try {
     ? ? ? ? ? ? ? ?conn.close();
     ? ? ? ? ?  } catch (SQLException e) {
     ? ? ? ? ? ? ? ?e.printStackTrace();
     ? ? ? ? ?  }
     ? ? ?  }
     ?  }
    }

四、ResultSet:结果集对象

  1. next( ):游标向下移动一行。判断当前行是否是最后一行末尾,如果是返回false,如果不是返回true

  2. getXxx(参数):获取数据

    • Xxx:代表数据类型 如:int getInt( );

    • 参数:

      • int:代表列的编号。从1开始 如:getString(2);

      • String:代表列的名称。 如:getString("name");

练习:

public static void main(String[] args) {
 ? ?Connection conn = null;
 ? ?Statement stmt = null;
 ? ?ResultSet rs = null;
 ? ?try {
 ? ? ? ?//1. 注册驱动
 ? ? ? ?Class.forName("com.mysql.jdbc.Driver");
 ? ? ? ?//2. 定义sql语句
 ? ? ? ?//String sql = "insert into account(id,name,salary) values(2,'李四',4000)";
 ? ? ? ?String sql = "select * from account;";
 ? ? ? ?//3. 获取Connection对象
 ? ? ? ?conn = DriverManager.getConnection("jdbc:mysql:///db1", "root", "zzuli100011..");
 ? ? ? ?//4. 获取Statement对象
 ? ? ? ?stmt = conn.createStatement();
 ? ? ? ?//5. 执行sql语句
 ? ? ? ?rs = stmt.executeQuery(sql);//返回影响的行数
 ? ? ? ?//6. 处理结果(循环判断游标是否是最后一行末尾)
 ? ? ? ?while (rs.next()){ ?//6.1 让游标向下移动一行
 ? ? ? ?//6.2 获取数据
 ? ? ?      int id = rs.getInt(1);
 ? ? ? ? ? ?String name = rs.getString("name");
 ? ? ? ? ? ?double salary = rs.getInt("salary");
 ? ? ? ? ? ?System.out.println(id + "---" + name + "---" + salary);
 ? ? ?  }
 ?  } catch (ClassNotFoundException e) {
 ? ? ? ?e.printStackTrace();
 ?  } catch (SQLException e) {
 ? ? ? ?e.printStackTrace();
 ?  }finally {
 ? ? ? ?if(rs != null){
 ? ? ? ? ? ? ? ?try {
 ? ? ? ? ? ? ? ? ? ?rs.close();
 ? ? ? ? ? ? ?  } catch (SQLException e) {
 ? ? ? ? ? ? ? ? ? ?e.printStackTrace();
 ? ? ? ? ? ? ?  }
 ? ? ? ? ?  }
 ? ? ? ?if(stmt != null){
 ? ? ? ? ? ?try {
 ? ? ? ? ? ? ? ?stmt.close();
 ? ? ? ? ?  } catch (SQLException e) {
 ? ? ? ? ? ? ? ?e.printStackTrace();
 ? ? ? ? ?  }
 ? ? ?  }
 ? ? ? ?if(conn != null) {
 ? ? ? ? ? ?try {
 ? ? ? ? ? ? ? ?conn.close();
 ? ? ? ? ?  } catch (SQLException e) {
 ? ? ? ? ? ? ? ?e.printStackTrace();
 ? ? ? ? ?  }
 ? ? ?  }
 ?  }
}
 

抽取JDBC工具类:JDBCUtils

  • 目的:简化书写

//配置文件
url = jdbc:mysql:///db1
user = root
password = zzuli100011..
driver = com.mysql.jdbc.Driver
//JDBC工具类
public class JDBCUtils {
?
 ? ?private static String url;
 ? ?private static String user;
 ? ?private static String passworld;
 ? ?private static String driver;
?
 ? ?//配置文件的读取:只需要读取一次即可拿到这些值。使用静态代码块
 ? ?static {
 ? ? ? ?try {
 ? ? ? ? ? ?//1. 创建Properties类
 ? ? ? ? ? ?Properties pro = new Properties();
?
 ? ? ? ? ? ?//获取src路径下文件的方式--->ClassLoader 类加载器
 ? ? ? ? ? ?ClassLoader classLoader = JDBCUtils.class.getClassLoader();
 ? ? ? ? ? ?URL resource = classLoader.getResource("jdbc.properties");
 ? ? ? ? ? ?String path = resource.getPath();
?
 ? ? ? ? ? ?//2. 加载文件
 ? ? ? ? ? ?pro.load(new FileReader(path));//也可写绝对路径
 ? ? ? ? ? ?//3. 获取数据,赋值
 ? ? ? ? ? ?url = pro.getProperty("url");
 ? ? ? ? ? ?user = pro.getProperty("user");
 ? ? ? ? ? ?passworld = pro.getProperty("password");
 ? ? ? ? ? ?driver = pro.getProperty("driver");
 ? ? ? ? ? ?//4. 注册驱动
 ? ? ? ? ? ?try {
 ? ? ? ? ? ? ? ?Class.forName(driver);
 ? ? ? ? ?  } catch (ClassNotFoundException e) {
 ? ? ? ? ? ? ? ?e.printStackTrace();
 ? ? ? ? ?  }
 ? ? ?  } catch (IOException e) {
 ? ? ? ? ? ?e.printStackTrace();
 ? ? ?  }
 ?  }
?
 ? ?//抽取一个方法,获取连接对象,返回连接对象
 ? ?public static Connection getConnection() throws SQLException {
 ? ? ? ?return DriverManager.getConnection(url,user,passworld);
 ?  }
?
 ? ?//抽取一个方法,释放资源
 ? ?public static void close(Statement stmt,Connection conn){
 ? ? ? ?if(stmt != null){
 ? ? ? ? ? ?try {
 ? ? ? ? ? ? ? ?stmt.close();
 ? ? ? ? ?  } catch (SQLException e) {
 ? ? ? ? ? ? ? ?e.printStackTrace();
 ? ? ? ? ?  }
 ? ? ?  }
 ? ? ? ?if(conn != null){
 ? ? ? ? ? ?try {
 ? ? ? ? ? ? ? ?conn.close();
 ? ? ? ? ?  } catch (SQLException e) {
 ? ? ? ? ? ? ? ?e.printStackTrace();
 ? ? ? ? ?  }
 ? ? ?  }
 ?  }
 ? ?public static void close(ResultSet rs, Statement stmt, Connection conn){
 ? ? ? ?if(rs != null){
 ? ? ? ? ? ?try {
 ? ? ? ? ? ? ? ?rs.close();
 ? ? ? ? ?  } catch (SQLException e) {
 ? ? ? ? ? ? ? ?e.printStackTrace();
 ? ? ? ? ?  }
 ? ? ?  }
 ? ? ? ?if(stmt != null){
 ? ? ? ? ? ?try {
 ? ? ? ? ? ? ? ?stmt.close();
 ? ? ? ? ?  } catch (SQLException e) {
 ? ? ? ? ? ? ? ?e.printStackTrace();
 ? ? ? ? ?  }
 ? ? ?  }
 ? ? ? ?if(conn != null){
 ? ? ? ? ? ?try {
 ? ? ? ? ? ? ? ?conn.close();
 ? ? ? ? ?  } catch (SQLException e) {
 ? ? ? ? ? ? ? ?e.printStackTrace();
 ? ? ? ? ?  }
 ? ? ?  }
 ?  }
?
}
public class Demo02_JDBC {
?
 ? ?public static void main(String[] args) {
 ? ? ? ?Connection conn = null;
 ? ? ? ?Statement stmt = null;
 ? ? ? ?ResultSet rs = null;
 ? ? ? ?try {
 ? ? ? ? ? ?//1. 注册驱动
 ? ? ? ? ? ?//2. 获取Connection对象
 ? ? ? ? ? ?conn = JDBCUtils.getConnection();
 ? ? ? ? ? ?//3. 定义sql语句
 ? ? ? ? ? ?String sql = "select * from account;";
 ? ? ? ? ? ?//4. 获取Statement对象
 ? ? ? ? ? ?stmt = conn.createStatement();
 ? ? ? ? ? ?//5. 执行sql语句
 ? ? ? ? ? ?rs = stmt.executeQuery(sql);//返回影响的行数
 ? ? ? ? ? ?//6. 处理结果(循环判断游标是否是最后一行末尾)
 ? ? ? ? ? ?while (rs.next()){ ?//6.1 让游标向下移动一行
 ? ? ? ? ? ? ? ?//6.2 获取数据
 ? ? ? ? ? ? ? ?int id = rs.getInt(1);
 ? ? ? ? ? ? ? ?String name = rs.getString("name");
 ? ? ? ? ? ? ? ?double salary = rs.getInt("salary");
 ? ? ? ? ? ? ? ?System.out.println(id + "---" + name + "---" + salary);
 ? ? ? ? ?  }
 ? ? ?  } ?catch (SQLException e) {
 ? ? ? ? ? ?e.printStackTrace();
 ? ? ?  }finally {
 ? ? ? ? ? ?JDBCUtils.close(rs,stmt,conn);
 ? ? ?  }
 ?  }
}

五、PreparedStatement:执行sql的对象

  • SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全问题

    • 输入用户随便,输入密码:a' or 'a' = 'a

    • sql:select * from user where username = 'sdadasf' and password = 'a' or 'a' = 'a';

  • 预编译SQL:参数使用 ? 作为占位符

  • 步骤

    1. 导入驱动jar包 mysql-connector-java-5.1.46.jar

    2. 注册驱动

    3. 获取数据库连接对象 Connection

    4. 定义sql

      • sql使用 ? 作为占位符。如:select * from user where username = ? and password = ? ;

    5. 获取执行sql语句的对象 PreparedStatement Connection.preparedStatement(String sql);

    6. 给 ? 赋值:

      • 方法:setXxx(参数1 , 参数2)

        • 参数1:?的位置编号 从1开始

        • 参数2:?的值

    7. 执行sql,接受返回结果,不需要传递sql语句

    8. 处理结果

    9. 释放资源

    //登录案例
    public boolean login(String username,String password) {
     ? ?if(username == null ||password == null){
     ? ? ? ?return false;
     ?  }
     ? ?Connection conn = null;
     ? ?PreparedStatement pstmt = null;
     ? ?ResultSet rs = null;
     ? ?try {
     ? ? ? ?//1. 注册驱动
     ? ? ? ?//2. 获取Connection对象
     ? ? ? ?conn = JDBCUtils.getConnection();
     ? ? ? ?//3. 定义sql语句
     ? ? ? ?String sql = "select * from account where username = ? and password = ?;";
     ? ? ? ?//4. 获取执行sql的Statement对象
     ? ? ? ?pstmt = conn.prepareStatement(sql);
     ? ? ? ?//5. 给?赋值
     ? ? ? ?pstmt.setString(1,username);
     ? ? ? ?pstmt.setString(2,password);
     ? ? ? ?//5. 执行查询,不再需要传递sql语句
     ? ? ? ?rs = pstmt.executeQuery();//返回影响的行数
     ? ? ? ?//6. 判断(如果有下一行,返回true)
     ? ? ? ?return rs.next();
     ? ? ? ?
     ?  } ?catch (SQLException e) {
     ? ? ? ?e.printStackTrace();
     ?  }finally {
     ? ? ? ?JDBCUtils.close(rs,pstmt,conn);
     ?  }
     ? ?return false;
    }

六、事务

  1. 使用Connection对象来管理事务

    • 开启事务:setAutoCommit(boolean autoCommit):调用该方法,参数设置为false,即可开启事务

      • 在执行sql之前开启事务

    • 提交事务:commit( )

      • 当所有的sql都执行完提交事务

    • 回滚事务:roolback( )

      • 在catch中回滚事务

七、数据库连接池

1. 概念:

其实就是一个容器(集合),存放数据库连接对象的容器

2. 实现:

标准接口:DataSource

  • 获取连接:getConnection( )

  • 归还连接:Connection.close( )

    • 如果Connection是从连接池中获取的,那么调用Connection.close( )方法,则不会再关闭连接了,而是归还连接

3. C3P0:数据库连接池技术

  • 步骤:

    1. 导入jar包:

    2. 定义配置文件:

      • 名称:c3p0.properties 或者 c3p0-config.xml

      • 路径:直接将文件放在src目录下即可

      <c3p0-config>
       ?<!-- 默认配置 -->
       ?<default-config>
       ? ?<!-- 连接参数 -->
       ? ?<property name="driverClass">com.mysql.jdbc.Driver</property>
       ? ?<property name="jdbcUrl">jdbc:mysql://localhost:3306/db1</property>
       ? ?<property name="user">root</property>
       ? ?<property name="password">root</property>
      ?
       ? ?<!-- 连接池参数 -->
       ? ?<!-- 初始化申请的连接数量 -->
       ? ?<property name="initialPoolSize">5</property>
       ? ?<!-- 最大的连接数量 -->
       ? ?<property name="maxPoolSize">10</property>
       ? ?<!-- 超时时间 -->
       ? ?<property name="checkoutTimeout">3000</property>
       ?</default-config>
       
       ?<!-- 自定义配置 -->
       ?<named-config name="otherc3p0">
       ? ?<property name="driverClass">com.mysql.jdbc.Driver</property>
       ? ?<property name="jdbcUrl">jdbc:mysql://localhost:3306/db1</property>
       ? ?<property name="user">root</property>
       ? ?<property name="password">root</property>
      ?
       ? ?<!-- 连接池参数 -->
       ? ?<!-- 初始化申请的连接数量 -->
       ? ?<property name="initialPoolSize">5</property>
       ? ?<!-- 最大的连接数量 -->
       ? ?<property name="maxPoolSize">8</property>
       ? ?<!-- 超时时间 -->
       ? ?<property name="checkoutTimeout">1000</property>
       ?</named-config>
      </c3p0-config>

    3. 创建核心对象:数据库连接池对象 CombopooledDataSource

    4. 获取连接:getConnection

    import com.mchange.v2.c3p0.ComboPooledDataSource;
    ?
    import java.sql.Connection;
    import java.sql.SQLException;
    ?
    public class Demo01 {
     ? ?public static void main(String[] args) throws SQLException {
     ? ? ? ?//1. 创建数据库连接池对象,使用默认配置
     ? ? ? ?ComboPooledDataSource cpds = new ComboPooledDataSource();
     ? ? ? ?//1.1 创建数据库连接池对象,使用指定的名称配置
    // ? ?  ComboPooledDataSource cpds = new ComboPooledDataSource("otherc3p0");
     ? ? ? ?//2. 获取连接对象
     ? ? ? ?Connection conn = cpds.getConnection();
     ? ? ? ?//3. 打印
     ? ? ? ?System.out.println(conn);
     ? ? ? ?//com.mchange.v2.c3p0.impl.NewProxyConnection@3caeaf62
     ?  }
    }

4. Druid:数据库连接池实现技术

  • 步骤:

    1. 导入jar包:druid-1.0.9.jar Central Repository: com/alibaba/druid (maven.org)

    1. 定义配置文件:是.propertices后缀结尾的,文件名可以叫做任意名称,放在任意目录下

    2. 加载配置文件。propertices

      driverClassName=com.mysql.jdbc.Driver
      url=jdbc:mysql:///db1
      username=root
      password=root
      # 初始化连接数
      initialSize=5
      # 最大连接数
      maxActive=10
      # 最大等待时间
      maxWait=3000
    3. 获取数据库连接池对象:通过工厂来获取,DruidDataSourceFactory

    4. 获取连接:getConnetion

import com.alibaba.druid.pool.DruidDataSourceFactory;
?
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
?
public class Demo01_druid {
 ? ?public static void main(String[] args) throws Exception {
 ? ? ? ?//1. 导入jar包
 ? ? ? ?//2. 定义配置文件
 ? ? ? ?//3. 加载配置文件
 ? ? ? ?Properties pro = new Properties();
 ? ? ? ?InputStream is = Demo01_druid.class.getClassLoader().getResourceAsStream("druid.properties");
 ? ? ? ?pro.load(is);
 ? ? ? ?//4. 获取连接池对象
 ? ? ? ?DataSource ds = DruidDataSourceFactory.createDataSource(pro);
 ? ? ? ?//5. 获取连接
 ? ? ? ?Connection conn = ds.getConnection();
 ? ? ? ?System.out.println(conn);
 ?  }
}

抽取JDBC工具类:JDBCTUtils

  1. 定义一个工具类:JDBCUtils

  2. 提供静态代码块加载配置文件,初始化连接对象

  3. 提供方法:

    • 获取连接方法:通过数据库连接池获取对象

    • 释放资源

    • 获取连接池方法

# 配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db1
username=root
password=zzuli100011..
# 初始化连接数
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
?
//连接池的工具类
public class JDBCUtils {
?
 ? ?private static DataSource ds;
?
 ? ?static {
 ? ? ? ?try {
 ? ? ? ? ? ?//1. 加载配置文件
 ? ? ? ? ? ?Properties pro = new Properties();
 ? ? ? ? ? ?pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
 ? ? ? ? ? ?//2. 获取连接池
 ? ? ? ? ? ?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(Statement stmt,Connection conn){
 ? ? ? ?if(stmt != null){
 ? ? ? ? ? ?try {
 ? ? ? ? ? ? ? ?stmt.close();
 ? ? ? ? ?  } catch (SQLException e) {
 ? ? ? ? ? ? ? ?e.printStackTrace();
 ? ? ? ? ?  }
 ? ? ?  }
 ? ? ? ?if(conn != null){
 ? ? ? ? ? ?try {
 ? ? ? ? ? ? ? ?conn.close();//归还连接
 ? ? ? ? ?  } catch (SQLException e) {
 ? ? ? ? ? ? ? ?e.printStackTrace();
 ? ? ? ? ?  }
 ? ? ?  }
 ?  }
 ? ?public static void close(ResultSet rs,Statement stmt, Connection conn){
 ? ? ? ?if(rs != null){
 ? ? ? ? ? ?try {
 ? ? ? ? ? ? ? ?rs.close();
 ? ? ? ? ?  } catch (SQLException e) {
 ? ? ? ? ? ? ? ?e.printStackTrace();
 ? ? ? ? ?  }
 ? ? ?  }
 ? ? ? ?if(stmt != null){
 ? ? ? ? ? ?try {
 ? ? ? ? ? ? ? ?stmt.close();
 ? ? ? ? ?  } catch (SQLException e) {
 ? ? ? ? ? ? ? ?e.printStackTrace();
 ? ? ? ? ?  }
 ? ? ?  }
 ? ? ? ?if(conn != null){
 ? ? ? ? ? ?try {
 ? ? ? ? ? ? ? ?conn.close();//归还连接
 ? ? ? ? ?  } catch (SQLException e) {
 ? ? ? ? ? ? ? ?e.printStackTrace();
 ? ? ? ? ?  }
 ? ? ?  }
 ?  }
?
}
import cn.itcast.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
?
//使用新的工具类执行sql语句添加数据
public class Demo02_druid {
?
 ? ?public static void main(String[] args) {
 ? ? ? ?Connection conn = null;
 ? ? ? ?PreparedStatement pstmt = null;
?
 ? ? ? ?try {
 ? ? ? ? ? ?//1. 获取连接
 ? ? ? ? ? ?conn = JDBCUtils.getConnection();
 ? ? ? ? ? ?//2. 定义sql语句
 ? ? ? ? ? ?String sql = "insert into account values(null,?,?)";
 ? ? ? ? ? ?//3. 获取prepareStatement对象
 ? ? ? ? ? ?pstmt = conn.prepareStatement(sql);
 ? ? ? ? ? ?//4. 给?赋值
 ? ? ? ? ? ?pstmt.setString(1,"赵六");
 ? ? ? ? ? ?pstmt.setInt(2,8000);
 ? ? ? ? ? ?//5. 执行sql
 ? ? ? ? ? ?int count = pstmt.executeUpdate();
 ? ? ? ? ? ?System.out.println(count);
 ? ? ?  } catch (SQLException e) {
 ? ? ? ? ? ?e.printStackTrace();
 ? ? ?  }finally {
 ? ? ? ? ? ?//6. 释放资源
 ? ? ? ? ? ?JDBCUtils.close(pstmt,conn);
 ? ? ?  }
 ?  }
?
}

八、Spring JDBC

  • Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发

  • 步骤:

    1. 导入jar包

      commons-logging-1.2.jar

      spring-beans-5.0.0.RELEASE.jar

      spring-core-5.0.0.RELEASE.jar

      spring-jdbc-5.0.0.RELEASE.jar

      spring-tx-5.0.0.RELEASE.jar

      下载链接:JFrog

    2. 创建JdbcTemplate对象。依赖于数据源DataSource

      • JdbcTemplate template = new JdbcTemplate( ds );

    3. 调用JdbcTemplate的方法来完成CRUD的操作

      • update( ):执行DML语句。(增删改语句)

      • queryForMap( ):查询结果将结果集封装为map集合

        • 将列名作为key,将值作为value,将这条记录封装为map集合,这个方法查询的结果集长度只能是1

      • queryForList( ):查询结果将结果集封装为list集合

        • 将每一条记录封装为一个Map集合,再将Map集合装在到List集合中去

      • query( ):查询结果,将结果封装为JavaBean对象

        • 第二个参数:RowMapper

        • 一般使用BeanPropertyRowMapper<类型>(类型.class)实现类,可以完成数据到JavaBean的自动封装

      • queryForObject:查询结果集,将结果封装为对象

        • 一般用于聚合函数的查询

import cn.itcast.utils.JDBCUtils;
import org.springframework.jdbc.core.JdbcTemplate;

//JdbcTemplate入门
public class Demo01_JdbcTemplate {
 ? ?public static void main(String[] args) {
 ? ? ? ?//1. 导入jar包
 ? ? ? ?//2. 创建JDBCTemplate对象
 ? ? ? ?JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
 ? ? ? ?//3. 设置sql语句
 ? ? ? ?String sql = "update account set salary = 5000 where id = ?";
 ? ? ? ?//4. 调用JDBCTemplate的方法
 ? ? ? ?int count = template.update(sql,3);
 ? ? ? ?System.out.println(count);
 ?  }
}
import cn.itcast.domain.Emp;
import cn.itcast.utils.JDBCUtils;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
import java.util.Map;
?
public class Demo02_JdbcTemplate {
?
 ? ?private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
?
 ? ?//1. 查询一条记录,将其封装为Map,这个方法查询的结果集长度只能是1
 ? ?@Test
 ? ?public void test1(){
 ? ? ? ?String sql = "select * from emp where id = ?";
 ? ? ? ?Map<String, Object> map = template.queryForMap(sql, 1001);
 ? ? ? ?System.out.println(map);
 ? ? ? ?//{id=1001, emp_name=孙悟空, job_id=4, manager_id=1004, joindate=2000-10-17, salary=5000.00, bonus=null, dept_id=20}
 ?  }
?
 ? ?//2. 查询所有记录,将其封装为List,将List中的每一条记录都封装为一个map集合
 ? ?@Test
 ? ?public void test2(){
 ? ? ? ?String sql = "select * from emp";
 ? ? ? ?List<Map<String, Object>> list = template.queryForList(sql);
 ? ? ? ?for (Map<String, Object> objectMap : list) {
 ? ? ? ? ? ?System.out.println(objectMap);
 ? ? ?  }
 ?  }
?
 ? ?//3. 查询所有记录,将其封装为Emp(JavaBean)对象的List集合(Emp为自己创建的一个类)
 ? ?@Test
 ? ?public void test3(){
 ? ? ? ?String sql = "select * from emp";
 ? ? ? ?List<Emp> list = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
 ? ? ? ?for (Emp emp : list) {
 ? ? ? ? ? ?System.out.println(emp);
 ? ? ?  }
 ?  }
?
 ? ?//4. 查询总记录数
 ? ?@Test
 ? ?public void test4(){
 ? ? ? ?String sql = "select count(id) from emp";
 ? ? ? ?Long total = template.queryForObject(sql,long.class);
 ? ? ? ?System.out.println(total);
 ?  }
}
import java.util.Date;
//上面第三个查询中用到
public class Emp {
?
 ? ?private Integer id;
 ? ?private String emp_name;
 ? ?private Integer job_id;
 ? ?private Integer manager_id;
 ? ?private Date joindate;
 ? ?private Double salary;
 ? ?private Double bonus;
 ? ?private Integer dept_id;
?
 ? ?public Integer getId() {
 ? ? ? ?return id;
 ?  }
?
 ? ?public void setId(Integer id) {
 ? ? ? ?this.id = id;
 ?  }
?
 ? ?public String getEmp_name() {
 ? ? ? ?return emp_name;
 ?  }
?
 ? ?public void setEmp_name(String emp_name) {
 ? ? ? ?this.emp_name = emp_name;
 ?  }
?
 ? ?public Integer getJob_id() {
 ? ? ? ?return job_id;
 ?  }
?
 ? ?public void setJob_id(Integer job_id) {
 ? ? ? ?this.job_id = job_id;
 ?  }
?
 ? ?public Integer getManager_id() {
 ? ? ? ?return manager_id;
 ?  }
?
 ? ?public void setManager_id(Integer manager_id) {
 ? ? ? ?this.manager_id = manager_id;
 ?  }
?
 ? ?public Date getJoindate() {
 ? ? ? ?return joindate;
 ?  }
?
 ? ?public void setJoindate(Date joindate) {
 ? ? ? ?this.joindate = joindate;
 ?  }
?
 ? ?public Double getSalary() {
 ? ? ? ?return salary;
 ?  }
?
 ? ?public void setSalary(Double salary) {
 ? ? ? ?this.salary = salary;
 ?  }
?
 ? ?public Double getBonus() {
 ? ? ? ?return bonus;
 ?  }
?
 ? ?public void setBonus(Double bonus) {
 ? ? ? ?this.bonus = bonus;
 ?  }
?
 ? ?public Integer getDept_id() {
 ? ? ? ?return dept_id;
 ?  }
?
 ? ?public void setDept_id(Integer dept_id) {
 ? ? ? ?this.dept_id = dept_id;
 ?  }
?
 ? ?@Override
 ? ?public String toString() {
 ? ? ? ?return "Emp{" +
 ? ? ? ? ? ? ? ?"id=" + id +
 ? ? ? ? ? ? ? ?", emp_name='" + emp_name + '\'' +
 ? ? ? ? ? ? ? ?", job_id=" + job_id +
 ? ? ? ? ? ? ? ?", manager_id=" + manager_id +
 ? ? ? ? ? ? ? ?", joindate=" + joindate +
 ? ? ? ? ? ? ? ?", salary=" + salary +
 ? ? ? ? ? ? ? ?", bonus=" + bonus +
 ? ? ? ? ? ? ? ?", dept_id=" + dept_id +
 ? ? ? ? ? ? ? ?'}';
 ?  }
}

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 12:03:34  更:2021-10-17 12:04:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:04:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码