JDBC概念
JDBC常用类
JDBC涉及到的各个接口
JDBC事务
JDBC概念
Java DataBase Connectivity 使用Java语言连接数据库的技术
本质:就是官方定义的一套操作数据库的规范(规则,封装了大量接口,各个数据库厂商去实现这套接口,提供了各种数据库驱动jar包,来完成连接数据库操作数据库的功能)
快速入门:
步骤:
//1.导入数据库驱动 jar包
//2.注册驱动 Driver com.mysql.jdbc.Driver.class
Class.forName("com.mysql.jdbc.Driver");//通过该类的路径反射生成该类的字节码对象
//3.获取数据库的连接对象 Connection jdbc[jdbc协议]:mysql[mysql协议]://127.0.0.1[ip地址]:3306[数据库端口号]/school[指定数据库]", "root"[登陆账号], "root"[登陆密码]
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/school", "root", "root");//连接数据库的地址,账号,密码
//4.准备sql语句
String sql = "update role set r_id = 12306 where r_name = '张三' ";//核心
//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();
介绍JDBC使用到的包和类
-
java.sql
:所有与JDBC访问数据库相关的类和接口 -
javax.sql
:用到数据库连接池 数据库的拓展包,提供数据库操作的额外功能 ,如连接池
DriverManager类 :驱动管理,注册驱动,获取数据库的连接对象
Connection接口:连接对象,用于创建执行sql的对象---Satatement / PreparedStatement
Statement接口:sql语句执行对象,用于将sql语句发送给数据库服务器
PreparedStatement接口:sql语句执行对象,是satatement 的子接口
ResultSet:用于封装从数据库查询出来的结果值
DriverManager:
-
自JDBC3开始,可以不注册驱动这直接使用。class.forName();
-
Connection getConnection ("irp",userUsername, password)
可以获取到数据库的连接对象
-
Connection getConnection(String url;Properties info):通过连接字符串和属性对象获取数据连接对象
-
" jdbc:mysql://127.0.0.1:3306/school", "root", "root") " 如果数据库的服务器在本地中,省略掉ip地址和端口号 jdbc:mysql:///数据库名称(数据名称?[参数名 = 参数值])
-
如果数据传输引发乱码,后面使用参数 characterEncoding = utf8 jdbc:mysql:///数据库名称(数据名称? characterEncoding = utf8 )
Connection接口
连接数据库,它是一个接口,由具体的厂商提供具体实现类,代表的是一个连接对象
- Statement createStatment()创建一个sql执行对象
- PrepareStatement prepareStatement()创建一个sql预处理对象
Statement接口
用来执行sql语句,本质是把sql语句发送给数据库服务器
- int executeUpdate(String sql) 用于把sql语句发送给服务器,执行增删改操作。返回值int是影响数据库的记录行数
- ResultSet executeQuery(String sql)用于把sql语句发送给服务器,执行查询操作。返回值ResultSet 查询返回的结果集
释放资源
需要释放的资源对象: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.util.Date |
备注: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表
- 需要创建封装层中的model类 -----> Account类
表与实体类的对应关系如图所示:
项目分层
合理的分层能够使项目的开发和维护更方便