一、代码和数据库连接的原理
一般正常情况下,数据库是一个单独的服务,其中你设计的代码工程也是一个服务工程,工程和数据库都是一个单独的一个服务,其中服务之间可以在同一台服务器上,也可以在不同的服务器上,他们之间通过网络通信协议来进行通信,各种不同的数据库的通信协议都不同的,其中mysql的默认端口是3306,其中通过网络通信协议有多种。
TCP/IP协议 通常我们通过来连接MySQL,各种主要编程语言都是根据这个协议实现了连接模块 Unix Socket协议 通常我们登入MySQL服务器中使用这个协议,因为要使用这个协议连接MySQL需要一个物理文件,文件的存放位置在配置文件中有定义,值得一提的是,这是所有协议中最高效的一个. Share Memory协议 这个协议一般人不知道,肯定也没用过,因为这个只有windows可以使用,使用这个协议需要在配置文件中在启动的时候使用–shared-memory参数,注意的是,使用此协议,一个host上只能有一个server,所以这个东西一般没啥用的,除非你怀疑其他协议不能正常工作,实际上微软的SQL Sever也支持这个协议 Named Pipes协议 这个协议也是只有windows才可以用,同shared memory一样,使用此协议,一个host上依然只能有一个server,即使是使用不同的端口也不行,Named Pipes 是为局域网而开发的协议。内存的一部分被某个进程用来向另一个进程传递信息,因此一个进程的输出就是另一个进程的输入。第二个进程可以是本地的(与第一个进程位于同一台计算机上),也可以是远程的(位于联网的计算机上)。正因为如此,假如你的环境中没有或者禁用TCP/IP环境,而且是windows服务器,那么好歹你的数据库还能工作。使用这个协议需要在启动的时候添加–enable-named-pipe选项 |
我们可以把工程和数据库的连接用下面的图形进行描述
二、在数据库连接的发展历史和解决方案
1)原始的jdbc方法来连接数据
其中从代码到数据库的过程之间数据库的连接到数据的传输的流程如下:
|
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//1、加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2、通过驱动管理类获取数据库链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "root");
//3、定义sql语句 ?表示占位符
String sql = "select * from user where username = ?";
//4、获取预处理statement
preparedStatement = connection.prepareStatement(sql);
//5、设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "王五");
//6、向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
//7、遍历查询结果集
while(resultSet.next()){
System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//8、释放资源
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
其中使用原始的jdbc来进行数据库的处理的特点:
总结:网络之间的连接频繁的创建和销毁造成资源的浪费;就是传输数据和反悔数据都会造成硬编码。 |
2)使用dbutil来进行数据库的连接
针对jdbc的问题,dbutil提出的解决方案:
3)使用全自动ORM框架来进行数据库连接hibernate
参考本号的hibernate的相关文章。
4)使用半自动ORM框架来进行数据库连接mybatis
参考mybatis的使用系列教程