JDBC杂谈
JDBC——Java操纵关系型数据库的一套API
SUN公司定义接口,各个数据库厂商实现接口,使用JDBC编程,真正执行代码为jar包中的实现类。
JDBC操纵MySQL
连接数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18// 方法用于建立数据库连接
public class MySQLConnection {
// 方法用于建立数据库连接
public Connection getConnection() {
String url = "jdbc:mysql://localhost:3306/pingpang_plus";
String user = "root";
String password = "123456";
try {
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("成功连接到数据库!");
return connection;
} catch (SQLException e) {
System.err.println("连接数据库时发生错误: " + e.getMessage());
return null;
}
}
}成功连接则返回succeed,否则为failed。
- 常见报错:
- No suitable driver found for jdbc:mysql://localhost:3306/mydb
问题描述:这个错误表明JDBC驱动未正确加载。
解决方案:查看相应的驱动是否成功配置。 - Access denied for user ‘root‘@’localhost’ (using password: YES)
问题描述:这个错误表明数据库连接时用户名或密码不正确。
解决方案:看账密有没有错
- No suitable driver found for jdbc:mysql://localhost:3306/mydb
- 常见报错:
查询操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49public class MySQLSearch {
public static Scanner scanner = new Scanner(System.in);
public void executeSearch() {
MySQLConnection mySQLConnection = new MySQLConnection();
Connection connection = mySQLConnection.getConnection();
if (connection != null) {
try {
System.out.println("请输入要执行的查询语句:");
String userQuery = scanner.nextLine(); // 接受用户输入的查询语句
//System.out.println("实例化 Statement 对象...");
Statement stmt = connection.createStatement();
if (userQuery.trim().toLowerCase().startsWith("select")) {
ResultSet rs = stmt.executeQuery(userQuery);
ResultSetMetaData metaData = rs.getMetaData(); // 获取元数据
int columnCount = metaData.getColumnCount(); // 获取列数
// 打印表头
for (int i = 1; i <= columnCount; i++) {
System.out.print(metaData.getColumnName(i) + "\t");
}
System.out.println();
// 打印查询结果
while (rs.next()) {
for (int i = 1; i <= columnCount; i++) {
System.out.print(rs.getString(i) + "\t"); // 动态获取每列的数据
}
System.out.println();
}
rs.close();
} else {
System.out.println("你输入的语句并不是查询语句");
}
// 关闭连接
stmt.close();
connection.close();
} catch (SQLException e) {
System.err.println("执行查询时发生错误: " + e.getMessage());
}
}
}
}输入你想输入的查询语句,即可完成查询操作。
- 详细解释:
- public static Scanner scanner = new Scanner(System.in);
public:表明类、方法、变量可以在任何类中被访问,而且不受包的限制
eg.
public int number; // 公开变量
MyClass obj = new MyClass();
obj.number = 10; // 其他类可以直接访问这个public变量
static:使其后面修饰的无需创建实体就可访问
eg.
如果去掉 static,将变成一个实例变量:
public Scanner scanner = new Scanner(System.in);
必须通过 创建 MySQLSearch 类的对象 才能访问 scanner
MySQLSearch mySQLSearch = new MySQLSearch(); // 创建类的实例
mySQLSearch.scanner.nextLine(); // 通过对象来访问scanner
- public static Scanner scanner = new Scanner(System.in);
- 详细解释:
插入操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27public class MySQLAdd {
public static Scanner scanner = new Scanner(System.in);
public void MYSQLAdd(){
MySQLConnection mySQLConnection = new MySQLConnection();
Connection connection = mySQLConnection.getConnection();
if(connection != null){
try {
System.out.println("在下方输入插入语句:");
Statement statement = connection.createStatement();
String sql = scanner.nextLine();
int ok = statement.executeUpdate(sql);
if(ok != 0){
System.out.println("插入成功");
}
//关闭连接
statement.close();
connection.close();
}
catch (SQLException e){
System.out.println("插入失败");
}
}
}
}删除操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28public class MySQLDelete {
public static Scanner scanner = new Scanner(System.in);
public void MySQLDelete(){
MySQLConnection mySQLConnection = new MySQLConnection();
Connection connection = mySQLConnection.getConnection();
if(connection != null){
try{
Statement statement = connection.createStatement();
System.out.println("输入删除语句");
String sql = scanner.nextLine();
int ok = statement.executeUpdate(sql);
if(ok != 0){
System.out.println("删除成功");
}
//close DB
statement.close();
connection.close();
}
catch (SQLException e){
System.out.println("删除失败");
}
}
}
}更新操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28public class MySQLUpdate {
public static Scanner scanner = new Scanner(System.in);
public void MySQLUpdate(){
MySQLConnection mySQLConnection = new MySQLConnection();
Connection connection = mySQLConnection.getConnection();
if(connection != null){
try{
Statement statement = connection.createStatement();
System.out.println("输入更新语句");
String sql = scanner.nextLine();
int ok = statement.executeUpdate(sql);
if(ok != 0){
System.out.println("更新成功");
}
//close DB
statement.close();
connection.close();
}
catch (SQLException e){
System.out.println("更新失败");
}
}
}
}
JDBC却也存在许多弊端
硬编码——url、user、password难以改动
- 硬编码:写在程序中固定的值,区别于通过变量、配置文件变化而变化的值。
繁琐——获取字段太多
- 当不使用获取元数据的方法执行查询操作时,得一个字段一个字段的获取
- 当不使用获取元数据的方法执行查询操作时,得一个字段一个字段的获取
资源浪费——频繁开关连接
- close方法
MyBatis作为一款持久层框架,较好的解决了上述问题。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 陈同学的桃花源!
评论