两万字速通JDBC

x33g5p2x  于2022-02-18 转载在 其他  
字(19.3k)|赞(0)|评价(0)|浏览(391)

一、JDBC简介

1.1、JDBC概念

1.2、JDBC本质

1.3、JDBC好处

1.4、关系图示:

1.5、 MySQLjar包下载地址

一、DriverManager

1、注册驱动:

二、Connection

2.1、获取执sql对象

2.2、事务管理

  2.2.1、mysql事务管理

2.2.2、演示jdbc的事务

三、Statement

3.1、执行sql语句

四、ResultSet

ResultSet案例

五、PreparedStatement

5.1、PreparedStatement作用:

5.2、SQL注入

演示普通登录:

5.2.1、 sql注入演示:

5.3、PreparedStatement解决SQL注入

5.4、PrepareStatement原理

六、数据库连接池简介

6.1、数据库连接池优点

6.2、数据录库连接池实现

6.3、Driud使用步骤

七、完成商品品牌数据的增删改查操作

表的信息

1、查询所有 

运行结果: 

2、增加数据

乱码问题: 

3、修改数据

运行结果: 

4、删除数据

运行结果:​

一、JDBC简介

1.1、JDBC概念

①JDBC就是使用Java语言操作关系型数据录的一套API

②全称是(Java DataBase Connectivity),叫Java数据库连接

1.2、JDBC本质

①官方(sun公司)定义的一套操作所有关系型数据库的规则,即为接口

②各个数据库厂商去实现这套接口,提供数据库驱动jar包。

③我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

1.3、JDBC好处

①各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发不同的代码

②可随时替换底层数据库,访问数据库的Java代码基本不变

1.4、关系图示:

1.5、 MySQLjar包下载地址

MySQL :: MySQL Community Downloadshttps://dev.mysql.com/downloads/一般选择独立于平台的这个选项

①创建新的项目

②之后再建立一个模块

③在新建的的jdbc-demo模块中创建一个lib目录,将mysql的jar包复制粘贴到此处

④将刚才导入的jar包设置作用范围(右键jar包)

⑤在src下创建一个类

⑥ 类中:

  1. package com.jdbc;
  2. import com.mysql.jdbc.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.Statement;
  5. public class JDBCDemo {
  6. public static void main(String[] args) throws Exception {
  7. //1、注册驱动
  8. Class.forName("com.mysql.jdbc.Driver");
  9. //2、获取连接
  10. //url的格式是:"jdbc:mysql://mysql的ip:端口号/操作的数据库"
  11. String url="jdbc:mysql://127.0.0.1:3306/kc_db01";
  12. //username是你的mysql用户名
  13. String username="root";
  14. //password是你的mysql密码
  15. String password="123456";
  16. Connection conn= (Connection) DriverManager.getConnection(url, username, password);
  17. //3、定义sql
  18. String sql="update emp set salary=666 where ename='zhangsan'";
  19. //4、获取执行sql的Statement对象
  20. Statement stat=conn.createStatement();
  21. //5、执行sql语句,count就是影响的行数
  22. int count=stat.executeUpdate(sql);
  23. //6处理结果
  24. System.out.println("影响的行数:"+count);
  25. //7、释放资源(先开后释放)
  26. stat.close();
  27. conn.close();
  28. }
  29. }

数据库之前:

** 运行结果:**

** 运行之后数据库:**

一、DriverManager

DriverManager(驱动管理类)作用:
1、注册驱动

2、获取数据库连接

1、注册驱动:

  1. Class.forName("com.mysql.jdbc.Driver");

注册驱动的书写方法,表面上没有使用  DriverManager类,选中Driver,ctrl+b看源码可知

  1. package com.mysql.jdbc;
  2. import java.sql.DriverManager;
  3. import java.sql.SQLException;
  4. public class Driver extends NonRegisteringDriver implements java.sql.Driver {
  5. public Driver() throws SQLException {
  6. }
  7. static {
  8. try {
  9. DriverManager.registerDriver(new Driver());
  10. } catch (SQLException var1) {
  11. throw new RuntimeException("Can't register driver!");
  12. }
  13. }
  14. }

它使用了 DriverManager.registerDriver()的方法

在MySQL5之后的驱动包,可以省略注册驱动的步骤

自动加载jar包中的META-INF/services/java.sql.Driver文件的驱动类

2、获取连接
static Connection         getConnection(String url,String user,String password)

参数

1、url:连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2....

举例:jdbc:mysql://127.0.0.1:3306/db1(本机127.0.0.1,本机域名:localhost)

 细节: 如果连接的是本机mysql服务器,并且mysql默认端口号是3306  ,则url可以简写为:jdbc:mysql://数据库名称?参数键值对如:jdbc:mysql:///db1

配置userSSL=false参数,禁用安全连接方式,解决警告提示

2、user:用户名

3、password:密码

解决警告提示:

?userSSL=false

  1. String url="jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";

二、Connection

Connection(数据库连接对象)作用:

1、获取执行SQL的对象

2、管理事务

2.1、获取执sql对象

  • 普通执行SQL对象
    Statement   createStatement()

  • 预编译SQL的执行SQL对象:防止SQL注入
    PrepareStatement    prepareStatement(sql)

  • 执行存储过程对象
    CallableStatement   prepareCall(sql)

2.2、事务管理

    2.2.1、mysql事务管理

开启事务:BEGIN;/START  TRANSACTION(start transaction)

提交事务:COMMIT;

回滚事务:ROLLBACK;

(MySQL默认自动提交事务)

JDBC事务管理: 

   Connection接口中定义了3个对应的方法

开启事务:setAutoCommit(boolean autoCommit);true为自动提交事务,false为手动提交事务(开启事务)

提交事务:commit()

回滚事务:rollback()

2.2.2、演示jdbc的事务

复制前面弄过的类到包下

  1. package com.jdbc;
  2. import com.mysql.jdbc.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. public class JDBCConnectionDemo {
  7. public static void main(String[] args) throws Exception {
  8. //1、注册驱动
  9. Class.forName("com.mysql.jdbc.Driver");
  10. //2、获取连接
  11. //url的格式是:"jdbc:mysql://mysql的ip:端口号/操作的数据库"
  12. String url="jdbc:mysql://127.0.0.1:3306/kc_db01";
  13. //username是你的mysql用户名
  14. String username="root";
  15. //password是你的mysql密码
  16. String password="123456";
  17. Connection conn= (Connection) DriverManager.getConnection(url, username, password);
  18. //3、定义sql
  19. String sql1="update emp set salary=6666 where ename='zhangsan'";
  20. String sql2="update emp set salary=6666 where ename='lisi'";
  21. //4、获取执行sql的Statement对象
  22. Statement stat=conn.createStatement();
  23. //选中要处理的异常部分,ctrl+alt+t快捷键生成
  24. try {
  25. //开启事务
  26. conn.setAutoCommit(false);
  27. //执行sql
  28. int count1=stat.executeUpdate(sql1);
  29. //处理结果
  30. System.out.println("影响的行数:"+count1);
  31. //执行时sql
  32. int count2=stat.executeUpdate(sql2);
  33. //处理结果
  34. System.out.println("影响的行数:"+count2);
  35. //提交事务
  36. conn.commit();
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. //回滚事务(回到开启事务之前,即什么也没处理前)
  40. conn.rollback();
  41. }finally {
  42. //7、释放资源(先开后释放)
  43. stat.close();
  44. conn.close();
  45. }
  46. }
  47. }

运行之前数据库emp表:

运行结果:

运行之后数据库emp表:

try之中的发生了异常 ,就会 被catch捕获,发生回滚,回滚到还没有开启事务之前,就是数据没有修改之前,若是没有用事务,就会导致可能一个成功一个失败,这是我们不愿意看到的。** 启用了事务,用了回滚事务,可以保证多个事务要么同时成功,要么同时失败。**

三、Statement

Statemen作用:

3.1、执行sql语句

int  executeUpdate(sql): 执行DML(对数据的增删改)、**DDL(对表和库的增删改)**语句

返回值:(1)DML语句影响的行数(2)DDL语句执行后,执行成功也可能返回0

ResultSet   executeQuery(sql):执行**DQL(对数据的查询操作)**语句

返回值:ResultSet结果对象

四、ResultSet

ResultSet(结果集对象)作用:

1.封装了DQL查询语句的结果
ResultSet  stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象

获取查询结果

boolean   next():(1)将光标从当前位置向前移动一行(2)判断当前行是否是有效行

 返回值:当前行有数据返回true,当前没数据返回false。

xxx     getXxx(参数):获取数据

  解释:xxx表示数据类型;如int  getInt(参数);String getString(参数);

  参数:对于int是列的编号,从1开始,对于String是列的名称。

使用步骤:

1、游标向下移动一行,并判断该行是否有数据:next()

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

示例:

  1. while(rs.next()){
  2. rs.getXxx(参数);
  3. }

实例:

  1. package com.jdbc;
  2. import com.mysql.jdbc.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. public class JDBCDemo3_ResultSet {
  7. public static void main(String[] args) throws Exception {
  8. //1、注册驱动
  9. Class.forName("com.mysql.jdbc.Driver");
  10. //2、获取连接
  11. //url的格式是:"jdbc:mysql://mysql的ip:端口号/操作的数据库"
  12. String url="jdbc:mysql://127.0.0.1:3306/kc_db01";
  13. //username是你的mysql用户名
  14. String username="root";
  15. //password是你的mysql密码
  16. String password="123456";
  17. Connection conn= (Connection) DriverManager.getConnection(url, username, password);
  18. //3、定义sql
  19. String sql="select *from emp";
  20. //4、获取执行sql的Statement对象
  21. Statement stmt=conn.createStatement();
  22. //5、执行sql语句
  23. ResultSet rs=stmt.executeQuery(sql);
  24. //6处理结果
  25. while(rs.next()){
  26. //获取数据 getXxx();括号中可以写所在行,也可以写列名
  27. int id=rs.getInt(1);
  28. String ename=rs.getString(2);
  29. int salary=rs.getInt(3);
  30. //另一种写法:写行的名称
  31. // int id=rs.getInt("id");
  32. // String ename=rs.getString("ename");
  33. // int salary=rs.getInt("salary");
  34. System.out.println(id);
  35. System.out.println(ename);
  36. System.out.println(salary);
  37. System.out.println("-----------");
  38. }
  39. //7、释放资源(先开后释放)
  40. rs.close();
  41. stmt.close();
  42. conn.close();
  43. }
  44. }

数据库中emp表

运行之后:

 ResultSet案例

需求:查询account账户数据,封装为Account对象中,并且存储到ArrayList集合中

创建一个pojo包,用来存放对象的。

创建了一个类,提供getSet方法

  1. package com.pojo;
  2. public class Account {
  3. private int id;
  4. private String ename;
  5. private int salary;
  6. public int getId() {
  7. return id;
  8. }
  9. public void setId(int id) {
  10. this.id = id;
  11. }
  12. public String getEname() {
  13. return ename;
  14. }
  15. public void setEname(String ename) {
  16. this.ename = ename;
  17. }
  18. public int getSalary() {
  19. return salary;
  20. }
  21. public void setSalary(int salary) {
  22. this.salary = salary;
  23. }
  24. //为了更好的显示,重写toString()方法
  25. @Override
  26. public String toString() {
  27. return "Account{" +
  28. "id=" + id +
  29. ", ename='" + ename + '\'' +
  30. ", salary=" + salary +
  31. '}'+"\n";
  32. }
  33. }

jdbc包下创建的类中

  1. package com.jdbc;
  2. import com.mysql.jdbc.Connection;
  3. import com.pojo.Account;
  4. import java.sql.DriverManager;
  5. import java.sql.ResultSet;
  6. import java.sql.Statement;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. public class JDBCDemo4_ResultSet {
  10. public static void main(String[] args) throws Exception {
  11. //1、注册驱动
  12. Class.forName("com.mysql.jdbc.Driver");
  13. //2、获取连接
  14. //url的格式是:"jdbc:mysql://mysql的ip:端口号/操作的数据库"
  15. String url="jdbc:mysql://127.0.0.1:3306/kc_db01";
  16. //username是你的mysql用户名
  17. String username="root";
  18. //password是你的mysql密码
  19. String password="123456";
  20. Connection conn= (Connection) DriverManager.getConnection(url, username, password);
  21. //3、定义sql
  22. String sql="select *from emp";
  23. //4、获取执行sql的Statement对象
  24. Statement stmt=conn.createStatement();
  25. //5、执行sql语句
  26. ResultSet rs=stmt.executeQuery(sql);
  27. //6处理结果
  28. //创建集合对象
  29. List<Account> list=new ArrayList<>();
  30. while(rs.next()){
  31. //创建Account对象
  32. Account account=new Account();
  33. //获取数据 getXxx();括号中可以写所在行,也可以写列名
  34. int id=rs.getInt(1);
  35. String ename=rs.getString(2);
  36. int salary=rs.getInt(3);
  37. //赋值数据
  38. account.setId(id);
  39. account.setEname(ename);
  40. account.setSalary(salary);
  41. list.add(account);
  42. }
  43. System.out.println(list);
  44. //7、释放资源(先开后释放)
  45. rs.close();
  46. stmt.close();
  47. conn.close();
  48. }
  49. }

运行结果:

五、PreparedStatement

5.1、PreparedStatement作用:

1、预编译SQL语句并执行:预防SQL注入问题

5.2、SQL注入

SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。

演示普通登录:

首先数据录kc_db1下的emp表为:

  1. package com.jdbc;
  2. import com.mysql.jdbc.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. public class JDBCDemo5_UserLogin {
  7. public static void main(String[] args) throws Exception {
  8. //2、获取连接
  9. //url的格式是:"jdbc:mysql://mysql的ip:端口号/操作的数据库"
  10. String url="jdbc:mysql://127.0.0.1:3306/kc_db01";
  11. //username是你的mysql用户名
  12. String username="root";
  13. //password是你的mysql密码
  14. String password="123456";
  15. Connection conn= (Connection) DriverManager.getConnection(url, username, password);
  16. String name="zhangsan";
  17. String pwd="1233";
  18. //3、定义sql
  19. String sql="select *from emp where ename='"+name+"'and password='"+pwd+"'" ;
  20. System.out.println("这条SQL语句是:"+sql);
  21. //4、获取执行sql的Statement对象
  22. Statement stat=conn.createStatement();
  23. //5、执行sql语句
  24. ResultSet rs = stat.executeQuery(sql);
  25. //6处理结果,rs有值说明查找成功
  26. if(rs.next()){
  27. System.out.println("登录成功");
  28. }else{
  29. System.out.println("登录失败");
  30. }
  31. //7、释放资源(先开后释放)
  32. rs.close();
  33. stat.close();
  34. conn.close();
  35. }
  36. }

运行结果:

输入其他(不成功的原因是数据库中没有账号密码为这个的):

5.2.1、 sql注入演示:

对于这条sql语句来说不点在于密码,账号任意

  1. String name="随便写的名";
  2. String pwd=" ' or '1'='1";

运行结果:

这条SQL语句是:select *from emp where ename='随便写的名'and password=' ' or  '1'='1'

** sql注入的本质就是改变原有的SQL语句,加入or之后1=1恒为真,所以这条语句就是true**

5.3、PreparedStatement解决SQL注入

①获取PreparedStatement对象

  1. //sql语句中的参数,使用?占位符代替
  2. String sql="select *from user where username=? and password=?";
  3. //通过Connection对象获取,并传入对应的sql语句
  4. PreparedStatement pstmt=conn.prepareStatement(sql);

②设置参数

PreparedStatement对象:setXxx(参数1,参数2):表示给参数1(?的位置)赋值为参数2

Xxx:数据类型;任意setInt(参数1,参数2)

参数

  •    参数1:表示?的位置编号,从1开始
  •    参数2: ?的值

③执行sql

executeUpdate();/excuteQuery();括号内不需要传递sql。

创建类:

  1. package com.jdbc;
  2. import com.mysql.jdbc.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.Statement;
  7. import java.util.Scanner;
  8. public class JDBCDemo5_UserLogin {
  9. public static void main(String[] args) throws Exception {
  10. //2、获取连接
  11. //url的格式是:"jdbc:mysql://mysql的ip:端口号/操作的数据库"
  12. String url="jdbc:mysql://127.0.0.1:3306/kc_db01";
  13. //username是你的mysql用户名
  14. String username="root";
  15. //password是你的mysql密码
  16. String password="123456";
  17. Connection conn= (Connection) DriverManager.getConnection(url, username, password);
  18. String name="随便写的名";
  19. String pwd=" ' or '1'='1";
  20. //3、定义sql
  21. String sql="select *from emp where ename=? and password=?" ;
  22. //4、获取的PreparedStatement对象
  23. PreparedStatement pstmt = conn.prepareStatement(sql);
  24. //设置参数
  25. pstmt.setString(1, name);
  26. pstmt.setString(2, pwd);
  27. //5、执行sql语句
  28. ResultSet rs =pstmt.executeQuery();
  29. System.out.println("这条SQL语句是:"+sql);
  30. //6处理结果,rs有值说明查找成功
  31. if(rs.next()){
  32. System.out.println("登录成功");
  33. }else{
  34. System.out.println("登录失败");
  35. }
  36. //7、释放资源(先开后释放)
  37. rs.close();
  38. pstmt.close();
  39. conn.close();
  40. }
  41. }

** 运行结果:**

这样就防止了sql注入,setXxx会对传入的参数会进行转义,不会拼接成字符串而是' or\ ' 1' = ' 1'

输入正确的:

 5.4、PrepareStatement原理

PrepareStatement好处:

1、预编译SQL,性能更高

2、防止sql注入。

my.ini配置文件可以看到日志

  1. log-output=FILE
  2. general-log=1
  3. general_log_file="D:\mysql.log"
  4. slow-query-log=1
  5. slow_query_log_file="D:\mysql_slow.log"
  6. long_query_time=2

预编译功能默认关闭

①:PreparedStatement预编译功能开启:userServerPrepStmts=true

在sql语句?之后书写参数

  1. String url="jdbc:mysql://127.0.0.1:3306/kc_db01"?userServerPrepStmts=true;

开启就会要prepare预编译: 

关闭之后就没有Prepare阶段

六、数据库连接池简介

①数据库连接池是个容器,负责分配管理数据库连接(Connection)

②他允许应用程序重复使用一个现有的数据录连接,而不是再重新建立一个(其实就是提前建立好连接之后直接用)

③释放空闲时间超过最大空闲时间的数据库链接来避免因为没有释放数据库连接而引起的数据库连接遗漏

6.1、数据库连接池优点

①资源重用(用完放回,而不释放)

②提升系统的响应速度(提前申请好了,要用是直接重连接池拿即可)

③避免数据录连接遗漏(某一资源超过最大时间强制会放回)

6.2、数据录库连接池实现

标准接口:DataSource

官方(SUN)提供的数据库连接池标准接口,由第三方组织实线这个接口

功能:获取连接

  1. Connection getConnection()

常见的数据库连接池:

DBCP

C3P0

Druid(德鲁伊):Druid连接池是阿里巴巴开源的数据库连接池项目,功能强大,性能优秀,是Java语言最好的数据库连接池之一。

6.3、Driud使用步骤

1、导入Driud的jar包

2、定义配置文件

3、加载配置文件

4、获取数据库连接池对象

5、获取连接

1、导入Druid的jar包,直接赋值jar包到lib目录下即可

选中jar包右键选择添加库,选择jar的作用范围为模块即可
2、定义配置文件druid.properties

内容一般为:

  1. driverClassName=com.mysql.jdbc.Driver
  2. url=jdbc:mysql://127.0.0.1:3306/kc_db01?useSSL=false&useServerPrepStmts=true
  3. username=root
  4. password=123456
  5. #初始化连接数量
  6. initialSize=5
  7. #最大连接数量
  8. maxActive=10
  9. #最大等待时间
  10. maxWait=3000

直接赋值刚才写的配置文件druid.properties复制到src下

类下:

  1. package com.druid;
  2. import com.alibaba.druid.pool.DruidDataSourceFactory;
  3. import javax.sql.DataSource;
  4. import java.io.FileInputStream;
  5. import java.sql.Connection;
  6. import java.util.Properties;
  7. public class druidDemo {
  8. public static void main(String[] args) throws Exception {
  9. //1、导入jar包
  10. //2、定义配置文件
  11. //3、加载配置文件
  12. Properties prop=new Properties();
  13. //加载
  14. prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
  15. //4、获取连接池对象
  16. DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
  17. //5、获取数据库连接Connection
  18. Connection connection = dataSource.getConnection();
  19. System.out.println(connection);
  20. //打印当前路径
  21. System.out.println(System.getProperty("user.dir"));//E:\jdbc
  22. }
  23. }

运行结果: 

七、完成商品品牌数据的增删改查操作

查询:查询所有数据

添加:添加品牌

修改:根据id修改

删除:根据id删除

准备环境:

数据库表tb-brand

实体类Brand

测试用例

 表的信息

  1. drop table if exists tb_brand;
  2. -- 创建tb_brand
  3. create table tb_brand
  4. (
  5. -- id 主键
  6. id int primary key auto_increment,
  7. -- 品牌名称
  8. brand_name varchar(20),
  9. -- 企业名称
  10. company_name varchar(20),
  11. -- 排序字段
  12. ordered int,
  13. -- 描述信息
  14. description varchar(100),
  15. -- 状态:0:禁用1启用
  16. `status` int
  17. )
  18. character set utf8;
  19. -- 添加数据
  20. insert into tb_brand (brand_name, company_name, ordered, description, `status`)
  21. values ('三只松鼠','三只松鼠股份有限公司',5,'好吃不上火',0),
  22. ('华为','华为技术有限公司',100,'华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界',1),
  23. ('小米','小米科技有限公司', 50,'are you ok', 1);
  24. SELECT * FROM tb_brand;

整列编辑:alt+鼠标左键

快捷生成方法:alt+insert

1、查询所有 

在pojo包下创建一个类(pojo就是用来存放对象的Brand):

  1. package com.pojo;
  2. public class Brand {
  3. // id 主键
  4. private Integer id;
  5. // 品牌名称
  6. private String brand_name;
  7. // 企业名称
  8. private String company_name;
  9. // 排序字段
  10. private Integer ordered;
  11. // 描述信息
  12. private String description;
  13. // 状态:0:禁用1启用
  14. private Integer status;
  15. public Integer getId() {
  16. return id;
  17. }
  18. public void setId(Integer id) {
  19. this.id = id;
  20. }
  21. public String getBrand_name() {
  22. return brand_name;
  23. }
  24. public void setBrand_name(String brand_name) {
  25. this.brand_name = brand_name;
  26. }
  27. public String getCompany_name() {
  28. return company_name;
  29. }
  30. public void setCompany_name(String company_name) {
  31. this.company_name = company_name;
  32. }
  33. public Integer getOrdered() {
  34. return ordered;
  35. }
  36. public void setOrdered(Integer ordered) {
  37. this.ordered = ordered;
  38. }
  39. public String getDescription() {
  40. return description;
  41. }
  42. public void setDescription(String description) {
  43. this.description = description;
  44. }
  45. public Integer getStatus() {
  46. return status;
  47. }
  48. public void setStatus(Integer status) {
  49. this.status = status;
  50. }
  51. @Override
  52. public String toString() {
  53. return "Brand{" +
  54. "id=" + id +
  55. ", brand_name='" + brand_name + '\'' +
  56. ", company_name='" + company_name + '\'' +
  57. ", ordered='" + ordered + '\'' +
  58. ", description='" + description + '\'' +
  59. ", status=" + status +
  60. '}'+"\n";
  61. }
  62. }

因为status是状态0或1,如果我们弄int类型,默认值是0,而用Integer包装类默认值则是null,符合我们的要求

新建一个example创建一个BrandText类

  1. package com.example;
  2. import com.alibaba.druid.pool.DruidDataSourceFactory;
  3. import com.pojo.Brand;
  4. import org.junit.Test;
  5. import javax.sql.DataSource;
  6. import java.io.FileInputStream;
  7. import java.sql.Connection;
  8. import java.sql.PreparedStatement;
  9. import java.sql.ResultSet;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12. import java.util.Properties;
  13. /**
  14. * 品牌数据的增删改查
  15. */
  16. public class BrandText {
  17. /**
  18. * 查询所有的
  19. * 1、SQL:select*from tb_brand
  20. * 2、参数:不需要
  21. * 3、结果:List<Brand>
  22. */
  23. @Test
  24. public void textSelectAll() throws Exception{
  25. //1、获取Connection连接对象
  26. Properties prop=new Properties();
  27. //加载
  28. prop.load(new FileInputStream("E://JDBC/jdbc-demo/src/druid.properties"));
  29. //获取连接池对象
  30. DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
  31. //获取数据库连接Connection
  32. Connection conn = dataSource.getConnection();
  33. //2、定义SQL
  34. String sql="select*from tb_brand";
  35. //3、获取pstmt对象
  36. PreparedStatement pstmt=conn.prepareStatement(sql);
  37. //4、设置参数
  38. //5、执行sql
  39. ResultSet rs=pstmt.executeQuery();
  40. //6、处理结果List<Brand> 封装Brand对象,装载到List集合
  41. //创建List集合对象
  42. List<Brand> list=new ArrayList<>();
  43. Brand brand=null;
  44. while(rs.next()){
  45. //获取数据
  46. int id = rs.getInt("id");//快捷键ctrl+alt+v生成左边
  47. String brandName = rs.getString("brand_name");
  48. String companyName = rs.getString("company_name");
  49. int ordered = rs.getInt("ordered");
  50. String description = rs.getString("description");
  51. int status = rs.getInt("status");
  52. //封装Brand对象
  53. brand=new Brand();
  54. brand.setId(id);
  55. brand.setBrand_name(brandName);
  56. brand.setCompany_name(companyName);
  57. brand.setOrdered(ordered);
  58. brand.setDescription(description);
  59. brand.setStatus(status);
  60. list.add(brand);
  61. }
  62. System.out.println(list);
  63. //7、释放资源
  64. rs.close();
  65. pstmt.close();
  66. conn.close();
  67. }
  68. }

运行结果: 

2、增加数据

  1. /**
  2. * 添加
  3. * SQL:insert into tb_brand (brand_name, company_name, ordered, description, status)values(?,?,?,?,?);
  4. * 参数是除了id之外的所有参数信息
  5. * 结果:boolean
  6. * @throws Exception
  7. */
  8. @Test
  9. public void textAdd()throws Exception{
  10. /*
  11. 模拟页面提交的参数
  12. 品牌名称[]'
  13. */
  14. String brand_name="阿里巴巴";
  15. // 企业名称
  16. String company_name="阿里巴巴";
  17. // 排序字段
  18. int ordered=1;
  19. // 描述信息
  20. String description="知名top企业";
  21. // 状态:0:禁用1启用
  22. int status=1;
  23. //1、获取Connection连接对象
  24. Properties prop=new Properties();
  25. //加载
  26. prop.load(new FileInputStream("E://JDBC/jdbc-demo/src/druid.properties"));
  27. //获取连接池对象
  28. DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
  29. //获取数据库连接Connection
  30. Connection conn = dataSource.getConnection();
  31. //2、定义SQL
  32. String sql="insert into tb_brand (brand_name, company_name, ordered, description, status)values(?,?,?,?,?)";
  33. //3、获取pstmt对象
  34. PreparedStatement pstmt=conn.prepareStatement(sql);
  35. //4、设置参数
  36. pstmt.setString(1, brand_name);//ctrl+b快速复制
  37. pstmt.setString(2, company_name);
  38. pstmt.setInt(3, ordered);
  39. pstmt.setString(4, description);
  40. pstmt.setInt(5, status);
  41. //5、执行sql
  42. int count = pstmt.executeUpdate();
  43. System.out.println(count>0);
  44. //7、释放资源
  45. pstmt.close();
  46. conn.close();
  47. }

乱码问题: 

我们运行之后发查询数据库发现乱码了,此时说明编码不一致,只需要在配置文件druid.properties中加入:

  1. characterEncoding=utf8

加完之后运行:

3、修改数据

  1. @Test
  2. public void textUpdate()throws Exception{
  3. /*
  4. 模拟页面提交的参数
  5. 品牌名称[]'
  6. */
  7. String brand_name="一本正经";
  8. // 企业名称
  9. String company_name="一本";
  10. // 排序字段
  11. int ordered=666;
  12. // 描述信息
  13. String description="心心比心";
  14. // 状态:0:禁用1启用
  15. int status=1;
  16. int id=3;
  17. //1、获取Connection连接对象
  18. Properties prop=new Properties();
  19. //加载
  20. prop.load(new FileInputStream("E://JDBC/jdbc-demo/src/druid.properties"));
  21. //获取连接池对象
  22. DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
  23. //获取数据库连接Connection
  24. Connection conn = dataSource.getConnection();
  25. //2、定义SQL
  26. String sql="update tb_brand set brand_name=?,company_name=?,ordered=?,description=?,status=? where id=?";
  27. //3、获取pstmt对象
  28. PreparedStatement pstmt=conn.prepareStatement(sql);
  29. //4、设置参数
  30. pstmt.setString(1, brand_name);//ctrl+b快速复制
  31. pstmt.setString(2, company_name);
  32. pstmt.setInt(3, ordered);
  33. pstmt.setString(4, description);
  34. pstmt.setInt(5, status);
  35. pstmt.setInt(6, id);
  36. //5、执行sql
  37. int count = pstmt.executeUpdate();
  38. System.out.println(count>0);
  39. //7、释放资源
  40. pstmt.close();
  41. conn.close();
  42. }

**运行结果: **

** 数据库中的数据变化:**

 4、删除数据

  1. /**
  2. * 删除数据的sql为delete from 表名 where 删除条件
  3. * @throws Exception
  4. */
  5. @Test
  6. public void textDelete()throws Exception{
  7. //1、获取Connection连接对象
  8. Properties prop=new Properties();
  9. //加载
  10. prop.load(new FileInputStream("E://JDBC/jdbc-demo/src/druid.properties"));
  11. //获取连接池对象
  12. DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
  13. //获取数据库连接Connection
  14. Connection conn = dataSource.getConnection();
  15. //2、定义SQL
  16. String sql="delete from tb_brand where id=3";
  17. //3、获取pstmt对象
  18. PreparedStatement pstmt=conn.prepareStatement(sql);
  19. //5、执行sql
  20. int count = pstmt.executeUpdate();
  21. System.out.println("删除"+(count>0));
  22. //7、释放资源
  23. pstmt.close();
  24. conn.close();
  25. }

运行结果:

数据库对比图;

后面也可以通过前端回传数据到后端接收来使用数据

相关文章