MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java對象)映射成數據庫中的記錄。
在介紹Mybatis之前需要先了解一下JDBC,才能更清楚Mybatis究竟幫我們做了什麼。
JDBC
JDBC(Java Database Connectivity,Java數據庫連接)是java中用來規範客戶端程序如何來訪問數據庫的應用程序接口,提供了諸如查詢和更新數據庫中數據的方法。
JDBC的層次結構
(jdbc是sun公司提供一套用於數據庫操作的接口,java程序員只需面向這套接口編程即可。不同數據庫廠商,需要針對這套接口,提供不同的實現。不同的實現的集合即爲不同數據庫的驅動)
jdbc接口(API)包括兩個層次:
面向應用的API:java API,抽象接口,供應用程序開發人員使用(連接數據庫,執行SQL語句,獲得結果)
面向數據庫的API:java Driver API,供開發商開發數據庫驅動使用。
JDBC程序編寫步驟
獲取數據庫連接
要素一:Driver接口實現類
Driver接口介紹
java.sql.Driver接口是所有JDBC驅動程序需要實現的接口。這個接口是提供給數據庫廠商使用的,不同數據庫廠商提供不同的實現。
在程序中不需要直接去訪問實現了Driver接口的類,而是由驅動程序管理類(java.sql.Driveranager)去調用這些Driver實現。
加載和註冊JDBC驅動
加載驅動:加載JDBC驅動需調用Class類的靜態方法forName(),向其傳遞要加載的JDBC驅動的類名。Class.forName("com.mysql.jdbc.Driver")
註冊驅動:DriverManager類是驅動程序管理類,負責管理驅動程序。使用DriverManager.registerDriver類的registerDriver()方法來註冊驅動了的實例,因爲Driver接口的驅動程序類都包含了靜態代碼塊,在這個靜態代碼塊中,會調用DriverManager.registerDriver()方法來註冊自身的一個實例。
要素二:URL
JDBC URL用於標誌一個被註冊的驅動程序,驅動程序管理器通過這個URL選擇正確的驅動程序,從而建立到數據庫的連接。
JDBC URL的標準由三部分組成,各部分用冒號分割(jdbc:子協議:子名稱)【jdbc:mysql://localhost:3306/test】
public Connection getConnection(){ //第一種 Driver driver = com.mysql.jdbc.Driver(); //第二種 //Class clazz = Class.forName("com.mysql.jdbc.Driver"); //Driver driver = (Driver)clazz.newInstance(); String url = "jdbc:mysql://localhost:3306/test"; Properties info = new Properties(); info.setProperty("user", "root"); info.setProperty("password", "123456"); Connection connection = driver.connect(url, info); return connextion; //第三種 //DriverManager.registerDriver(driver);//driver爲第二種中的driver //上面註冊可以不要,在Mysql的Driver實現類中,有一塊靜態代碼塊,已經實現了註冊 //return DriverManager.getConection(url, user, password);//獲取到連接 }
//第四種,將基本信息放在配置文件中 public Connection getConnection(){ //1.讀取配置文件中的4個基本信息 InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");//ClassLoader.getSystemClassLoader() Properties pros = new Properties(); pro.load(is); String user = pros.getProperty("user"); String password = pros.getProperty("password"); String url = pros.getProperty("url"); String driverClass = pros.getProperty("driverClass"); //2.加載驅動 Class.forName(driverClass); //3.獲取連接 return DriverManager.getConnection(url, user, password); } jdbc.properties user=root password=1234567 url=jdbc:mysql://localhost:3306/test driverClass=com.mysql.jdbc.Driver
使用PreparedStatement實現CRUD操作
操作和訪問數據庫
數據庫連接被用於向數據庫服務器發送命令和上去了語句,並接受數據庫服務器返回的結果,其實一個數據庫連接相當於一個socket連接。
在java.sql包中有3個接口分別定義了對數據庫的調用的不同方式:
Statement:用於執行靜態SQL語句並返回它所生成結果的對象。(弊端:需要拼寫Sql語句,可能存在Sql注入問題。)
PreparedStatement:SQL語句被預編譯並存儲在此對象中,可以使用此對象多次高效的執行該語句。
CallableStatement:用於執行SQL存儲過程。
public void testPreparedStatement(){ //獲取連接 Connection conn = getConnnection(); //預編譯sql語句,返回PreparedStatement實例 String sql = "insert into student(name,email) values (?,?)"; PreparedStatement ps = conn.preparedStatement(sql) ; //填充佔位符 ps.setString(1, "哪吒"); ps.setString(2, "[email protected]"); //執行操作 ps.execute(); conn.close(); ps.close(); }
public void testQuery() { Connection conn = getConnection(); String sql = "select * from student where id = ?"; PreparedStatement ps = conn.prepareStatement(sql); ResultSet resultSet = ps.executeQuery(); if(resultSet.next()){//判斷結果集中是否有數據,並指針下一 int id = resultSet.getInt(1); String name = resultSet(2) ; } }