Java里面ps和st_JDBC--->概念,jdbc使用的常用类、JDBC中涉及到的各个接口

JDBC

JDBC概念

​什么是JDBC:Java DataBase Connectivity 使用Java语言连接数据库的技术

0ab97a9f4ecd2d50c9297d5ee590ca71.png

​ 本质:就是官方定义的操作数据库的一套规范、规则,都是接口。各个数据库厂商去实现这套接口,提供对应的数据库驱动jar包。我们可以使用这个驱动jar包,来完成连接数据库操作数据库的功能

快速入门:

步骤:

// 1. 添加数据库驱动jar包

// 2. 注册驱动 Driver com.mysql.jdbc.Driver ClassNotFoundException

Class.forName("com.mysql.jdbc.Driver");// 通过该类的路径反射生成该来的字节码对象

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

Connection connection = DriverManager.getConnection("jdbc:mysql://192.168.14.149:3306/java31", "root", "root");

// 4. 准备sql语句

String sql = "update account set balance = 20000 where username = '张三'";

// 5. 获取执行sql语句的对象 Statement

Statement statement = connection.createStatement();

// 6. 通过statement对象执行sql语句

int count = statement.executeUpdate(sql);

// 判断如果count>0就代表执行成功

if (count > 0) {

System.out.println("更新数据库成功!");

} else {

System.out.println("更新数据库失败!");

}

// 打开的连接对象关闭 先打开后关闭 后打开先关闭

statement.close();

connection.close();

快速回忆:

多表连接:

内连接:隐式内连接 用逗号"," 连接条件使用where,没有inner join 、显式内连接 使用关键字 【inner】 join on 条件

外连接: 左外连接 left [outer] join on 条件 、右外连接 right [outer] join on 条件

子查询:

单行单列 使用比较运算符 > < != <>...... 条件放在where语句后面

多行单列 使用in运算符 in (散列数据) 条件放在where语句的后面

多行多列 放在from的后面 作为一张表进行二次查询的条件判断

介绍JDBC快速入门使用到的包和类

java.sql 所有与JDBC访问数据库相关的类和接口。

javax.sql 用到数据库连接池 数据库的扩展包,提供数据库操作额外一些功能,如:连接池

DrierManager 驱动管理 注册驱动 还有获取数据库连接对象

Connection 连接对象 用于创建执行sql对象 Statement 、PreparedStatement对象

Statement sql语句执行对象,用于将sql语句发送给数据库服务器

PreparedStatement sql语句执行对象 是Statement接口的子接口。

ResultSet 用于封装从数据库查询出来的结果值

DriverManager类

​从JDBC3开始,可以不用注册驱动可以直接使用。Class.forName();

​ Connection getConnection(url,user,password): 可以获取到数据库的连接对象

​ Connection getConnection(String url,Properties info): 通过连接字符串和属性对象 获取数据连接对象

​ user 登录数据库用户名

​ password 登录数据库的密码

​ url 连接数据库的路径 对于mysql而言 jdbc:mysql:// 服务器ip地址:端口号3306/数据库名称?[参数名 =参数值]

​ 驱动类路径 com.mysql.jdbc.Driver

jdbc:mysql:// 服务器ip地址:端口号3306/数据库名称?[参数名 =参数值],如果数据库的服务器是在本地中,省略掉ip地址和端口号---> jdbc:mysql:///数据库名称?[参数名 =参数值]

如果数据传输时引发了乱码,后面可以使用 参数 characterEncoding = utf8

jdbc:mysql:///数据库名称?characterEncoding = utf8

Connection接口

作用: 连接数据库,它是一个接口,由具体的厂商来提供具体的实现类,代表的是一个连接对象。

Statement createStatement() 创建一个sql执行对象

PrepareStatement preparedStatement() 创建一个sql预处理对象

Statement接口

​作用:用来执行sql语句,本质是把sql语句发送给数据库服务器

int executeUpdate(String sql) 用于把sql语句发送给服务器,执行增删改操作。返回值int 影响数据库的记录数(行数)

ResultSet executeQuery(String sql) 用于把sql语句发送给服务器,执行查询操作。返回值ResultSet 查询返回的结果集。

PreparedStatement

执行sq的l对象

会防止一些sql非法注入问题,在拼接sql语句时,可能会造成安全性问题。如:

" select * from account where username like '% " +username + " % ' and balance = ' " + balance + " ' + " or 1 = 1 "

此时出现 " or 1=1 " 非法拼接问题。

使用预编译的sql,参数使用?作为占位符

操作:

在sql语句中涉及到参数时使用?替代具体的数据 如: select * from user where username = ? and password = ?

使用连接对象执行sql语句获取预编译对象 connection.preparedStatement(String sql)

给?赋值:

​ 使用方法:setXxx(?索引下标,?对应的实际值)

使用预编译对象执行sql,获取返回的结果集值--->preparedStatement.executeQuery();

处理结果

释放资源。

释放资源

需要释放的资源对象: ResultSet对象 Statement对象 Connection对象

释放的顺序: 先开后关,后开先关 ResultSet----->Statement------>Connection

释放资源:使用finally语句块,一定会被加载到。不能单独使用,需要搭配try语句块

常用数据库数据类型和Java类型对照

sql

jdbc方法

java

int

getInt()

int

bigInt

getLong()

long

bit

getBoolean()

boolean

varchar

getString()

String

date/time/TimeStamp

getDate/getTime/getTimeStamp

java.util.Date/java.sql.Time/java.sql.Timestamp

double

getDouble()

double

备注:java.sql.Date/Time/TimeStamp(时间戳)三个共同的父类是----->java.util.Date

数据库工具类 DBUtil

// 数据库工具类

public class DBUtil {

// 定义四个常量值

private static final String DRIVER = "com.mysql.jdbc.Driver";

private static final String URL = "jdbc:mysql:///java31?characterEncoding=utf8";

private static final String USER = "root";

private static final String PASSWORD = "root";

// 定义JDBC常用类和接口

private static Connection con = null;

private static Statement st = null;

private static PreparedStatement ps = null;

private static ResultSet set = null;

static {

try {

Class.forName(DRIVER);

con = DriverManager.getConnection(URL, USER, PASSWORD);

} catch (Exception e) {

e.printStackTrace();

}

}

// 针对查询的功能

public static ResultSet select(String sql,Object[] args) {

//String sql2 = "select * from account where u_name = ? and password = ?";

try {

// 获取预处理对象

ps = con.prepareStatement(sql);

// 使用sql语句中的占位符 ?

// 遍历数组

// 占位符 在sql中是有前后顺序的 u_name对应的问号 索引是 1 password对应的问号就是2

for (int i = 0; i < args.length; i++) {

// 把问号提换成具体的数据

ps.setObject(i+1, args[i]);

}

// 执行sql语句 获取结果值

set = ps.executeQuery();

} catch (SQLException e) {

e.printStackTrace();

}

return set;

}

// 针对更新的功能 insert update delete executeUpdate()

public static int update(String sql,Object[] args) {

// 获取预处理对象

// 定义一个变量 用来记录印象数据库表的行数

int count = 0;

try {

ps = con.prepareStatement(sql);

// 使用sql语句中的占位符 ?

// 遍历数组

// 占位符 在sql中是有前后顺序的 u_name对应的问号 索引是 1 password对应的问号就是2

for (int i = 0; i < args.length; i++) {

// 把问号提换成具体的数据

ps.setObject(i+1, args[i]);

}

// 执行sql语句 获取结果值

count = ps.executeUpdate();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

// 返回给调用处

return count;

}

// 关闭连接的方法

public static void closeAll() {

// 关闭时 先关闭ResultSet

if (set != null) {

try {

set.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

if (st != null) {

try {

st.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

if (con != null) {

try {

con.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

}

表与类的关系

整个表可以看做成一个类

表的每一行称之为一条记录,可以看做成一个类的实例

表中的每一列可以看做成实例对象中的每个属性。

实体类、model类需要和数据库中的类进行一一映射

表中的列名和model类中的属性名保持一致

表中的列字段数据类型和model类中的属性数据类型保持一致

操作:数据库java31中的 account表

a85f42f01330b4bbe2a39fa8ac7f01e7.png

需要创建封装层中的model类 -----> Account类

2ed4209f188161007db3417298cc1b52.png

​ 表与实体类的对应关系如图所示:

25acd8246a1cba895575546a3414ba5e.png

项目分层

​合理的分层能够使项目的开发和维护更方便

20768b53f32b50934d6e85b301beaf57.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值