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 |