• JDBC8.0+


    首先创建工程,导入jar包

    1.注册驱动

    1. //注册驱动
    2. //利用反射,较为灵活
    3. Class.forName("com.mysql.cj.jdbc.Driver");
    4. /**问题:会注册俩次驱动
    5. * 解决方案:只触发静态代码块
    6. * 触发静态代码块:
    7. * 类加载机制:类加载的时候,会触发静态代码块
    8. * 加载【class文件->jvm虚拟机的class对象】
    9. * 连接【验证(检查文件类型)->准备(静态变量默认值)->解析(触发静态代码块)】
    10. * 初始化(静态属性赋真实值)
    11. * 触发类加载:
    12. * 1.new关键字
    13. * 2.调用静态方法
    14. * 3.调用静态属性
    15. * 4.接口1.8 default默认实现
    16. * 5.反射
    17. * 6.子类触发父类
    18. * 7.程序的入口main
    19. */
    20. //DriverManager.registerDriver(new Driver());
    21. //换了个版本就不行了,不灵活
    22. //new Driver();

    2.获取数据库连接

    1. //1.
    2. Connection conn = DriverManager.getConnection(url, username, password);
    1. //2.
    2. Properties info = new Properties();
    3. info.put("user","root");
    4. info.put("password","root");
    5. Connection connection1 = DriverManager.getConnection();
    1. //3.
    2. //参数:jdbc:数据库软件名://ip:port/数据库?key=value&key=value
    3. //例如: jdbc:mysql://localhost:3306/table1?user=root&password=root
    4. Connection connection2 = DriverManager.getConnection();

    核心属性

    1. 数据库软件所在的主机的ip地址:localhost | 127.0.0.1
    2. 数据库软件所在的主机的端口号 :3306
    3. 所连接的具体库
    4. 连接的账号 username
    5. 连接的密码 password
    6. 可选的信息

    url        语法:[mysql,oracle]://ip地址|主机名:port端口号/数据库名

                例如:"jdbc:mysql://127.0.0.1:3306/table1"

    3.定义sql

    1. Statement stmt = conn.createStatement();
    2. //conn是获取的数据库连接

    作用:可以发送sql语句到数据库,并返回结果

    SQL分类:

    • DDL(容器创建,修改,删除)
    • DML(插入,修改,删除)
    • DQL(查询)
    • DCL(权限控制)
    • TPL事务控制语言)
     int   executeUpdate(String sql);

    执行DML、DDL语句
     返回值:DML语句影响的行数;DDL语句执行后,执行成功也可能返回0;

     ResultSet   executeQuery(sql);

    执行DQL语句
     返回值:ResultSet结果集对象;

    4.发送sql语句

    1. //发送sql语句
    2. ResultSet resultSet = stmt.executeQuery(sql);

    5.处理数据

    1. boolean flag = resultSet.next();
    2. //逐行获取数据
    1. resultSet,get类型(String columnLabel | int columnIndex);
    2. //columnLabel :列名 如果有别名,写别名
    3. //columnIndex : 列的下角标获取 从左向右 从1开始

    6.关闭资源

    1. //释放资源
    2. resultSet.close();
    3. stmt.close();
    4. conn.close();

    优化

    preparedstatment(利用预编译)

    作用:防止sql注入攻击

    1. 编写SQL语句结果        不包含动态值的部分的语句,动态之部分使用占位符  ?  替代  注意:  ?  只能替代动态值
    2. 创建preparedStatement,并传入动态值
    3. 动态值  占位符  赋值  ?  单独赋值即可
    4. 发送SQL语句即可,并获取返回结构
    1. String sql = "select * from t_user where account = ? and password = ?;";
    2. PreparedStatement preparedStatement = connection.prepareStatement(sql);
    3. //单独的占位符进行赋值
    4. /**
    5. * 参数1index 占位符的位置 从左向右数 从1开始 账号 ? 1
    6. * 参数2object 占位符的值 可以设置为任何类型的数据,避免了我们拼接和类型更加丰富
    7. */
    8. preparedStatement.setObject(1,account);
    9. preparedStatement.setObject(2,password);

    练习(增删查改)

    1. package com.ln.jdbc;
    2. import com.mysql.cj.util.DnsSrv;
    3. import org.junit.Test;
    4. import java.sql.*;
    5. import java.util.*;
    6. public class StatementUserLogin {
    7. @Test
    8. public void testInsert() throws Exception {
    9. Class.forName("com.mysql.cj.jdbc.Driver");
    10. Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tabe1",
    11. "root",
    12. "@950908964xLN,"
    13. );
    14. String sql = "insert into 用户(uid,username,money) values (?,?,?);";
    15. PreparedStatement preparedStatement = connection.prepareStatement(sql);
    16. preparedStatement.setObject(1,3);
    17. preparedStatement.setObject(2,"小美");
    18. preparedStatement.setObject(3,2000);
    19. int i = preparedStatement.executeUpdate();
    20. if(i>0){
    21. System.out.println("ok");
    22. }
    23. else{
    24. System.out.println("error");
    25. }
    26. preparedStatement.close();
    27. connection.close();
    28. }
    29. @Test
    30. public void testUpdate() throws Exception {
    31. Class.forName("com.mysql.cj.jdbc.Driver");
    32. Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tabe1",
    33. "root",
    34. "@950908964xLN,"
    35. );
    36. String sql = "update 用户 set username=? where uid = ?;";
    37. PreparedStatement preparedStatement = connection.prepareStatement(sql);
    38. preparedStatement.setObject(1,"小强");
    39. preparedStatement.setObject(2,"2");
    40. int i = preparedStatement.executeUpdate();
    41. if(i>0){
    42. System.out.println("修改成功");
    43. }
    44. else{
    45. System.out.println("修改失败");
    46. }
    47. preparedStatement.close();
    48. connection.close();
    49. }
    50. @Test
    51. public void testDelete() throws Exception {
    52. Class.forName("com.mysql.cj.jdbc.Driver");
    53. Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tabe1",
    54. "root",
    55. "@950908964xLN,"
    56. );
    57. String sql = "delete from 用户 where uid=?;";
    58. PreparedStatement preparedStatement = connection.prepareStatement(sql);
    59. preparedStatement.setObject(1,2);
    60. int i = preparedStatement.executeUpdate();
    61. if(i>0){
    62. System.out.println("ok");
    63. }
    64. else{
    65. System.out.println("error");
    66. }
    67. preparedStatement.close();
    68. connection.close();
    69. }
    70. @Test
    71. public void testSelect() throws Exception {
    72. Class.forName("com.mysql.cj.jdbc.Driver");
    73. Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tabe1",
    74. "root",
    75. "@950908964xLN,"
    76. );
    77. String sql = "select uid,username,money from 用户;";
    78. PreparedStatement preparedStatement = connection.prepareStatement(sql);
    79. ResultSet resultSet = preparedStatement.executeQuery();
    80. List<Map>list = new ArrayList<>();
    81. //装的是当前结果集列的信息对象(可以获得列的名称和数量)
    82. ResultSetMetaData metaData = resultSet.getMetaData();
    83. //有了这个之后可以水平遍历列
    84. int columnCount = metaData.getColumnCount();
    85. while(resultSet.next()){
    86. Map map = new HashMap();
    87. /**
    88. map.put("id",resultSet.getInt("uid"));
    89. map.put("username",resultSet.getString("username"));
    90. map.put("money",resultSet.getInt("money"));
    91. list.add(map);
    92. */
    93. //注意要从1开始,并且小于等于columnCount
    94. for (int i = 1; i <= columnCount; i++) {
    95. //获取指定列下角标的值
    96. Object value = resultSet.getObject(i);
    97. //获取指定列下角标的列的名称
    98. String columnLabel = metaData.getColumnLabel(i);
    99. map.put(columnLabel,value);
    100. }
    101. list.add(map);
    102. }
    103. System.out.println("list = " + list);
    104. resultSet.close();
    105. preparedStatement.close();
    106. connection.close();
    107. }
    108. }

    连接池

    首先安装jar包

    1. 创建一个druid连接池对象
    2. 设置连接池参数
    3. 获取连接【通用方法,所有连接池都一样】
    4. 回收连接【通用方法,所有连接池都一样】
    1. //连接池对象
    2. DruidDataSource dataSource = new DruidDataSource();
    3. //设置参数
    4. //必须 连接数据库驱动类的全限定符【注册驱动】 | url | user | password
    5. dataSource.seUrl("jdbc:mysql://localhost:3306/tabe1");
    6. dataSource.setUsername("账号");
    7. dataSource.setPassword("密码");
    8. dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    9. //非必须 初始化连接数量,最大的连接数量
    10. dataSource.setInitialSize();//初始化连接数量
    11. dataSource.setMaxActive();//最大的数量
    12. //获取连接
    13. Connection connection = dataSource.getConnection();
    14. //回收连接
    15. connection.close();

  • 相关阅读:
    ict在线测试设备功能如何作用与芯片静态功耗测试,提升性能和稳定性
    VisualC++游戏制作MFC版本
    Jmetersphere性能压测执行过程
    打开知识大门,电大搜题助您迈向成功
    数据结构排序算法之直接插入排序与希尔排序【图文详解】
    [附源码]计算机毕业设计springboot高校车辆管理系统
    矩阵相关操作与运算
    h5中的页面显示隐藏执行事件
    Intel汇编-系统调用返回值
    kafka使用场景与设计原理
  • 原文地址:https://blog.csdn.net/qq_74455082/article/details/133319487