JDBC
-
什么是JDBC:Java DataBase Connectivity 使用Java语言连接数据库的技术
-
-
快速入门:
-
1 // 1. 添加数据库驱动jar包
2 // 2. 注册驱动 Driver com.mysql.jdbc.Driver ClassNotFoundException
3 Class.forName("com.mysql.jdbc.Driver");// 通过该类的路径反射生成该来的字节码对象
4 // 3. 获取数据库的连接对象 Connection
5 Connection connection = DriverManager.getConnection("jdbc:mysql://192.168.14.149:3306/java31", "root", "root");
6 // 4. 准备sql语句
7 String sql = "update account set balance = 20000 where username = '张三'";
8 // 5. 获取执行sql语句的对象 Statement
9 Statement statement = connection.createStatement();
10 // 6. 通过statement对象执行sql语句
11 int count = statement.executeUpdate(sql);
12 // 判断如果count>0就代表执行成功
13 if (count > 0) {
14 System.out.println("更新数据库成功!");
15 } else {
16 System.out.println("更新数据库失败!");
17 }
18 // 打开的连接对象关闭 先打开后关闭 后打开先关闭
19 statement.close();
20 connection.close();
介绍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
1 // 数据库工具类
2 public class DBUtil {
3 // 定义四个常量值
4 private static final String DRIVER = "com.mysql.jdbc.Driver";
5 private static final String URL = "jdbc:mysql:///java31?characterEncoding=utf8";
6 private static final String USER = "root";
7 private static final String PASSWORD = "root";
8 // 定义JDBC常用类和接口
9 private static Connection con = null;
10 private static Statement st = null;
11 private static PreparedStatement ps = null;
12 private static ResultSet set = null;
13
14 static {
15 try {
16 Class.forName(DRIVER);
17 con = DriverManager.getConnection(URL, USER, PASSWORD);
18 } catch (Exception e) {
19 e.printStackTrace();
20 }
21 }
22 // 针对查询的功能
23 public static ResultSet select(String sql,Object[] args) {
24 //String sql2 = "select * from account where u_name = ? and password = ?";
25 try {
26 // 获取预处理对象
27 ps = con.prepareStatement(sql);
28 // 使用sql语句中的占位符 ?
29 // 遍历数组
30 // 占位符 在sql中是有前后顺序的 u_name对应的问号 索引是 1 password对应的问号就是2
31 for (int i = 0; i < args.length; i++) {
32 // 把问号提换成具体的数据
33 ps.setObject(i+1, args[i]);
34 }
35 // 执行sql语句 获取结果值
36 set = ps.executeQuery();
37 } catch (SQLException e) {
38 e.printStackTrace();
39 }
40 return set;
41 }
42 // 针对更新的功能 insert update delete executeUpdate()
43 public static int update(String sql,Object[] args) {
44 // 获取预处理对象
45 // 定义一个变量 用来记录印象数据库表的行数
46 int count = 0;
47 try {
48 ps = con.prepareStatement(sql);
49 // 使用sql语句中的占位符 ?
50 // 遍历数组
51 // 占位符 在sql中是有前后顺序的 u_name对应的问号 索引是 1 password对应的问号就是2
52 for (int i = 0; i < args.length; i++) {
53 // 把问号提换成具体的数据
54 ps.setObject(i+1, args[i]);
55 }
56 // 执行sql语句 获取结果值
57 count = ps.executeUpdate();
58 } catch (SQLException e) {
59 // TODO Auto-generated catch block
60 e.printStackTrace();
61 }
62 // 返回给调用处
63 return count;
64 }
65 // 关闭连接的方法
66 public static void closeAll() {
67 // 关闭时 先关闭ResultSet
68 if (set != null) {
69 try {
70 set.close();
71 } catch (SQLException e) {
72 e.printStackTrace();
73 }
74 }
75 if (st != null) {
76 try {
77 st.close();
78 } catch (SQLException e) {
79 e.printStackTrace();
80 }
81 }
82 if (con != null) {
83 try {
84 con.close();
85 } catch (SQLException e) {
86 e.printStackTrace();
87 }
88 }
89 }
90 }
表与类的关系
-
整个表可以看做成一个类
-
表的每一行称之为一条记录,可以看做成一个类的实例
-
表中的每一列可以看做成实例对象中的每个属性。
-
实体类、model类需要和数据库中的类进行一一映射
-
表中的列名和model类中的属性名保持一致
-
表中的列字段数据类型和model类中的属性数据类型保持一致
-
-
操作:数据库java31中的 account表
- 需要创建封装层中的model类 -----> Account类
表与实体类的对应关系如图所示: