Mybatis的一些概念說明

[TOC]

SqlSource 說明

SqlSource四種接口實現(xiàn)類的區(qū)別如下:

DynamicSqlSource:動態(tài)SQL語句,包含動態(tài)SQL節(jié)點或者含有‘${}’占位符的語句

RawSqlSource原生SQL語句。指非動態(tài)語句,語句中可能含有‘#{}’占位符,但不含有動態(tài)SQL節(jié)點,也不含有 '${}'占位符

StaticSqlSource靜態(tài)語句。語句中可能含有‘?’,可以直接提交給數(shù)據(jù)庫執(zhí)行

ProviderSqlSource上面的幾種都是通過XML文件獲取到的SQL語句。而 providerSqlSource 是通過注解獲取到的SQL語句

轉(zhuǎn)換過程

ProviderSqlSource---》BynamicSouceRawSqlSource----〉StaticSqlSource

Statement說明

Statement 有一個子接口 PreparedStatementPreparedStatement 也有一個子接口 CallableStatement

這三個依次對應(yīng)設(shè)置SQL語句時的簡單語句、預(yù)編譯語句、存儲過程語句

PreparedStatementStatement 的基礎(chǔ)上,增加了一些 set 方法,能夠按照參數(shù)位置對參數(shù)進行賦值。

CallableStatement則在 PreparedStatement 的基礎(chǔ)上進一步增加了方法。主要分為一下四類:

  • 按照參數(shù)名稱賦值方法:這一類方法能夠為存儲過程中指定名稱的參數(shù)賦值。如setInt(String , int)
  • 注冊輸出參數(shù)方法方法:這一類方法能夠向存儲過程注冊輸出函數(shù)。registerOuterParameter(int, int)
  • 按照參數(shù)位置讀取方法:這一類方法能夠讀取存儲過程中指定位置的參數(shù)值。例如:getInt(int)
  • 按照參數(shù)名稱讀取值方法:這一類方法能夠讀取存儲過程中指定名稱的參數(shù)的值。例如:getInt(string)

Executor 的實現(xiàn)類區(qū)別

  • CLosedExecutor:一個僅能表征自身已經(jīng)關(guān)閉的執(zhí)行器,沒有實際的功能。
  • SimpleExecutor:一個最為簡單的執(zhí)行器
  • BatchExecutor:支持批量執(zhí)行功能的執(zhí)行器
  • ReuseExecutor:支持 statement 對象復(fù)用的執(zhí)行器

Java.sql包和javax.sql包

java.sql

被稱為 JDBC 核心API包,完成一次數(shù)據(jù)庫操作的步驟如下:

  1. 建立 DriverManager 對象
  2. DriverManager 對象中獲取 Connection 對象
  3. Connection 對象中獲取 Statement 對象
  4. 將SQL語句交給 Statement 對象執(zhí)行,并獲取返回結(jié)果,結(jié)果通常放在 ResultSet

javax.sql

被稱為 JDBC 核心擴展包,它擴展了JDBC 核心包的功能,提供了對于服務(wù)端的支持,是Java企業(yè)版的重要部分

javax.sql 擴展了JDBC 核心包的功能,建議使用 DataSource 來獲取 Connection 對象而不是直接使用DriverManager對象。

  1. 建立DataSource對象
  2. DataSource對象中獲取Connection對象

Connection對象中獲取Statement對象

  1. 將SQL語句交給 Statement 對象執(zhí)行,并獲取返回結(jié)果,結(jié)果通常放在 ResultSet

Mybatis 操作數(shù)據(jù)與傳統(tǒng)方式示例

Mybatis操作數(shù)據(jù)

public class Test {

    public static void main(String[] args) throws IOException {
        //聲明配置文件地址
        String resource = "mybatis-config.xml";
        //得到輸入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //創(chuàng)建sql會話工廠
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //打開sql會話
        SqlSession session = sqlSessionFactory.openSession();
        //獲取查詢結(jié)果
        List<User> lu = session.selectList("listUser");
        for (User u : lu) {
            System.out.println(u.getUser_name());
            System.out.println(u.getUser_id());
            System.out.println(u.getUser_phone());
            System.out.println("------------------------");
        }
    }
}

傳統(tǒng)JDBC操作數(shù)據(jù):

public class JdbcTest {

    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            // 加載mysql數(shù)據(jù)庫驅(qū)動
            Class.forName("com.mysql.jdbc.Driver");
            // 獲取數(shù)據(jù)庫連接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEncoding=utf-8", "root", "");
            // sql語句
            String sql = "select * from user where userName = ?";
            // 預(yù)處理statement
            preparedStatement = connection.prepareStatement(sql);
            // 設(shè)置參數(shù),針對sql中占位符中
            preparedStatement.setString(1, "Tony");
            // 發(fā)起查詢
            resultSet = preparedStatement.executeQuery();
            User user = new User();
            // 遍歷查詢結(jié)果集
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String userName = resultSet.getString("userName");
                int userAge = resultSet.getInt("userAge");
                int sex = resultSet.getInt("sex");
                String userAddress = resultSet.getString("userAddress");
                // 封裝結(jié)果為User對象
                user.setId(id);
                user.setUserName(userName);
                user.setSex(sex);
                user.setUserAge(userAge);
                user.setUserAddress(userAddress);
            }
            System.out.println(user);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 釋放資源
                if (resultSet != null) {
                    resultSet.close();
                }
                if (preparedStatement != null) {
                    preparedStatement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容