策略模式

jdbc的定义

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

##jdbc的基本连接
简单的说就是加载驱动,建立连接,然后进行查询和删除等语句的操作,在java中提供了java.sql的jar包,不过我现在用的是mysql的连接和实例,在这里基本在本地的服务器都是用到下面这个语句

1
2
3
4
5
6
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8";
String user="root";
String password="root";

加载和建立连接,这就是基本的一个语法结构,在连接数据库当然还有其他的属性可以设置,比如说最大的连接数了,和如何建立连接池,都可以在配置中用到,这里我就简单的介绍如何连接,后面跟的是这个连接的字符集,防止出现乱码

简单的增删改查

简单的增删改查是每个开发者都会遇到的,毕竟我们整个系统真正的业务所在也是这几个简单的逻辑,但是在关系的连接和耦合性下就会变成复杂百倍的系统,所以要懂得基本的就可以窥见更大系统的构建了,所以我现在要分析的只是基本的功能实现
首先连接好数据库之后,那就是创建查询语句,这里用到的是statment这个关键词,下面是代码的基本实现

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package dbtest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class DbTest {
public static void main(String[] args) {
Employee employee1 =new Employee();
employee1.setEmpno(555);
employee1.setEname("hakly");
employee1.setSal(5400);
employee1.setHiredate(new Date());
addEmployee(employee1);
List<Employee>employees=getEmployees();
for(Employee employee:employees){
System.out.println(employee);
}
Employee employee =new Employee();
employee.setEmpno(999);
employee.setEname("jack");
employee.setSal(5000);
employee.setHiredate(new Date());
addEmployee(employee);
}
public static List<Employee> getEmployees() {
ResultSet rs=null;
Connection conn=null;
Statement stat=null;
List<Employee> employees=new ArrayList<Employee>();
try{
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8";
String user="root";
String password="root";
conn= DriverManager.getConnection(url,user,password);
stat=conn.createStatement();
String sql="select * from emp";
rs=stat.executeQuery(sql);
Employee employee=null;
while(rs.next()){
employee=new Employee();
employee.setEmpno(rs.getInt("empno"));
employee.setEname(rs.getString("ename"));
employee.setSal(rs.getDouble("sal"));
employee.setHiredate(rs.getDate("hiredate"));
employees.add(employee);
}
}catch(Exception e ){
e.printStackTrace();
}finally{
try {
if(conn!=null){
conn.close();
}
}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return employees;
}
<!--more-->
public static void addEmployee(Employee employee) {
Connection conn = null;
Statement stat = null;
// 1.注册驱动程序
try {
Class.forName("com.mysql.jdbc.Driver");
// 2.建立连接
String url = "jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8";
String user = "root";
String password = "root";
conn = DriverManager.getConnection(url, user, password);
// 3.创建执行语句,发送sql命令
stat = conn.createStatement();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String sql = "insert into emp(empno,ename,sal,hiredate) values(" + employee.getEmpno() + ",'"
+ employee.getEname() + "'," + employee.getSal() + ",'" + sdf.format(employee.getHiredate()) + "')";
// 4.处理执行结果
int i = stat.executeUpdate(sql);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 5.关闭资源
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void updateEmployee(Employee employee) {
Connection conn = null;
Statement stat = null;
// 1.注册驱动程序
try {
Class.forName("com.mysql.jdbc.Driver");
// 2.建立连接
String url = "jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8";
String user = "root";
String password = "root";
conn = DriverManager.getConnection(url, user, password);
// 3.创建执行语句,发送sql命令
stat = conn.createStatement();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String sql = "update emp set ename='"+employee.getEname()+"empno"+employee.getEmpno()+"sal"+employee.getSal();
// 4.处理执行结果
int i = stat.executeUpdate(sql);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 5.关闭资源
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

这里的代码很繁琐,但是没办法,为了更清新一点的去了解,这个过程是必须的,然后接下来就是进行简单的优化,虽然代码还是差不多,但是感觉上会更加简洁了
,这里就要建立一个工具类了代码如下

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
package dbtest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JdbcUtil {
static String url = "jdbc:mysql://localhost:3306/xxx?useUnicode=true&characterEncoding=utf-8";
static String user = "root";
static String password = "root";
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException{
String url = "jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8";
String user = "root";
String password = "root";
return DriverManager.getConnection(url, user, password);
}
public static void free(Connection conn){
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

在这里,把数据库连接和异常处理,等工作都及合成一个工具类,然后再主函数调用就可以了,这就是面向对象的一个体现,当然还是会分析下关于主类的代码,要不然就太过于空洞了,下面要分析的主类代码如下

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package com.niit.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class EmployeeDao1 {
public static void main(String[] args) throws ParseException {
List<Employee> employees=getEmployees();
for(Employee employee:employees){
System.out.println(employee);
}
/*Employee employee = new Employee();
employee.setEmpno(9999);
employee.setEname("tom");
employee.setSal(6000);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
employee.setHiredate(sdf.parse("2015-07-23"));
//addEmployee(employee);
//updateEmployee(employee);
deleteEmployee(9999);*/
}
public static List<Employee> getEmployees() {
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
List<Employee> employees = new ArrayList<Employee>();
// 1.注册驱动程序
try {
//2.获取连接
conn=JdbcUtil.getConnection();
// 3.创建执行语句,发送sql命令
stat = conn.createStatement();
String sql = "select * from emp";
// 4.处理执行结果
rs = stat.executeQuery(sql);
Employee employee = null;
while (rs.next()) {
employee = new Employee();
employee.setEmpno(rs.getInt("empno"));
employee.setEname(rs.getString("ename"));
employee.setSal(rs.getDouble("sal"));
employee.setHiredate(rs.getDate("hiredate"));
employees.add(employee);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 5.关闭资源
JdbcUtil.free(conn);
}
return employees;
}
public static void addEmployee(Employee employee) {
Connection conn = null;
Statement stat = null;
// 1.注册驱动程序
try {
//2.获取连接
conn=JdbcUtil.getConnection();
// 3.创建执行语句,发送sql命令
stat = conn.createStatement();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String sql = "insert into emp(empno,ename,sal,hiredate) values(" + employee.getEmpno() + ",'"
+ employee.getEname() + "'," + employee.getSal() + ",'" + sdf.format(employee.getHiredate()) + "')";
// 4.处理执行结果
int i = stat.executeUpdate(sql);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 5.关闭资源
JdbcUtil.free(conn);
}
}
public static void updateEmployee(Employee employee) {
Connection conn = null;
Statement stat = null;
// 1.注册驱动程序
try {
//2.获取连接
conn=JdbcUtil.getConnection();
// 3.创建执行语句,发送sql命令
stat = conn.createStatement();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String sql = "update emp set ename='" + employee.getEname() + "',sal=" + employee.getSal() + ",hiredate='"
+ sdf.format(employee.getHiredate()) + "' where empno=" + employee.getEmpno();
// 4.处理执行结果
int i = stat.executeUpdate(sql);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 5.关闭资源
JdbcUtil.free(conn);
}
}
public static void deleteEmployee(int empno) {
Connection conn = null;
Statement stat = null;
// 1.注册驱动程序
try {
//2.获取连接
conn=JdbcUtil.getConnection();
// 3.创建执行语句,发送sql命令
stat = conn.createStatement();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String sql = "delete from emp where empno="+empno;
// 4.处理执行结果
int i = stat.executeUpdate(sql);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 5.关闭资源
JdbcUtil.free(conn);
}
}
}

这样看上去就比较清晰和明了,不用分割开来去看代码,只要调用到那个累才去照这个类的方法,这样就能够更加有利于检查和排错,维护的间接性的一个软件的奋斗的目标,虽然只是简单的优化,却能够减轻了我们写代码和维护的成本。

##总结
通过本次编码,对面向对象的编程的开发有更加清晰的了解,当然对重构和优化的重要性有更深的了解,在这个软件里我学会的不仅是代码的书写,还学会了代码的重构不仅需要不断的提炼,还需要对代码的细微的观察。

文章目录
  1. 1. jdbc的定义
  2. 2. 简单的增删改查
,