JDBC
JDBC简介
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
JDBC的使用步骤
- 加载驱动
通过初始化驱动类com.mysql.jdbc.Driver,该类在mysql-connector-java的jar包中,故需要在工程中导入相应的jar包。
Class.forName("com.mysql.jdbc.Driver");
- 创建连接
创建连接需要的信息有:
a. 数据库所在的ip,本机为127.0.0.1或localhost,如果连接其他电脑上的数据库,则为那台电脑的相应ip;
b. 数据库的端口号, MySQL默认为3306,根据自己的设置来填;
c. 数据库名称,根据需要连接的数据库的名称填写,此处例子数据库名称为library;
d. 编码方式UTF-8;
e. 账号 root;
f. 密码,如果创建数据库的时候没有使用默认的账号和密码,需填写自己设置的账号和密码。
String url = "jdbc:mysql://localhost:3306/library"; //JDBC的URL
conn = DriverManager.getConnection(url, "root", "123456");
- 写SQL语句
根据需求写SQL语句。
String sql = "select * from book";
- 得到statement对象
此处分Statement和PrepareStatement两种。
选择PreparedStatement还是Statement取决于你要怎么使用它们。对于只执行一次的SQL语句最好选择Statement,而如果SQL语句被多次执行则选用PreparedStatement是最好的。
PreparedStatement的第一次执行消耗是很高的. 它的性能体现在后面的重复执行.
PreparedStatement pst = conn.prepareStatement(sql);
- 执行SQL,得到结果集
查询数据库时,返回的是一个二维的结果集,需要用ResultSet来遍历结果集,获取每一行的数据。
ResultSet rs = pst.executeQuery();
- 处理结果集
Resultset的第一行是空的,要用rs.next()到第一行才能进行读取。
ResultSet的几个方法:
next():遍历时,判断是否有下一个结果;
getString(int columnIndex):以java编程语言中String的形式获取此ResultSet对象的当前行中指定列的值;
getString(String columnLabel):以java编程语言中String的形式获取此ResultSet对象的当前行中指定列的值。
(当然此处不一定是getString,可能是getInt,getDouble等等,根据每一列的数据类型而定)
while (rs.next()) {
System.out.println(rs.getString("id") + " "
+ rs.getString("name") + " "
+ rs.getString("author") + " "
+ rs.getString("content") + " "
+ rs.getString("add_date"));
}
- 关闭资源
需要关闭负责执行SQL命令的PrepareStatement或Statement对象及Connection连接对象,如果是查询语句,则还需要关闭存储查询结果的ResultSet对象。
if (rs != null) {
try { //关闭存储查询结果的ResultSet对象
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if (pst != null) {
try { //关闭负责执行SQL命令的PrepareStatement对象
pst.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (conn != null) {
try { //将Connection连接对象关闭
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
MVC模式
MVC模式简介
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
View(视图) - 视图代表模型包含的数据的可视化。
Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
MVC模式的实现方法
model层
在一般的程序中就是对应的数据库表的实体类,即将现实对象抽象成类。
例如在数据库中有一张表存储的是用户的信息,包括电话号码、姓名、密码、性别、学校,对应的列如下:
public class User {
private String UTel; //电话号码
private String UName; //姓名
private String UPwd; //密码
private String USex; //性别
private String USchool; //学校
public User(String UTel, String UPwd, String USex, String USchool) {
this.UTel = UTel;
this.UPwd = UPwd;
this.USex = USex;
this.USchool = USchool;
}
public String getUTel() {
return UTel;
}
public void setUTel(String UTel) {
this.UTel = UTel;
}
public String getUName() {
return UName;
}
public void setUName(String UName) {
this.UName = UName;
}
public String getUPwd() {
return UPwd;
}
public void setUPwd(String UPwd) {
this.UPwd = UPwd;
}
public String getUSex() {
return USex;
}
public void setUSex(String USex) {
this.USex = USex;
}
public String getUSchool() {
return USchool;
}
public void setUSchool(String USchool) {
this.USchool = USchool;
}
@Override
public String toString() {
return "User{" +
"UTel='" + UTel + '\'' +
", UName='" + UName + '\'' +
", UPwd='" + UPwd + '\'' +
", USex='" + USex + '\'' +
", USchool='" + USchool + '\'' +
'}';
}
}
DAO层
dao层(data access object)叫数据访问层,处于比较底层,执行一些比较基础的操作,具体到对于某个表、某个实体的增删改查等。以下是DAO层里查询所有用户的方法的具体实现。
public List<User> selectAllUser() throws SQLException {
Connection conn = null;
PreparedStatement pst = null;
String sql = "select * from Users";
ResultSet rs = null;
List<User> users = new ArrayList<>(); //此处用了model里面的User类来保存结果集
try {
conn = JdbcUtils_JNDI.getConnection();
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
User user = null;
while (rs.next()) {
user = new User(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4));
users.add(user);
}
return users;
} catch (SQLException e) {
return null;
} finally {
JDBC_Util.Release(conn, pst, rs);
}
}
service层
Service层主要负责业务模块的逻辑应用设计。同样是首先设计接口,再设计其实现的类,接着再Spring的配置文件中配置其实现的关联。这样我们就可以在应用中调用Service接口来进行业务处理。Service层的业务实现,具体要调用到已定义的Dao层的接口,封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性,程序显得非常简洁。
以下是修改个人信息的service大致实现。
public String updateInfo(String UTel, String UName, String UPwd, String USex, String USchool) {
try {
UserDao userDao = new UserDao();
if (userDao.selectUser(UTel) == null) {
return "用户不存在";
} else {
userDao.updateName(UTel, UName);
userDao.updatePassword(UTel, UPwd);
userDao.updateUSex(UTel, USex);
userDao.updateUSchool(UTel, USchool);
return "修改成功";
}
} catch (SQLException e) {
return "访问数据库失败";
}
}
service和DAO是否需要设置接口的问题:
Service和DAO是否需要设置接口取决于具体实现是否需要多样化。如果一种DAO或一种Service只有一种实现,那么抽象出接口的意义不大。而一些大型应用或许需要DAO和Service的多种实现(比如帐户的DAO,可能需要一种Hibernate实现、一种CMP实现和一种JDO实现),为了向上一层隐藏具体实现类,需要采用接口。
view层
view即为视图。不难理解,view层就是用户可以看到的东西。view层不关心后台怎么处理,只关心如何向用户展示信息。View层与Controller层接口紧密,需要系统开发。
controller层
负责具体的业务模块流程的控制,在此层里要调用Service层的接口来控制业务流程。
Conroller层和Service层的区别:Controlle层负责具体的业务模块流程的控制;Service层负责业务模块的逻辑应用设计。
具体实现:针对具体的业务流程,会有不同的控制器,在具体的设计过程中可以将流程进行抽象归纳,设计出可以重复利用的子单元流程模块,这样不仅使得成句结构变得清晰,也大大减少了代码量。