簡單的梳理一下咱們使用 JDBC 的流程:① 引入相關數據庫驅動 Jar 包 ② 建立一個數據庫鏈接類java
在這個類中包括:數據庫驅動的加載、數據庫鏈接的配置、鏈接對象的獲取、以及釋放關閉,以及具體的SQL以及其執行語句,下面是一個mysql
下面代碼是 JDBC最原始的方式,沒有通過任何優化和封裝,功能是查詢student表中的全部記錄spring
package cn.ideal.jdbc; import cn.ideal.domain.Student; import java.sql.*; public class JdbcDemo { public static void main(String[] args) { Connection connection = null; Statement statement = null; ResultSet resultSet = null; try { //註冊驅動 Class.forName("com.mysql.jdbc.Driver"); //獲取與數據庫的鏈接對象 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root99"); //定義sql語句 String sql = "SELECT * FROM student"; //獲取執行sql語句的對象statement statement = connection.createStatement(); //執行sql語句,獲取結果集 resultSet = statement.executeQuery(sql); //遍歷獲取到的結果集 while (resultSet.next()) { int id = resultSet.getInt(1); String name = resultSet.getString(2); Double score = resultSet.getDouble(3); Student student = new Student(); student.setId(id); student.setName(name); student.setScore(score); System.out.println(student.toString()); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { //釋放資源,後調用的先釋放 if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
經過這段代碼咱們能夠分析到:sql
① 代碼中,數據庫驅動名稱、連接地址、帳號密碼等,所有被寫死到程序中,也就是說當你須要修改某些值時,你必需要修改源代碼,這也就是咱們所謂的 「硬編碼」數據庫
這段代碼是使用了 preparedStatement 預處理對象進行替代其父類 Statement 對象,這也是咱們只考慮原始 JDBC 狀況下 通常會選用的,那麼它又有什麼問題呢?apache
//定義sql String sql = "SELECT * FROM user WHERE username = ? AND password = ?"; //獲取執行sql的對象 preparedStatement = connection.prepareStatement(sql); //給?賦值 preparedStatement.setString(1, username); preparedStatement.setString(2, password); //執行查詢 resultSet = preparedStatement.executeQuery();
還有一種狀況是這樣的:服務器
//遍歷獲取到的結果集 while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); Double score = resultSet.getDouble("score"); Student student = new Student(); student.setId(id); student.setName(name); student.setScore(score); }
getInt
等這種方法,參數爲字段名,當數據庫對應表字段出現改變時,源代碼再一次須要被修改以前咱們必定程度上的便捷咱們的開發,可能有使用過 Spring 的 JdbcTemplate 或者 Apache 的 DBUtils ,它們都是對 JDBC 的簡單封裝,只能算做工具類,不能算做一個完整的框架, 而咱們下面要講的 Mybatis 則是一個可能解決這些問題的框架微信
MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎全部的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java對象)映射成數據庫中的記錄 ——百度百科
一、MyBatis 能夠將 sql 語句配置在 XML 中,這樣解決了 sql 語句寫在 Java類中的 "硬編碼" 問題mybatis
二、經過輸入參數映射機制,將參數靈活的配置起來,解決了在 Java 類中手工配置的問題app
三、經過輸出映射機制, 結果集的檢索自動映射成相應的 Java對象,避免了 JDBC 中對結果集的手工檢索
四、這種映射機制實際上使用了 ORM 的思想
打開 IDEA ,建立一個 Maven 項目,以下圖所示
修改 GroupId 和 ArtifactId 的值
GroupID是項目組織惟一的標識符,實際對應JAVA的包的結構,是main目錄裏java的目錄結構
設置其地址
選擇打包方式爲 jar包: <packaging>jar</packaging>
下面咱們導入了 mybatis、mysql、log4j (日誌)、junit (單元測試) 的依賴
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.ideal</groupId> <artifactId>code_01_EnvironmentSetup</artifactId> <version>1.0-SNAPSHOT</version> <!-- 打包方式 --> <packaging>jar</packaging> <!-- 對應依賴 --> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> </dependencies> </project>
package cn.ideal.domain; import java.io.Serializable; import java.util.Date; public class User implements Serializable { private Integer id; private String username; private Integer telephone; private Date birthday; private String gender; private String address; ...爲節省長度,省略其對應 get set方法,請你們自行補充 @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", telephone=" + telephone + ", birthday=" + birthday + ", gender='" + gender + '\'' + ", address='" + address + '\'' + '}'; } }
mapper 與咱們以前學習的 dao 的意義是一致的,只是名稱上的不一樣,對應的 mapper 寫爲 dao 也是能夠的
package cn.ideal.mapper; import cn.ideal.domain.User; import java.util.List; public interface UserMapper { /** * 查詢全部用戶信息 * @return */ List<User> findAllUserInfo(); }
在resources下建立一個名爲 SqlMapConfig.xml 的文件,這也就是咱們的主配置文件
而數據庫鏈接池的配置,是配置環境中重要的一點
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
接下來就是配置正文,
<environments></environments>
標籤中的 default 值與 <environment></<environment>
中的 id 值務必保持一致<transactionManager></transactionManager>
配置 Mybatis 的事務控制類型<dataSource></<dataSource>
配置數據庫鏈接信息
<property></property>
配置具體的值<mappers></mappers>
標籤中指定了映射配置文件的位置,也就是說咱們 SQL相關的語句都在這個指定的配置文件中,而這裏咱們指定了它的路徑詳細代碼:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!-- mybatis 主配置文件 --> <configuration> <!-- 配置環境,和spring整合後 environments配置將會被廢除 --> <environments default="development"> <environment id="development"> <!-- 使用JDBC事務管理 --> <transactionManager type="JDBC"></transactionManager> <!-- 數據庫鏈接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/ideal_mybatis"/> <property name="username" value="root"/> <property name="password" value="=root99r"/> </dataSource> </environment> </environments> <!-- 指定映射配置文件的位置 --> <mappers> <mapper resource="cn.ideal.dao/UserMapper.xml"/> </mappers> </configuration>
爲了解決 原生 JDBC 的一些不足,在 MyBatis 中,SQL語句不會直接出如今 Java類中,它將幾乎全部的 SQL 語句放在 配置文件中,他會在適當的狀況下,加載這個配置文件,完成必定的操做
首先仍然是,xml的版本和編碼格式,而後引入DTD約束
而後在 <mapper></mapper>
標籤中編寫咱們具體的配置
在<mapper></mapper>
標籤中建立一個 <select></select>
標籤 其中 屬性 id 的值爲mapper接口的方法名
parameterType、parameterMap、resultType、resultClass、resultMap
分別表明<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.ideal.mapper.UserMapper"> <select id="findAllUserInfo" resultType="cn.ideal.domain.User"> select * from user </select> </mapper>
到這裏Mybatis的簡單認識以及環境的搭建就說完了,篇幅問題,關於Mybatis 分紅幾篇來說,感謝你們的支持
若是文章中有什麼不足,或者錯誤的地方,歡迎你們留言分享想法,感謝朋友們的支持!
若是能幫到你的話,那就來關注我吧!若是您更喜歡微信文章的閱讀方式,能夠關注個人公衆號
在這裏的咱們素不相識,卻都在爲了本身的夢而努力 ❤一個堅持推送原創開發技術文章的公衆號:理想二旬不止