標籤:

Mybatis1:基礎

JDBC處理Mysql數據

在介紹Mybatis前,我們先回顧一下jdbc處理Mysql數據的原始操作

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", "6476282"); //定義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(); } } } }

上面這是jdbc通過在java中的實現。我們可以發現有這麼一些問題。

缺陷:

1、資料庫連接,使用時就創建,不使用立即釋放,對資料庫進行頻繁連接開啟和關閉,造成資料庫資源浪費,影響 資料庫性能。

設想:使用資料庫連接池管理資料庫連接。

2、將sql語句硬編碼到java代碼中,如果sql 語句修改,需要重新編譯java代碼,不利於系統維護。

設想:將sql語句配置在xml配置文件中,即使sql變化,不需要對java代碼進行重新編譯。

3、向preparedStatement中設置參數,對佔位符號位置和設置參數值,硬編碼在java代碼中,不利於系統維護。

設想:將sql語句及佔位符號和參數全部配置在xml中。

4、從resutSet中遍歷結果集數據時,存在硬編碼,將獲取表的欄位進行硬編碼,,不利於系統維護。

設想:將查詢的結果集,自動映射成java對象。

---------------------------------------------------------------------------------------------------------------------------

Mybaits框架結構

---------------------------------------------------------------------------------------------------------------------------

環境搭建

導入基本的jar包,建立全局配置文件SqlMapConfig.xml

在SqlMapConfig.xml中配置mybatis的運行環境,數據源、事務等。

(前期配置,整合spring之後將不使用該配置方法)

---------------------------------------------------------------------------------------------------------------------------

入門程序:實現根據用戶id(主鍵)查詢用戶信息

創建po包下User類(persistent object 持久化對象)

package cn.itcast.mysql.po;public class User { private int id; private String username;// 用戶姓名 private String sex;// 性別 private Date birthday;// 生日 private String address;// 地址 /** get()/set()方法 **/}

在Config文件下sqlmap包下創建映射文件

映射文件命名:

User.xml(原始ibatis命名),mapper代理開發映射文件名稱叫XXXMapper.xml,比如:UserMapper.xml、ItemsMapper.xml

在映射文件中配置sql語句。

即User.xml

在SqlMapConfig.xml中配置映射文件

<!--載入映射文件 --> <mappers> <mapper resource="sqlMap/User.xml"/> </mappers>

在Java代碼中實現(跟著流程圖走)

public void findUserByid() throws IOException{ //mybatis配置文件 String resource="SqlMapConfig.xml"; //得到配置文件的輸入流 InputStream is=Resources.getResourceAsStream(resource); //創造會話工廠 SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is); //通過工廠得到SqlSession SqlSession sqlsession=sqlSessionFactory.openSession(); //通過SqlSession操作資料庫 //第一個參數:映射文件statement的id,寫法:namespace+"."+statement的id //第二個參數:parameter,即對應映射文件中的輸入類型parameterType="int" //返回User對象 User user=sqlsession.selectOne("test.findUserById", 1); System.out.println(user); //釋放資源 sqlsession.close(); }

---------------------------------------------------------------------------------------------------------------------------

入門程序:根據用戶名稱模糊查詢用戶信息

同上面的步驟,創建 User類。

配置User.xml映射文件

在SqlMapConfig.xml中配置映射文件

<!--載入映射文件 --> <mappers> <mapper resource="sqlMap/User.xml"/> </mappers>

Java程序調用

public void findUserByName() throws IOException{ //得到輸入流 String resource="SqlMapConfig.xml"; InputStream is=Resources.getResourceAsStream(resource); //創造會話工廠 SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is); //通過工廠得到sqlSession SqlSession sqlSession=sqlSessionFactory.openSession(); //得到多條數據,參數同上 List<User> list=sqlSession.selectList("test.findUserByName", "小明"); System.out.println(list); //關閉資源 sqlSession.close(); }

---------------------------------------------------------------------------------------------------------------------------

添加用戶

配置User.xml中的statement,

剩餘步驟同上,配置SqlMapConfig,在Java代碼中獲取SqlSessionFactory,獲取SqlSeesion對象,進行插入操作

//創建User對象 User user=new User(); user.setSex("1"); user.setUsername("wangwu"); //插入 sqlSession.insert("test.insertUser",user); //開啟事務,結合Spring之後就不用手動提交了 sqlSession.commit();

---------------------------------------------------------------------------------------------------------------------------

返回自增主鍵

需要在User.xml中配置相關信息。

mysql自增主鍵,執行insert提交之前自動生成一個自增主鍵。

通過mysql函數獲取到剛插入記錄的自增主鍵:

LAST_INSERT_ID()

是insert之後調用此函數。

---------------------------------------------------------------------------------------------------------------------------

非自增主鍵返回(使用uuid())

使用mysql的uuid()函數生成主鍵,需要修改表中id欄位類型為string,長度設置成35位。

執行思路:

先通過uuid()查詢到主鍵,將主鍵輸入 到sql語句中。

執行uuid()語句順序相對於insert語句之前執行。

---------------------------------------------------------------------------------------------------------------------------

用戶刪除

Java代碼:

---------------------------------------------------------------------------------------------------------------------------

用戶更新

Java代碼:

---------------------------------------------------------------------------------------------------------------------------

小結:

parameterType

在映射文件中通過parameterType指定輸入 參數的類型。

resultType

在映射文件中通過resultType指定輸出結果的類型。

#{}和${}

#{}表示一個佔位符號,#{}接收輸入參數,類型可以是簡單類型,pojo、hashmap。

如果接收簡單類型,#{}中可以寫成value或其它名稱。

#{}接收pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性.屬性.屬性...的方式獲取對象屬性值。

${}表示一個拼接符號,會引用sql注入,所以不建議使用${}。

${}接收輸入參數,類型可以是簡單類型,pojo、hashmap。

如果接收簡單類型,${}中只能寫成value。

${}接收pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性.屬性.屬性...的方式獲取對象屬性值。

selectOne和selectList

selectOne表示查詢出一條記錄進行映射。如果使用selectOne可以實現使用selectList也可以實現(list中只有一個對象)。

selectList表示查詢出一個列表(多條記錄)進行映射。如果使用selectList查詢多條記錄,不能使用selectOne。

推薦閱讀:

我的產品開發之旅 - SSM框架升級API平台(Spring + SpringMVC + MyBatis)
spring mybatis每次訪問資料庫都要創建資料庫鏈接?
如何在mybatis中調試查看生成的sql語句?

TAG:MyBatis |