JDBC快速入门

张开发
2026/4/20 14:25:56 15 分钟阅读

分享文章

JDBC快速入门
JDBC入门到精通Java是Java提供的用来操作数据库的接口API不同的数据库需要有着不同的实现JDBC API是一系列的接口相关类和接口在java.sql和javax.sql包中JDBC快速入门注册驱动得到Connection发送SQL给MySQL执行释放资源//得到驱动得到连接 Driver driver new Driver(); String url jdbc:mysql://127.0.0.1:3306/student; Connection connect driver.connect(url, properties); //connect createStatement()//Statement用于执行静态SQL语句 //statement executeUpdate(String sql)//return number of affected rows executeQuery(String sql)//return ResultSet类,注意要释放这个资源 //释放资源 statement.close(); connect.close();获取数据库连接的5种方式获取Driver实现类对象通过其connect方法得到数据库连接属于静态加载灵活性差依赖强通过反射机制得到数据库连接属于动态加载更加的灵活减少了依赖性可以把信息写在配置文件上使用DriverManager 替代 Driver 进行统一管理得到数据库连接使用class.forName自动完成注册驱动简化代码在第四种方法中使用properties文件让连接mysql更加灵活通过反射机制得到数据库连接Class? aClass Class.forName(com.mysql.jdbc.Driver); Driver driver (Driver) aClass.newInstance(); Connection connect driver.connect(url, properties);使用DriverManager 替代 Driver 进行统一管理得到数据库连接Class? aClass Class.forName(com.mysql.jdbc.Driver); Driver driver (Driver) aClass.newInstance(); DriverManager.registerDriver(driver); Connection connection DriverManager.getConnection(url, user, password);使用class.forName自动完成注册驱动简化代码推荐使用√jdk1.5以后使用了jdbc4在程序启动时会自动调用jar包下META-INF\services\java.sql.Driver文本中的类名称去注册不再需要显示调用class.forName()注册驱动//也可以使用properties文件让连接MySQL更加灵活 Class.forName(com.mysql.jdbc.Driver); DriverManager.getConnection(url, user, password);//ResultSet结果集 next()//光标移到下一行如果不存在下一行会返回false //ResultSet结果集 RowDataStatic rowData ArrayList rows//存放着所有的行(ByteArrayRow) //ByteArrayRow Byte[4] internalRowData//存放着行里的每列在连接建立后需要对数据库进行访问执行命令或是SQL语句可以通过三种方式Statement存在SQL注入不能使用PreparedStatement继承了Statement接口CallableStatementscanner.next();有单引号或空格就结束了而nextLine()认为回车才算是结束PreparedStatementPreparedStatement预处理的好处有三点在SQL语句中使用作为占位符而不是使用拼接SQL语句减少了语法错误有效的解决了SQL注入的问题大大减少了编译次数执行效率较高String sql select * from admin where name? and pwd?; connection.prepareStatement(sql); preparedStatement.setString(1, hsp); preparedStatement.setString(2, 000000); preparedStatement.executeQuery(); preparedStatement.executeUpdate();JDBC API//DriverManger驱动管理 getConnection(url,user,pwd) //Connection createStatement()//存在sql注入问题 prepareStatement(sql) setAutoCommit(true)//设置此连接的自动提交模式的状态默认为true commit()//使自上次提交/回滚以来所作的所有更改都将永久性并释放此Connection对象当前持有的任何数据库锁 rollback()//默认回滚到事务开始的状态并释放此Connection对象当前持有的任何数据库锁 //StatementexecuteUpdate(sql)执行dml语句返回受影响的行数executeQuery(sql)执行查询语句返回一个ResultSet接口的实现类对象execute(sql)可以执行任意的sql语句返回booleanPreparedStatement继承了Statement接口executeUpdate()executeQuery()execute()setXxx(第几个占位符, 占位符的值)设置类型为Xxx这个方法解决了SQL注入问题ResultSet结果集next()光标向下移动一行返回booleanprevious()光标向上移动一行返回booleangetXxx(列的索引 | 列名)返回对应列的值接收类型为Xxx事务批处理Java的批量更新机制允许多条语句一次性提交给数据库批量处理通常情况下比单独提交处理有着更高的效率注意JDBC连接MySQL时在url中加上?rewriteBatchedStatementstrue后才可以使用批处理功能批处理往往和PreparedStatement搭配使用既可以减少发送SQL语句的网络开销和运行次数又可以减少编译次数效率大大提高addBatch()添加需要批处理的SQL语句或参数executeBatch()执行批量处理语句clearBatch()清空批处理包的语句数据库连接池为什么会出现连接池呢传统的JDBC数据库连接是使用DriverManager来获取每次向数据库建立连接都需要将Connection加载到内存中再验证IP地址、用户名和密码。需要数据库连接的时候就向数据库要求一个频繁的进行数据库连接操作将占用很多的系统资源容易造成服务器崩溃每一次数据库连接使用完后都要断开如果程序出现异常而未能关闭将导致数据库内存泄漏最终将导致重启数据库传统获取连接的方式不能控制创建的连接数量如果高并发连接数量过多了也可能导致内存泄漏MySQL崩溃数据库连接池的基本介绍连接池预先在缓冲池中放入了一定数量的连接当需要建立数据库连接时只需要从“缓冲池”中取出一个用完之后再放进去即可数据库连接池负责分配、管理和释放数据库连接它允许应用程序重复使用一个现有的数据库连接而不是重新建立一个当应用程序向连接池请求的连接数超过最大连接数量时这些请求将被加入到等待队列中JDBC的数据库连接池使用javax.sql.DataSource来表示这是一个接口通常由第三方提供实现的jar包数据库连接池的种类C3P0数据库连接池老牌的速度相对较慢稳定性不错hibernate和spring都在用DBCP数据库连接池速度相对c3p0较快但不稳定Proxool数据库连接池有监控连接池状态的功能稳定性较c3p0差一点BoneCP数据库连接池速度快Druid德鲁伊是阿里提供的数据库连接池集C3P0、DBCP、Proxool优点于一身的数据库连接池推荐使用√速度超级快√C3P0连接池使用方式一它相关的参数在程序中指定如用户名密码CombopolledDataSource comboPooledDataSource new ComboPooledDataSource(); comboPooledDataSource.setDriverClass(driver); comboPooledDataSource.setJdbcUrl(url); comboPooledDataSource.setUser(user); comboPooledDataSource.setPassword(password); comboPooledDataSource.setInitialPoolSize(10); comboPooledDataSource.setMaxPollSize(50); Connection connection comboPooledDataSource.getConnection(); connection.close();C3P0连接池使用方式二使用c3p0提供的配置文件模板c3p0-config.xmlCombopolledDataSource comboPooledDataSource new ComboPooledDataSource(hsp); Connection connection comboPooledDataSource.getConnection(); connection.close();Druid连接池加入jar包和配置文件配置文件名可随意后缀为properties后DataSource dataSource DruidDataSourceFactory.createDataSource(properties); Connection connection dataSource.getConnection(); connection.close();Apache-DBUtils工具commons-dbutils是Apache提供的一个开源JDBC工具类库它是对jdbc的封装能极大简化jdbc编码的工作量QueryRunner类封装了SQL的执行是线程安全的可以实现crud和批处理query(connection, sql, new BeanHandler(Student.class), ...)update(connection, sql, ...)执行增删改查并返回受影响的行数...给赋值ResultSetHandler接口用于处理java.sql.ResultSet将数据按要求转换为另一种形式ArrayHandler类把结果集中的第一行数据转成对象数组ArrayListHandler类把结果集中的每一行数据都转成一个数组再放到List中BeanHandlerBeanListHandlerColumnListHandlerKeyedHandler(name)MapHandlerMapListHandlerScalarHandler用于返回单行中单列的值ListActor list queryRunner.query(connection, sql, new BeanListHandler(Actor.class), 1); Actor actor queryRunner.query(connection, sql, new BeanHandler(Actor.class), 1); Object obj queryRunner.query(connection, sql, new ScalarHandler(), 1); connection.close();query方法会自动关闭结果集和statementActor.class会用到反射Pasted image 20251007235236.pngBasicDao对于dbutilsDruid简化了jdbc开发但还有不足SQL语句是固定的不能通过参数传入通用性不好对于select操作如果有返回值返回类型不能固定需要使用泛型将来的表很多业务是复杂的不可能只靠一个Java类完成BasicDaoDAOdata access object数据访问对象BasicDao是专门和数据库交互的即完成对数据库的crud操作在BasicDao的基础上实现一张表对应一个Dao更好的完成功能比如Student表-Student.java类(javabean)-StudentDao.java

更多文章