您的位置:首页 > 运维架构 > 网站架构

MyBatis的架构和执行的流程,解决jdbc的一些问题

2017-01-08 20:36 429 查看


Mybatis架构



1、  mybatis配置

SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。

mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

2、  通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

3、  由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

4、  mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

5、  Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。

6、  Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

7、  Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。


1.从一个jdbc程序开始

1 public static void main(String[] args) {
2             Connection connection = null;
3             PreparedStatement preparedStatement = null;
4             ResultSet resultSet = null;
5
6             try {
7                 //加载数据库驱动
8                 Class.forName("com.mysql.jdbc.Driver");
9
10                 //通过驱动管理类获取数据库链接
11                 connection =  DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "mysql");
12                 //定义sql语句 ?表示占位符
13             String sql = "select * from user where username = ?";
14                 //获取预处理statement
15                 preparedStatement = connection.prepareStatement(sql);
16                 //设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
17                 preparedStatement.setString(1, "王五");
18                 //向数据库发出sql执行查询,查询出结果集
19                 resultSet =  preparedStatement.executeQuery();
20                 //遍历查询结果集
21                 while(resultSet.next()){
22                     System.out.println(resultSet.getString("id")+"  "+resultSet.getString("username"));
23                 }
24             } catch (Exception e) {
25                 e.printStackTrace();
26             }finally{
27                 //释放资源
28                 if(resultSet!=null){
29                     try {
30                         resultSet.close();
31                     } catch (SQLException e) {
32                         // TODO Auto-generated catch block
33                         e.printStackTrace();
34                     }
35                 }
36                 if(preparedStatement!=null){
37                     try {
38                         preparedStatement.close();
39                     } catch (SQLException e) {
40                         // TODO Auto-generated catch block
41                         e.printStackTrace();
42                     }
43                 }
44                 if(connection!=null){
45                     try {
46                         connection.close();
47                     } catch (SQLException e) {
48                         // TODO Auto-generated catch block
49                         e.printStackTrace();
50                     }
51                 }
52
53             }
54
55         }


上边使用jdbc的原始方法(未经封装)实现了查询数据库表记录的操作。


jdbc操作步骤总结如下:

1、  加载数据库驱动

2、  创建并获取数据库链接

3、  创建jdbc statement对象

4、  设置sql语句

5、  设置sql语句中的参数(使用preparedStatement)

6、  通过statement执行sql并获取结果

7、  对sql执行结果进行解析处理

8、  释放资源(resultSet、preparedstatement、connection)


jdbc问题总结如下:

1、  数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

2、  Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

3、  向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

4、  对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: