框架第十六天

mybatis框架
MyBatis是一個(gè)數(shù)據(jù)持久層(ORM)框架活烙。把實(shí)體類和SQL語句之間建立了映射關(guān)系弹灭,是一種半自動(dòng)化的ORM實(shí)現(xiàn)
MyBatis 本是apache的一個(gè)開源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache software foundation 遷移到了google code污茵,并且改名為MyBatis 。MyBatis是一個(gè)基于Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatis 使用簡單的 XML或注解用于配置和原始映射紧阔,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數(shù)據(jù)庫中的記錄续担。

mybatis的優(yōu)點(diǎn):
1.基于SQL語法擅耽,簡單易學(xué)。
2.能了解底層組裝過程物遇。
3.SQL語句封裝在配置文件中乖仇,便于統(tǒng)一管理與維護(hù),降低了程序的耦合度询兴。
4.程序調(diào)試方便乃沙。

hibernate、MyBatis蕉朵、JDBC區(qū)別:
1)從層次上看崔涂,JDBC是較底層的持久層操作方式,而Hibernate和MyBatis都是在JDBC的基礎(chǔ)上進(jìn)行了封裝使其更加方便程序員對持久層的操作始衅。

2)從功能上看冷蚂,JDBC就是簡單的建立數(shù)據(jù)庫連接,然后創(chuàng)建statement汛闸,將sql語句傳給statement去執(zhí)行蝙茶,如果是有返回結(jié)果的查詢語句,會(huì)將查詢結(jié)果放到ResultSet對象中诸老,通過對ResultSet對象的遍歷操作來獲取數(shù)據(jù)隆夯;Hibernate是將數(shù)據(jù)庫中的數(shù)據(jù)表映射為持久層的Java對象,實(shí)現(xiàn)數(shù)據(jù)表的完整性控制别伏;MyBatis是將sql語句中的輸入?yún)?shù)和輸出參數(shù)映射為java對象蹄衷,放棄了對數(shù)據(jù)表的完整性控制,但是獲得了更靈活和響應(yīng)性能更快的優(yōu)勢厘肮。

3)從使用上看愧口,如果進(jìn)行底層編程,而且對性能要求極高的話类茂,應(yīng)該采用JDBC的方式耍属;如果要對數(shù)據(jù)庫進(jìn)行完整性控制的話建議使用Hibernate;如果要靈活使用sql語句的話建議采用MyBatis框架巩检。

hibernate厚骗、MyBatis區(qū)別:
MyBatis
1、是一個(gè)SQL語句映射的框架(工具)
2兢哭、注重POJO與SQL之間的映射關(guān)系领舰。不會(huì)為程序員在運(yùn)行期自動(dòng)生成 SQL
3、自動(dòng)化程度低、手工映射SQL,靈活程度高.
4提揍、需要開發(fā)人員熟煉掌據(jù)SQL語句
Hibernate
1啤月、主流的ORM框架、提供了從 POJO 到數(shù)據(jù)庫表的全套映射機(jī)制
2劳跃、會(huì)自動(dòng)生成全套SQL語句谎仲。
3、因?yàn)樽詣?dòng)化程度高刨仑、映射配置復(fù)雜郑诺,api也相對復(fù)雜,靈活性低.
4杉武、開發(fā)人同不必關(guān)注SQL底層語句開發(fā)

mybatis開發(fā)步驟:
1辙诞、創(chuàng)建一個(gè)java工程或web工程(整合)
2、導(dǎo)入mybatis對應(yīng)的jar文件
3轻抱、開發(fā)并配置mybatis-config.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">
<configuration>
    <!-- 配置mysql數(shù)據(jù)庫的連接環(huán)境 -->
    <environments default="development">  <!-- 環(huán)境  -->
        <environment id="development"><!-- 環(huán)境變量  -->
            <transactionManager type="JDBC"/><!-- 事務(wù)管理器  -->
            <dataSource type="POOLED"><!-- 數(shù)據(jù)源  -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/stu?useUnicode=true&characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers><!--  映射器 -->
        <mapper resource=""/>
    </mappers>
</configuration>
4飞涂、開發(fā)和表中的字段一致的bean 對象
5、開發(fā)接口
6祈搜、開發(fā)SQL映射文件
7较店、測試

下面就是具體的開發(fā)步驟:
1、創(chuàng)建一個(gè)java工程或web工程(整合)
2容燕、導(dǎo)入mybatis對應(yīng)的jar文件
如果不是整合就用兩個(gè)jar包就行了梁呈,如果要整合ssm就需要再加一個(gè)jar包如圖箭頭所示


mybatis的jar包.png

3、開發(fā)并配置mybatis-config.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">
<configuration>
<!-- 配置mysql數(shù)據(jù)庫的連接環(huán)境 -->
<environments default="development">  <!-- 環(huán)境  -->
<environment id="development"><!-- 環(huán)境變量  -->
<transactionManager type="JDBC"/><!-- 事務(wù)管理器  -->
<dataSource type="POOLED"><!-- 數(shù)據(jù)源  -->
<property name="driver" value="com.mysql.jdbc.Driver"/><!-- 驅(qū)動(dòng) -->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/stu?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="huayu123"/>
</dataSource>
</environment>
</environments>
<mappers><!--  映射文件-->
<mapper resource="com/hw/mapper/studentDaoMapper.xml"/>
</mappers>
</configuration>

4蘸秘、開發(fā)和表中的字段一致的bean 對象


entity類.png

{entity類.png

5官卡、開發(fā)接口

package com.hw.dao;

import java.util.List;

import com.hw.entity.Student;
public interface StudentDao {
    public void addStudent(Student stu);//添加
    public void updateStudent(Student stu);//修改
    public void delStudent(int id);//刪除學(xué)生
    public Student getStudent(int id);//由id獲取單個(gè)用戶
    public int getCount();//統(tǒng)計(jì)總計(jì)錄數(shù)
    public List<Student> listAll();//查詢所有
    public List<Student> listPage(int currentPage,int pageSize);//查詢所有且有分頁
    public List<Student> listLikeAll(String name);//模糊查詢指定名
    public List<Student> listLikePage(int currentPage,int pageSize,String name);///模糊查詢指定名且有分頁
    public int getLikeCount(String name);//統(tǒng)計(jì)模糊查詢總計(jì)錄數(shù)
}

6、開發(fā)SQL映射文件(原來的實(shí)現(xiàn)類impl用映射文件代替了)

<?xml version="1.0" encoding="UTF-8"?><!-- 相當(dāng)于實(shí)現(xiàn)impl -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hw.dao.StudentDao"><!-- namespace="qq"如果和spring整合時(shí)要用接口全類名 不整合無所謂 -->
<resultMap type="com.hw.entity.Student" id="stuinfo"><!-- id="stuinfo"如果不用resultMap則不寫 -->
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="money" property="money"/>
<result column="jobtime" property="jobtime" javaType="java.sql.Date" jdbcType="DATE"/>
</resultMap>
<!-- id="listAll"  id要取接口的方法名   這樣代碼結(jié)構(gòu)清晰 比較規(guī)范 不混亂-->
<select id="listAll"  resultMap="stuinfo">
select * from stu
</select>
<!-- resultType返回結(jié)果類型 -->
<select id="getCount" resultType="int">
select count(id) from stu
<!-- resultMap返回map集合 -->
</select>
<select id="listLikeAll" resultMap="stuinfo" parameterType="string">
<!-- select * from stu where name like '%${value}%' -->
select * from stu where name like #{name}
</select>
<!-- parameterType參數(shù)類型 -->
<insert id="addStudent" parameterType="com.hw.entity.Student">
<!-- #{money}解析成"money" -->
insert into stu values(null,#{name},#{money},#{jobtime})
</insert>
<delete id="delStudent" parameterType="int">
delete from stu where id=#{id}
</delete>
<update id="updateStudent" parameterType="com.hw.entity.Student">
update stu set name=#{name},money=#{money},jobtime=#{jobtime} where id=#{id}
</update>
<select id="getStudent" resultMap="stuinfo">
select * from stu where id=#{id}
</select>
<select id="getLikeCount" resultType="int">
select count(id) from stu where name like #{name}
</select>
<select id="listPage" resultMap="stuinfo" parameterType="map">
select * from stu limit #{currentPage},#{pageSize}
</select>
<select id="listLikePage" resultMap="stuinfo" parameterType="map">
select * from stu where name like '%${name}%' limit #{currentPage},#{pageSize}
</select>
</mapper>

上面主要是#和$的區(qū)別要注意:

MyBatis/Ibatis中#和$的區(qū)別
1. #將傳入的數(shù)據(jù)都當(dāng)成一個(gè)字符串醋虏,會(huì)對自動(dòng)傳入的數(shù)據(jù)加一個(gè)雙引號(hào)寻咒。如:order by #user_id#,如果傳入的值是111,那么解析成sql時(shí)的值為order by "111", 如果傳入的值是id颈嚼,則解析成的sql為order by "id". 
2. $將傳入的數(shù)據(jù)直接顯示生成在sql中仔涩。如:order by $user_id$,如果傳入的值是111,那么解析成sql時(shí)的值為order by user_id,  如果傳入的值是id粘舟,則解析成的sql為order by id.
3. #方式能夠很大程度防止sql注入。
4.$方式無法防止Sql注入佩研。
5.$方式一般用于傳入數(shù)據(jù)庫對象柑肴,例如傳入表名.  
6.一般能用#的就別用$. 

還有就是時(shí)間轉(zhuǎn)換需要在配置文件中添加javaType="java.sql.Date" jdbcType="DATE"
前面是指數(shù)據(jù)庫查詢出來的時(shí)間轉(zhuǎn)換成Java類型 后面是數(shù)據(jù)庫連接的類型 一般類型要數(shù)據(jù)庫表中對應(yīng)得字段類型一致

最后就是測試類了

package com.hw.test;

import java.io.Reader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.hw.entity.Student;

public class Test3 {
 public static void main(String[] args) throws Exception {
     //mybatis讀取配置文件
      Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
    // 創(chuàng)建工廠模式SqlSessionFactory
      SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
    //創(chuàng)建session
      SqlSession session = sessionFactory.openSession();
    
      Map<String ,Object> map=new HashMap<String, Object>();
    /* int currentPage=1;
     int pageSize=3;
     map.put("currentPage", (currentPage-1)*pageSize);
     map.put("pageSize", pageSize);
     List<Student> selectList = session.selectList("listPage", map);
     for (Student stu : selectList) {
        System.out.println(stu.getId()+"\t"+stu.getName()+"\t"+stu.getMoney()+"\t"+stu.getJobtime());
    }*/
     int currentPage=1;
     int pageSize=3;
     map.put("name", "張");
     map.put("currentPage", (currentPage-1)*pageSize);
     map.put("pageSize", pageSize);      
     List<Student> selectList = session.selectList("listLikePage", map);
     for (Student stu : selectList) {
        System.out.println(stu.getId()+"\t"+stu.getName()+"\t"+stu.getMoney()+"\t"+stu.getJobtime());
    } 
}
}

分頁模糊查詢 需要注意的是測試類傳入的參數(shù)是map

<select id="listLikePage" resultMap="stuinfo" parameterType="map">select * from stu where name like '%${name}%' limit #{currentPage},#{pageSize}</select>

為什么是map 因?yàn)槲以谟成湮募锩鎸懙膕ql語句有三個(gè)需要傳參的(name,currentPage旬薯,pageSize) 所以我在上面寫的是 parameterType="map" 就是通過鍵值對的方式把值傳到sql語句里面


map存值.png

sesssion對象查找對應(yīng)id 并把map對象傳到映射文件 再通過鍵值對的方式給相應(yīng)的值

List<Student> selectList = session.selectList("listLikePage", map);

相關(guān)源碼:

鏈接:http://pan.baidu.com/s/1kVsepwF 密碼:rbiq
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晰骑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌硕舆,老刑警劉巖秽荞,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抚官,居然都是意外死亡扬跋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門凌节,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钦听,“玉大人,你說我怎么就攤上這事倍奢∑由希” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵卒煞,是天一觀的道長痪宰。 經(jīng)常有香客問我,道長畔裕,這世上最難降的妖魔是什么衣撬? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮柴钻,結(jié)果婚禮上淮韭,老公的妹妹穿的比我還像新娘。我一直安慰自己贴届,他們只是感情好靠粪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著毫蚓,像睡著了一般占键。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上元潘,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天畔乙,我揣著相機(jī)與錄音,去河邊找鬼翩概。 笑死牲距,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钥庇。 我是一名探鬼主播牍鞠,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼评姨!你這毒婦竟也來了难述?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胁后,沒想到半個(gè)月后店读,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡攀芯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年屯断,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敲才。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡裹纳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出紧武,到底是詐尸還是另有隱情剃氧,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布阻星,位于F島的核電站朋鞍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏妥箕。R本人自食惡果不足惜滥酥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望畦幢。 院中可真熱鬧坎吻,春花似錦、人聲如沸宇葱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽黍瞧。三九已至诸尽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間印颤,已是汗流浹背您机。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留年局,地道東北人际看。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像矢否,于是被迫代替她去往敵國和親仿村。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 1. 簡介 1.1 什么是 MyBatis 兴喂? MyBatis 是支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,464評(píng)論 0 4
  • 本文中我們介紹并比較兩種最流行的開源持久框架:iBATIS和Hibernate畏鼓,我們還會(huì)討論到Java Persi...
    大同若魚閱讀 4,305評(píng)論 4 27
  • 說起目標(biāo)回铛,不知道大家什么感覺副硅,我以前更多的是逃避,混亂矫渔,或者說是迷茫毫無目標(biāo)感汗菜。那個(gè)時(shí)候真的很羨慕那些知道自己想要...
    暮夜之歌閱讀 878評(píng)論 0 1
  • NBN的故事55:裝上追蹤器 時(shí)間:9000年2月25日 地點(diǎn):宇宙 甲比安快速地回了月球让禀。“我需要追蹤器陨界,我...
    我我了閱讀 87評(píng)論 1 1