防爆玻璃门网站建设江苏提升关键词排名收费
web/
2025/10/5 23:16:52/
文章来源:
防爆玻璃门网站建设,江苏提升关键词排名收费,北京房地产网站建设,项目ppt制作模板JDBC快速入门 PS#xff1a;上传图片有点问题#xff0c;我整理成了PDF格式#xff0c;方便看图文。 今日目标 掌握JDBC的的CRUD理解JDBC中各个对象的作用掌握Druid的使用 1#xff0c;JDBC概述
在开发中我们使用的是java语言#xff0c;那么势必要通过java语言操作数据库…JDBC快速入门 PS上传图片有点问题我整理成了PDF格式方便看图文。 今日目标 掌握JDBC的的CRUD理解JDBC中各个对象的作用掌握Druid的使用 1JDBC概述
在开发中我们使用的是java语言那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。
1.1 JDBC概念 JDBC 就是使用Java语言操作关系型数据库的一套API 全称( Java DataBase Connectivity ) Java 数据库连接 我们开发的同一套Java代码是无法操作不同的关系型数据库因为每一个关系型数据库的底层实现细节都不一样。如果这样问题就很大了在公司中可以在开发阶段使用的是MySQL数据库而上线时公司最终选用oracle数据库我们就需要对代码进行大批量修改这显然并不是我们想看到的。我们要做到的是同一套Java代码操作不同的关系型数据库而此时sun公司就指定了一套标准接口JDBCJDBC中定义了所有操作关系型数据库的规则。众所周知接口是无法直接使用的我们需要使用接口的实现类而这套实现类称之为驱动就由各自的数据库厂商给出。
1.2 JDBC本质
官方sun公司定义的一套操作所有关系型数据库的规则即接口各个数据库厂商去实现这套接口提供数据库驱动jar包我们可以使用这套接口JDBC编程真正执行的代码是驱动jar包中的实现类
1.3 JDBC好处
各数据库厂商使用相同的接口Java代码不需要针对不同数据库分别开发可随时替换底层数据库访问数据库的Java代码基本不变
以后编写操作数据库的代码只需要面向JDBC接口操作哪儿个关系型数据库就需要导入该数据库的驱动包如需要操作MySQL数据库就需要再项目中导入MySQL数据库的驱动包。如下图就是MySQL驱动包
2JDBC快速入门
先来看看通过Java操作数据库的流程
第一步编写Java代码
第二步Java代码将SQL发送到MySQL服务端
第三步MySQL服务端接收到SQL语句并执行该SQL语句
第四步将SQL语句执行的结果返回给Java代码
2.1 编写代码步骤 创建工程导入驱动jar包 注册驱动 Class.forName(com.mysql.jdbc.Driver);获取连接 Connection conn DriverManager.getConnection(url, username, password);Java代码需要发送SQL给MySQL服务端就需要先建立连接 定义SQL语句 String sql “update…” ;获取执行SQL对象 执行SQL语句需要SQL执行对象而这个执行对象就是Statement对象 Statement stmt conn.createStatement();执行SQL stmt.executeUpdate(sql); 处理返回结果 释放资源
2.2 具体操作 创建新的空的项目 定义项目的名称并指定位置 对项目进行设置JDK版本、编译版本 创建模块指定模块的名称及位置 导入驱动包 将mysql的驱动包放在模块下的lib目录随意命名下并将该jar包添加为库文件 在添加为库文件的时候有如下三个选项 Global Library 全局有效Project Library : 项目有效Module Library 模块有效 在src下创建类 编写代码如下
/*** JDBC快速入门*/
public class JDBCDemo {public static void main(String[] args) throws Exception {//1. 注册驱动//Class.forName(com.mysql.jdbc.Driver);//2. 获取连接String url jdbc:mysql://127.0.0.1:3306/db1;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);//3. 定义sqlString sql update account set money 2000 where id 1;//4. 获取执行sql的对象 StatementStatement stmt conn.createStatement();//5. 执行sqlint count stmt.executeUpdate(sql);//受影响的行数//6. 处理结果System.out.println(count);//7. 释放资源stmt.close();conn.close();}
}3JDBC API详解
3.1 DriverManager
DriverManager驱动管理类作用 注册驱动 registerDriver方法是用于注册驱动的但是我们之前做的入门案例并不是这样写的。而是如下实现 Class.forName(com.mysql.jdbc.Driver);我们查询MySQL提供的Driver类看它是如何实现的源码如下 在该类中的静态代码块中已经执行了 DriverManager 对象的 registerDriver() 方法进行驱动的注册了那么我们只需要加载 Driver 类该静态代码块就会执行。而 Class.forName(com.mysql.jdbc.Driver); 就可以加载 Driver 类。 提示 MySQL 5之后的驱动包可以省略注册驱动的步骤自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类 获取数据库连接 参数说明 url 连接路径 语法jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1参数键值对2… 示例jdbc:mysql://127.0.0.1:3306/db1 细节 如果连接的是本机mysql服务器并且mysql服务默认端口是3306则url可以简写为jdbc:mysql:///数据库名称?参数键值对 配置 useSSLfalse 参数禁用安全连接方式解决警告提示 user 用户名 poassword 密码
3.2 Connection
Connection数据库连接对象作用
获取执行 SQL 的对象管理事务
3.2.1 获取执行对象 普通执行SQL对象 Statement createStatement()入门案例中就是通过该方法获取的执行对象。 预编译SQL的执行SQL对象防止SQL注入 PreparedStatement prepareStatement(sql)通过这种方式获取的 PreparedStatement SQL语句执行对象是我们一会重点要进行讲解的它可以防止SQL注入。 执行存储过程的对象 CallableStatement prepareCall(sql)通过这种方式获取的 CallableStatement 执行对象是用来执行存储过程的而存储过程在MySQL中不常用所以这个我们将不进行讲解。
3.2.2 事务管理
先回顾一下MySQL事务管理的操作
开启事务 BEGIN; 或者 START TRANSACTION;提交事务 COMMIT;回滚事务 ROLLBACK; MySQL默认是自动提交事务 接下来学习JDBC事务管理的方法。
Connection几口中定义了3个对应的方法 开启事务 参与autoCommit 表示是否自动提交事务true表示自动提交事务false表示手动提交事务。而开启事务需要将该参数设为为false。 提交事务 回滚事务
具体代码实现如下
/*** JDBC API 详解Connection*/
public class JDBCDemo3_Connection {public static void main(String[] args) throws Exception {//1. 注册驱动//Class.forName(com.mysql.jdbc.Driver);//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);//3. 定义sqlString sql1 update account set money 3000 where id 1;String sql2 update account set money 3000 where id 2;//4. 获取执行sql的对象 StatementStatement stmt conn.createStatement();try {// 开启事务conn.setAutoCommit(false);//5. 执行sqlint count1 stmt.executeUpdate(sql1);//受影响的行数//6. 处理结果System.out.println(count1);int i 3/0;//5. 执行sqlint count2 stmt.executeUpdate(sql2);//受影响的行数//6. 处理结果System.out.println(count2);// 提交事务//程序运行到此处说明没有出现任何问题则需求提交事务conn.commit();} catch (Exception e) {// 回滚事务//程序在出现异常时会执行到这个地方此时就需要回滚事务conn.rollback();e.printStackTrace();}//7. 释放资源stmt.close();conn.close();}
}3.3 Statement
3.3.1 概述
Statement对象的作用就是用来执行SQL语句。而针对不同类型的SQL语句使用的方法也不一样。 执行DDL、DML语句 执行DQL语句 该方法涉及到了 ResultSet 对象而这个对象我们还没有学习一会再重点讲解。
3.3.2 代码实现 执行DML语句 /*** 执行DML语句* throws Exception*/
Test
public void testDML() throws Exception {//1. 注册驱动//Class.forName(com.mysql.jdbc.Driver);//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);//3. 定义sqlString sql update account set money 3000 where id 1;//4. 获取执行sql的对象 StatementStatement stmt conn.createStatement();//5. 执行sqlint count stmt.executeUpdate(sql);//执行完DML语句受影响的行数//6. 处理结果//System.out.println(count);if(count 0){System.out.println(修改成功~);}else{System.out.println(修改失败~);}//7. 释放资源stmt.close();conn.close();
}执行DDL语句 /*** 执行DDL语句* throws Exception*/
Test
public void testDDL() throws Exception {//1. 注册驱动//Class.forName(com.mysql.jdbc.Driver);//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);//3. 定义sqlString sql drop database db2;//4. 获取执行sql的对象 StatementStatement stmt conn.createStatement();//5. 执行sqlint count stmt.executeUpdate(sql);//执行完DDL语句可能是0//6. 处理结果System.out.println(count);//7. 释放资源stmt.close();conn.close();
}注意 以后开发很少使用java代码操作DDL语句
3.4 ResultSet
3.4.1 概述
ResultSet结果集对象作用
封装了SQL查询语句的结果。
而执行了DQL语句后就会返回该对象对应执行DQL语句的方法如下
ResultSet executeQuery(sql)执行DQL 语句返回 ResultSet 对象那么我们就需要从 ResultSet 对象中获取我们想要的数据。ResultSet 对象提供了操作查询结果数据的方法如下 boolean next() 将光标从当前位置向前移动一行判断当前行是否为有效行 方法返回值说明 true 有效航当前行有数据false 无效行当前行没有数据 xxx getXxx(参数)获取数据 xxx : 数据类型如 int getInt(参数) String getString(参数)参数 int类型的参数列的编号从1开始String类型的参数 列的名称 如下图为执行SQL语句后的结果
一开始光标指定于第一行前如图所示红色箭头指向于表头行。当我们调用了 next() 方法后光标就下移到第一行数据并且方法返回true此时就可以通过 getInt(id) 获取当前行id字段的值也可以通过 getString(name) 获取当前行name字段的值。如果想获取下一行的数据继续调用 next() 方法以此类推。
3.4.2 代码实现
/*** 执行DQL* throws Exception*/
Test
public void testResultSet() throws Exception {//1. 注册驱动//Class.forName(com.mysql.jdbc.Driver);//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);//3. 定义sqlString sql select * from account;//4. 获取statement对象Statement stmt conn.createStatement();//5. 执行sqlResultSet rs stmt.executeQuery(sql);//6. 处理结果 遍历rs中的所有数据/* // 6.1 光标向下移动一行并且判断当前行是否有数据while (rs.next()){//6.2 获取数据 getXxx()int id rs.getInt(1);String name rs.getString(2);double money rs.getDouble(3);System.out.println(id);System.out.println(name);System.out.println(money);System.out.println(--------------);}*/// 6.1 光标向下移动一行并且判断当前行是否有数据while (rs.next()){//6.2 获取数据 getXxx()int id rs.getInt(id);String name rs.getString(name);double money rs.getDouble(money);System.out.println(id);System.out.println(name);System.out.println(money);System.out.println(--------------);}//7. 释放资源rs.close();stmt.close();conn.close();
}3.5 案例 需求查询account账户表数据封装为Account对象中并且存储到ArrayList集合中 代码实现 /*** 查询account账户表数据封装为Account对象中并且存储到ArrayList集合中* 1. 定义实体类Account* 2. 查询数据封装到Account对象中* 3. 将Account对象存入ArrayList集合中*/
Test
public void testResultSet2() throws Exception {//1. 注册驱动//Class.forName(com.mysql.jdbc.Driver);//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);//3. 定义sqlString sql select * from account;//4. 获取statement对象Statement stmt conn.createStatement();//5. 执行sqlResultSet rs stmt.executeQuery(sql);// 创建集合ListAccount list new ArrayList();// 6.1 光标向下移动一行并且判断当前行是否有数据while (rs.next()){Account account new Account();//6.2 获取数据 getXxx()int id rs.getInt(id);String name rs.getString(name);double money rs.getDouble(money);//赋值account.setId(id);account.setName(name);account.setMoney(money);// 存入集合list.add(account);}System.out.println(list);//7. 释放资源rs.close();stmt.close();conn.close();
}3.6 PreparedStatement PreparedStatement作用 预编译SQL语句并执行预防SQL注入问题 对上面的作用中SQL注入问题大家肯定不理解。那我们先对SQL注入进行说明.
3.6.1 SQL注入 SQL注入是通过操作输入来修改事先定义好的SQL语句用以达到执行代码对服务器进行攻击的方法。 在今天资料下的 day03-JDBC\资料\2. sql注入演示 中修改 application.properties 文件中的用户名和密码文件内容如下
spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver
spring.datasource.urljdbc:mysql://localhost:3306/test?useSSLfalseuseUnicodetruecharacterEncodingUTF-8
spring.datasource.usernameroot
spring.datasource.password1234在MySQL中创建名为 test 的数据库
create database test;在命令提示符中运行今天资料下的 day03-JDBC\资料\2. sql注入演示\sql.jar 这个jar包。
此时我们就能在数据库中看到user表
接下来在浏览器的地址栏输入 localhost:8080/login.html 就能看到如下页面
我们就可以在如上图中输入用户名和密码进行登陆。用户名和密码输入正确就登陆成功跳转到首页。用户名和密码输入错误则给出错误提示如下图
但是我可以通过输入一些特殊的字符登陆到首页。
用户名随意写密码写成 or 1 1
这就是SQL注入漏洞也是很危险的。当然现在市面上的系统都不会存在这种问题了所以大家也不要尝试用这种方式去试其他的系统。
那么该如何解决呢这里就可以将SQL执行对象 Statement 换成 PreparedStatement 对象。
3.6.2 代码模拟SQL注入问题
Test
public void testLogin() throws Exception {//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);// 接收用户输入 用户名和密码String name sjdljfld;String pwd or 1 1;String sql select * from tb_user where username name and password pwd;// 获取stmt对象Statement stmt conn.createStatement();// 执行sqlResultSet rs stmt.executeQuery(sql);// 判断登录是否成功if(rs.next()){System.out.println(登录成功~);}else{System.out.println(登录失败~);}//7. 释放资源rs.close();stmt.close();conn.close();
}上面代码是将用户名和密码拼接到sql语句中拼接后的sql语句如下
select * from tb_user where username sjdljfld and password or 1 1从上面语句可以看出条件 username sjdljfld and password 不管是否满足而 or 后面的 1 1 是始终满足的最终条件是成立的就可以正常的进行登陆了。
接下来我们来学习PreparedStatement对象.
3.6.3 PreparedStatement概述 PreparedStatement作用 预编译SQL语句并执行预防SQL注入问题 获取 PreparedStatement 对象 // SQL语句中的参数值使用占位符替代
String sql select * from user where username ? and password ?;
// 通过Connection对象获取并传入对应的sql语句
PreparedStatement pstmt conn.prepareStatement(sql);设置参数值 上面的sql语句中参数使用 ? 进行占位在之前之前肯定要设置这些 ? 的值。 PreparedStatement对象setXxx(参数1参数2)给 ? 赋值 Xxx数据类型 如 setInt (参数1参数2) 参数 参数1 的位置编号从1 开始 参数2 的值 执行SQL语句 executeUpdate(); 执行DDL语句和DML语句 executeQuery(); 执行DQL语句 注意 调用这两个方法时不需要传递SQL语句因为获取SQL语句执行对象时已经对SQL语句进行预编译了。
3.6.4 使用PreparedStatement改进 Test
public void testPreparedStatement() throws Exception {//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url jdbc:mysql:///db1?useSSLfalse;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);// 接收用户输入 用户名和密码String name zhangsan;String pwd or 1 1;// 定义sqlString sql select * from tb_user where username ? and password ?;// 获取pstmt对象PreparedStatement pstmt conn.prepareStatement(sql);// 设置的值pstmt.setString(1,name);pstmt.setString(2,pwd);// 执行sqlResultSet rs pstmt.executeQuery();// 判断登录是否成功if(rs.next()){System.out.println(登录成功~);}else{System.out.println(登录失败~);}//7. 释放资源rs.close();pstmt.close();conn.close();
}执行上面语句就可以发现不会出现SQL注入漏洞问题了。那么PreparedStatement又是如何解决的呢它是将特殊字符进行了转义转义的SQL如下
select * from tb_user where username sjdljfld and password \or \1\ \13.6.5 PreparedStatement原理 PreparedStatement 好处 预编译SQL性能更高防止SQL注入将敏感字符进行转义 Java代码操作数据库流程如图所示 将sql语句发送到MySQL服务器端 MySQL服务端会对sql语句进行如下操作 检查SQL语句 检查SQL语句的语法是否正确。 编译SQL语句。将SQL语句编译成可执行的函数。 检查SQL和编译SQL花费的时间比执行SQL的时间还要长。如果我们只是重新设置参数那么检查SQL语句和编译SQL语句将不需要重复执行。这样就提高了性能。 执行SQL语句
接下来我们通过查询日志来看一下原理。 开启预编译功能 在代码中编写url时需要加上以下参数。而我们之前根本就没有开启预编译功能只是解决了SQL注入漏洞。 useServerPrepStmtstrue配置MySQL执行日志重启mysql服务后生效 在mysql配置文件my.ini中添加如下配置 log-outputFILE
general-log1
general_log_fileD:\mysql.log
slow-query-log1
slow_query_log_fileD:\mysql_slow.log
long_query_time2java测试代码如下 /*** PreparedStatement原理* throws Exception*/
Test
public void testPreparedStatement2() throws Exception {//2. 获取连接如果连接的是本机mysql并且端口是默认的 3306 可以简化书写// useServerPrepStmtstrue 参数开启预编译功能String url jdbc:mysql:///db1?useSSLfalseuseServerPrepStmtstrue;String username root;String password 1234;Connection conn DriverManager.getConnection(url, username, password);// 接收用户输入 用户名和密码String name zhangsan;String pwd or 1 1;// 定义sqlString sql select * from tb_user where username ? and password ?;// 获取pstmt对象PreparedStatement pstmt conn.prepareStatement(sql);Thread.sleep(10000);// 设置的值pstmt.setString(1,name);pstmt.setString(2,pwd);ResultSet rs null;// 执行sqlrs pstmt.executeQuery();// 设置的值pstmt.setString(1,aaa);pstmt.setString(2,bbb);// 执行sqlrs pstmt.executeQuery();// 判断登录是否成功if(rs.next()){System.out.println(登录成功~);}else{System.out.println(登录失败~);}//7. 释放资源rs.close();pstmt.close();conn.close();
}执行SQL语句查看 D:\mysql.log 日志如下: 上图中第三行中的 Prepare 是对SQL语句进行预编译。第四行和第五行是执行了两次SQL语句而第二次执行前并没有对SQL进行预编译。 小结 在获取PreparedStatement对象时将sql语句发送给mysql服务器进行检查编译这些步骤很耗时执行时就不用再进行这些步骤了速度更快如果sql模板一样则只需要进行一次检查、编译 4数据库连接池
4.1 数据库连接池简介 数据库连接池是个容器负责分配、管理数据库连接(Connection) 它允许应用程序重复使用一个现有的数据库连接而不是再重新建立一个 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏 好处 资源重用提升系统响应速度避免数据库连接遗漏 之前我们代码中使用连接是没有使用都创建一个Connection对象使用完毕就会将其销毁。这样重复创建销毁的过程是特别耗费计算机的性能的及消耗时间的。
而数据库使用了数据库连接池后就能达到Connection对象的复用如下图
连接池是在一开始就创建好了一些连接Connection对象存储起来。用户需要连接数据库时不需要自己创建连接而只需要从连接池中获取一个连接进行使用使用完毕后再将连接对象归还给连接池这样就可以起到资源重用也节省了频繁创建连接销毁连接所花费的时间从而提升了系统响应的速度。
4.2 数据库连接池实现 标准接口DataSource 官方(SUN) 提供的数据库连接池标准接口由第三方组织实现此接口。该接口提供了获取连接的功能 Connection getConnection()那么以后就不需要通过 DriverManager 对象获取 Connection 对象而是通过连接池DataSource获取 Connection 对象。 常见的数据库连接池 DBCPC3P0Druid 我们现在使用更多的是Druid它的性能比其他两个会好一些。 Druid德鲁伊 Druid连接池是阿里巴巴开源的数据库连接池项目 功能强大性能优秀是Java语言最好的数据库连接池之一
4.3 Driud使用 导入jar包 druid-1.1.12.jar定义配置文件加载配置文件获取数据库连接池对象获取连接 现在通过代码实现首先需要先将druid的jar包放到项目下的lib下并添加为库文件
项目结构如下
编写配置文件如下
driverClassNamecom.mysql.jdbc.Driver
urljdbc:mysql:///db1?useSSLfalseuseServerPrepStmtstrue
usernameroot
password1234
# 初始化连接数量
initialSize5
# 最大连接数
maxActive10
# 最大等待时间
maxWait3000使用druid的代码如下
/*** Druid数据库连接池演示*/
public class DruidDemo {public static void main(String[] args) throws Exception {//1.导入jar包//2.定义配置文件//3. 加载配置文件Properties prop new Properties();prop.load(new FileInputStream(jdbc-demo/src/druid.properties));//4. 获取连接池对象DataSource dataSource DruidDataSourceFactory.createDataSource(prop);//5. 获取数据库连接 ConnectionConnection connection dataSource.getConnection();System.out.println(connection); //获取到了连接后就可以继续做其他操作了//System.out.println(System.getProperty(user.dir));}
}5JDBC练习
5.1 需求
完成商品品牌数据的增删改查操作
查询查询所有数据添加添加品牌修改根据id修改删除根据id删除
5.2 案例实现
5.2.1 环境准备 数据库表 tb_brand -- 删除tb_brand表
drop table if exists tb_brand;
-- 创建tb_brand表
create table tb_brand (-- id 主键id int primary key auto_increment,-- 品牌名称brand_name varchar(20),-- 企业名称company_name varchar(20),-- 排序字段ordered int,-- 描述信息description varchar(100),-- 状态0禁用 1启用status int
);
-- 添加数据
insert into tb_brand (brand_name, company_name, ordered, description, status)
values (三只松鼠, 三只松鼠股份有限公司, 5, 好吃不上火, 0),(华为, 华为技术有限公司, 100, 华为致力于把数字世界带入每个人、每个家庭、每个组织构建万物互联的智能世界, 1),(小米, 小米科技有限公司, 50, are you ok, 1);在pojo包下实体类 Brand /*** 品牌* alt 鼠标左键整列编辑* 在实体类中基本数据类型建议使用其对应的包装类型*/
public class Brand {// id 主键private Integer id;// 品牌名称private String brandName;// 企业名称private String companyName;// 排序字段private Integer ordered;// 描述信息private String description;// 状态0禁用 1启用private Integer status;public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String getBrandName() {return brandName;}public void setBrandName(String brandName) {this.brandName brandName;}public String getCompanyName() {return companyName;}public void setCompanyName(String companyName) {this.companyName companyName;}public Integer getOrdered() {return ordered;}public void setOrdered(Integer ordered) {this.ordered ordered;}public String getDescription() {return description;}public void setDescription(String description) {this.description description;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status status;}Overridepublic String toString() {return Brand{ id id , brandName brandName \ , companyName companyName \ , ordered ordered , description description \ , status status };}
}5.2.2 查询所有 /*** 查询所有* 1. SQLselect * from tb_brand;* 2. 参数不需要* 3. 结果ListBrand*/Test
public void testSelectAll() throws Exception {//1. 获取Connection//3. 加载配置文件Properties prop new Properties();prop.load(new FileInputStream(jdbc-demo/src/druid.properties));//4. 获取连接池对象DataSource dataSource DruidDataSourceFactory.createDataSource(prop);//5. 获取数据库连接 ConnectionConnection conn dataSource.getConnection();//2. 定义SQLString sql select * from tb_brand;;//3. 获取pstmt对象PreparedStatement pstmt conn.prepareStatement(sql);//4. 设置参数//5. 执行SQLResultSet rs pstmt.executeQuery();//6. 处理结果 ListBrand 封装Brand对象装载List集合Brand brand null;ListBrand brands new ArrayList();while (rs.next()){//获取数据int id rs.getInt(id);String brandName rs.getString(brand_name);String companyName rs.getString(company_name);int ordered rs.getInt(ordered);String description rs.getString(description);int status rs.getInt(status);//封装Brand对象brand new Brand();brand.setId(id);brand.setBrandName(brandName);brand.setCompanyName(companyName);brand.setOrdered(ordered);brand.setDescription(description);brand.setStatus(status);//装载集合brands.add(brand);}System.out.println(brands);//7. 释放资源rs.close();pstmt.close();conn.close();
}5.2.3 添加数据
/*** 添加* 1. SQLinsert into tb_brand(brand_name, company_name, ordered, description, status) values(?,?,?,?,?);* 2. 参数需要除了id之外的所有参数信息* 3. 结果boolean*/
Test
public void testAdd() throws Exception {// 接收页面提交的参数String brandName 香飘飘;String companyName 香飘飘;int ordered 1;String description 绕地球一圈;int status 1;//1. 获取Connection//3. 加载配置文件Properties prop new Properties();prop.load(new FileInputStream(jdbc-demo/src/druid.properties));//4. 获取连接池对象DataSource dataSource DruidDataSourceFactory.createDataSource(prop);//5. 获取数据库连接 ConnectionConnection conn dataSource.getConnection();//2. 定义SQLString sql insert into tb_brand(brand_name, company_name, ordered, description, status) values(?,?,?,?,?);;//3. 获取pstmt对象PreparedStatement pstmt conn.prepareStatement(sql);//4. 设置参数pstmt.setString(1,brandName);pstmt.setString(2,companyName);pstmt.setInt(3,ordered);pstmt.setString(4,description);pstmt.setInt(5,status);//5. 执行SQLint count pstmt.executeUpdate(); // 影响的行数//6. 处理结果System.out.println(count 0);//7. 释放资源pstmt.close();conn.close();
}5.2.4 修改数据
/*** 修改* 1. SQLupdate tb_brandset brand_name ?,company_name ?,ordered ?,description ?,status ?where id ?* 2. 参数需要所有数据* 3. 结果boolean*/Test
public void testUpdate() throws Exception {// 接收页面提交的参数String brandName 香飘飘;String companyName 香飘飘;int ordered 1000;String description 绕地球三圈;int status 1;int id 4;//1. 获取Connection//3. 加载配置文件Properties prop new Properties();prop.load(new FileInputStream(jdbc-demo/src/druid.properties));//4. 获取连接池对象DataSource dataSource DruidDataSourceFactory.createDataSource(prop);//5. 获取数据库连接 ConnectionConnection conn dataSource.getConnection();//2. 定义SQLString sql update tb_brand\n set brand_name ?,\n company_name ?,\n ordered ?,\n description ?,\n status ?\n where id ?;//3. 获取pstmt对象PreparedStatement pstmt conn.prepareStatement(sql);//4. 设置参数pstmt.setString(1,brandName);pstmt.setString(2,companyName);pstmt.setInt(3,ordered);pstmt.setString(4,description);pstmt.setInt(5,status);pstmt.setInt(6,id);//5. 执行SQLint count pstmt.executeUpdate(); // 影响的行数//6. 处理结果System.out.println(count 0);//7. 释放资源pstmt.close();conn.close();
}5.2.5 删除数据
/*** 删除* 1. SQLdelete from tb_brand where id ?* 2. 参数需要id* 3. 结果boolean*/
Test
public void testDeleteById() throws Exception {// 接收页面提交的参数int id 4;//1. 获取Connection//3. 加载配置文件Properties prop new Properties();prop.load(new FileInputStream(jdbc-demo/src/druid.properties));//4. 获取连接池对象DataSource dataSource DruidDataSourceFactory.createDataSource(prop);//5. 获取数据库连接 ConnectionConnection conn dataSource.getConnection();//2. 定义SQLString sql delete from tb_brand where id ?;//3. 获取pstmt对象PreparedStatement pstmt conn.prepareStatement(sql);//4. 设置参数pstmt.setInt(1,id);//5. 执行SQLint count pstmt.executeUpdate(); // 影响的行数//6. 处理结果System.out.println(count 0);//7. 释放资源pstmt.close();conn.close();
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/87611.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!