mybatis 笔记1 为什么需要mybatis
2017-08-16 16:58
288 查看
首先使用原生态的JDBC来操作数据库,从中发现存在的一些问题:
jdbc代码:public class JdbcTest { public static void main(String[] args) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { //加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); //通过驱动管理类获取数据库链接 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "123"); //定义sql语句 ?表示占位符 String sql = "select * from user where username = ?"; //获取预处理statement preparedStatement = connection.prepareStatement(sql); //设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值 preparedStatement.setString(1, "王五"); //向数据库发出sql执行查询,查询出结果集 resultSet = preparedStatement.executeQuery(); //遍历查询结果集 while(resultSet.next()){ System.out.println(resultSet.getString("id")+" "+resultSet.getString("username")); } } catch (Exception e) { e.printStackTrace(); }finally{ //释放资源 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(); } } } } }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
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
注意代码中导入的包如下:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;1
2
3
4
5
1
2
3
4
5
为什么导入的都是Java.sql包中的接口?
原因: 这里使用MySQL的jar包中实现了这些接口,如果以后更换了数据库Oracle,oracle的数据库jar包也实现了这些接口。就不需要重新引入了。如果这里导入的是mysql的jar中的实现类的话,那么更换为oracle数据库之后,要重新导入oracle的jar的实现类。
上边的代码中的:
PreparedStatement preparedStatement = null;1
1
为什么要使用PreparedStatement而不使用Statement呢?
原因:preparedStatement是预编译的statement,
通过statement向数据库发送sql语句,然后数据库那边要对sql语句进行编译,编译完成之后把编译的结果存储到数据库端的缓存中。下次如果发送相同的sql语句的话,数据库就不需要编译了,直接将缓存中的结果取过来就可以了。这样提高了数据库的性能。
通过上边的原生版的jdbc发现的问题:
数据库连接在使用的时候就创建,使用完成之后就关闭。这就会对数据库进行频繁的连接开启和关闭,就会造成数据库的资源浪费,影响了数据库的性能。 解决方案:使用数据库的连接池来管理数据库的连接
将sql语句硬编码(也就是把变量写死了)到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。
解决方案:可以将sql语句配置在xml的配置文件中。这样即使sql语句变化了,也不需要对java代码进行重新编译
向preparedStatement中设置参数(
preparedStatement.setString(1, "王五");),对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
解决方案:将sql语句及占位符和参数全部配置到xml文件中
从resutSet中遍历结果集数据时(
while(resultSet.next()){ System.out.println(resultSet.getString("id")+" "+resultSet.getString("username")); }1
2
3
1
2
3
),
存在硬编码,将获取表的字段进行硬编码,不利于系统维护。
解决方案:将查询的结果集自动映射成java对象
相关文章推荐
- 《Thinking in UML》 笔记——1、为什么需要UML
- [笔记].为什么键盘一般需要拉低有效呢?
- 为什么要用Mybatis框架---Mybatis学习笔记(一)
- MyBatis 为什么需要通用 Mapper ?
- Python学习笔记--为什么需要使用__name__=='__main__'
- ucOS学习笔记(1)——为什么需要操作系统
- HTML5笔记(2) - 为什么需要HTML5
- mybatis逆向工程的Example类用法==笔记==【单表操作只需调用,多表查询需要自定义sql+mapper接口方法(待补全)】
- Python3学习笔记(二):编码为什么python2升级到python3时就遇到需要再加.encode()
- 自动垃圾回收学习笔记-我们为什么需要自动垃圾回收
- 为什么需要MiniDao? 新持久层 3.5.1 版本发布,让hibernate跟mybatis一样灵活
- 为什么需要MiniDao? 新持久层 3.5.1 版本发布,让hibernate跟mybatis一样灵活
- 从JDBC程序看为什么需要Mybatis
- webpack学习笔记-0-为什么需要webpack
- Kafka是什么,JMS是什么,常见的类JMS消息服务器,为什么需要消息队列(来自学习笔记)
- 【Thinking in Java笔记】为什么需要内部类
- LeetCode 笔记系列11 First Missing Positive [为什么我们需要insight]
- Hinton Neural Network课程笔记1a:为什么需要机器学习?
- 内部类_为什么需要内部类 1.闭包与回调(笔记)
- 为什么每个请求都要有用户名密码呢,那不是每次都要查询一下了,token,表示这个用户已经验证通过了,在token有效期内,只需要判断token是否有效就可以了