为什么要用Mybatis框架---Mybatis学习笔记(一)

首先使用原生态的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();
                }
            }
        }
    }
}  

注意代码中导入的包如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; 

为什么导入的都是java.sql包中的接口?
原因: 这里使用mysql的jar包中实现了这些接口,如果以后更换了数据库oracle,oracle的数据库jar包也实现了这些接口。就不需要重新引入了。如果这里导入的是mysql的jar中的实现类的话,那么更换为oracle数据库之后,要重新导入oracle的jar的实现类。

上边的代码中的:

 PreparedStatement preparedStatement = null;

为什么要使用PreparedStatement而不使用Statement呢?
原因:preparedStatement是预编译的statement,
通过statement向数据库发送sql语句,然后数据库那边要对sql语句进行编译,编译完成之后把编译的结果存储到数据库端的缓存中。下次如果发送相同的sql语句的话,数据库就不需要编译了,直接将缓存中的结果取过来就可以了。这样提高了数据库的性能。

通过上边的原生版的jdbc发现的问题:

  1. 数据库连接在使用的时候就创建,使用完成之后就关闭。这就会对数据库进行频繁的连接开启和关闭,就会造成数据库的资源浪费,影响了数据库的性能。
    解决方案:使用数据库的连接池来管理数据库的连接
  2. 将sql语句硬编码(也就是把变量写死了)到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。
    解决方案:可以将sql语句配置在xml的配置文件中。这样即使sql语句变化了,也不需要对java代码进行重新编译
  3. 向preparedStatement中设置参数(preparedStatement.setString(1, "王五");),对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
    解决方案:将sql语句及占位符和参数全部配置到xml文件中
  4. 从resutSet中遍历结果集数据时(
 while(resultSet.next()){
      System.out.println(resultSet.getString("id")+"  "+resultSet.getString("username"));
 }

),
存在硬编码,将获取表的字段进行硬编码,不利于系统维护。
解决方案:将查询的结果集自动映射成java对象

你可能感兴趣的:(mybatis)