Mybatis框架demo--實現(xiàn)學生信息的增刪改查


一考润、簡述

?MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code刽沾,并且改名為MyBatis,實質上Mybatis對ibatis進行一些改進峭跳。 現(xiàn)在托管到gitHub上,下載:https://github.com/mybatis/mybatis-3/releases
MyBatis是一個優(yōu)秀的持久層框架膘婶,它對jdbc的操作數(shù)據(jù)庫的過程進行封裝,使開發(fā)者只需要關注 SQL 本身蛀醉,而不需要花費精力去處理例如注冊驅動悬襟、創(chuàng)建connection、創(chuàng)建statement拯刁、手動設置參數(shù)脊岳、結果集檢索等jdbc繁雜的過程代碼。
?這個demo是針對mybatis學習而進行的簡單的crud操作垛玻,并通過jsonp跨域將查詢封裝的數(shù)據(jù)發(fā)送至前臺割捅。關于mybatis這個框架的原理我就不再贅述了,上實例帚桩!

二亿驾、運行環(huán)境

2.1 軟件環(huán)境

Eclipse + Tomcat7 + Mysql

2.2 軟件架構

servlet+ mybatis框架 + html + bootstrap框架 + ajax + jsonp

2.3 數(shù)據(jù)庫表結構

CREATE TABLE `stu` (
  `sno` varchar(10) NOT NULL,
  `sname` varchar(20) NOT NULL,
  `sage` int(10) DEFAULT NULL,
  `ssex` varchar(5) DEFAULT NULL,
  PRIMARY KEY (`sno`),
  UNIQUE KEY `sno` (`sno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

2.4 主要jar包

三、例子結構

3.1 web項目結構

3.2 前臺項目結構

四账嚎、主要實現(xiàn)代碼

4.1 mybatis.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>

    <!-- 配置通用mapper -->
    <!-- <plugins></plugins> -->

    <!-- 給路徑取別名,放在environments前面 -->
    <!-- <typeAliases>
        <typeAlias type="dao.StudentDao" alias="stu" />
    </typeAliases> -->

    <environments default="development">
        <environment id="development">
            <!-- 事務管理 -->
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="username" value="root" />
                <property name="url" value="jdbc:mysql://localhost:3306/student" />
                <property name="password" value="123" />
                <property name="driver" value="com.mysql.jdbc.Driver" />
            </dataSource>
        </environment>

    </environments>
    <!-- 配置 映射文件 -->
    <mappers>
        <mapper resource="entity/StudentMapper.xml" />
    </mappers>
</configuration>

4.2 StudentMapper.xml

<?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">
<!-- namespace命名空間,作用就是對sql進行分類管理
    注意:使用mapper代理方法開發(fā)時,namespace需要特殊設置
 -->
<mapper namespace="dao.StudentDao">
    
    <!-- 查詢所有學生信息 -->
    <resultMap type="entity.Student" id="stuMap">
        <id column="sno" javaType="String" property="sno"></id>     
        <result column="sname" javaType="String" property="sname"/>
        <result column="ssex" javaType="String" property="ssex"/>
        <result column="sage" javaType="int" property="sage"/>
    </resultMap>
    
    <select id="findAllStudent" resultMap="stuMap">
        select * from stu
    </select>
    
    <!-- 實現(xiàn)分頁查詢學生信息 -->
    <select id="findPageStudent" parameterType="map" resultType="entity.Student">
        SELECT * FROM stu LIMIT #{startSize},#{pageSize}
    </select>
    
    <!-- 實現(xiàn)學生信息的添加操作 -->
    <insert id="doInsert" parameterType="entity.Student">
        INSERT INTO stu
        <include refid="columns_mysql"></include>
        VALUES
        <include refid="values_columns"></include>
    </insert>
    
    <!-- 添加的sql片段開始 -->
    <sql id = "columns_mysql">
        <trim prefix="(" suffix=")" suffixOverrides="," >
            <if test="sno!=null">
                sno,
            </if>
            <if test="sname!=null">
                sname,
            </if>
            <if test="sage!=null">
                sage,
            </if>
            <if test="ssex!=null">
                ssex,
            </if>
        </trim>
    </sql>
    
    <sql id="values_columns">
        <trim prefix="(" suffix=")" suffixOverrides="," >
            <if test="sno!=null">
                #{sno},
            </if>
            <if test="sname!=null">
                #{sname},
            </if>
            <if test="sage!=null">
                #{sage},
            </if>
            <if test="ssex!=null">
                #{ssex},
            </if>
        </trim>
    </sql>
    <!-- 添加的sql片段結束 -->
    
    <!-- 實現(xiàn)學生信息的更新操作 -->
    <update id="doUpdateStudent" parameterType="entity.Student">
        update stu 
            set sname = #{sname},
            ssex = #{ssex},
            sage = #{sage}
        where sno = #{sno}
    </update>
    
    <!-- 根據(jù)學生id進行刪除操作 -->
    <delete id="doDeleteBySno" parameterType="String">
        delete from stu where sno = #{sno}
    </delete>
    
    <!-- 查詢學生表總人數(shù) -->
    <select id="findCount" resultType="int">
        select count(*) from stu
    </select>
</mapper>

4.3 Mapper實現(xiàn)類StudentDaoImpl.java

public class StudentDaoImpl implements StudentDao {
    
    private SqlSession sqlSession;

    public List<Student> findAllStudent() {
        sqlSession = SqlSessionUtil.getSession();
        List<Student> list = sqlSession.selectList("findAllStudent");
        sqlSession.commit();
        sqlSession.close();
        
        return list;
    }

    public List<Student> findPageStudent(Integer startSize, Integer pageSize) {
        sqlSession = SqlSessionUtil.getSession();
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("startSize", startSize);
        map.put("pageSize", pageSize);
        List<Student> list = sqlSession.selectList("findPageStudent",map);
        sqlSession.commit();
        sqlSession.close();
        return list;
    }

    public int doInsert(Student stu) {
        sqlSession = SqlSessionUtil.getSession();
        Integer result = sqlSession.insert("doInsert",stu);
        sqlSession.commit();
        sqlSession.close();
        
        return result;
    }

    public int doDeleteBySno(String sno) {
        sqlSession = SqlSessionUtil.getSession();
        Integer result = sqlSession.delete("doDeleteBySno",sno);
        sqlSession.commit();
        sqlSession.close();
        
        return result;
    }

    @Override
    public int doUpdateStudent(Student stu) {
        sqlSession = SqlSessionUtil.getSession();
        Integer result = sqlSession.update("doUpdateStudent",stu);
        sqlSession.commit();
        sqlSession.close();
        
        return result;
    }

    public int findCount() {
        sqlSession = SqlSessionUtil.getSession();
        Integer result = sqlSession.selectOne("findCount");
        sqlSession.commit();
        sqlSession.close();
        
        return result;
    }

}

4.4 StudentServiceImpl.java

private StudentDao stuDao = new StudentDaoImpl();
    
    public List<Student> findAllStudent() {
        return stuDao.findAllStudent();
    }

    public PageBean<Student> findPageStudent(Integer currentPage,
            Integer pageSize) {
        Integer count = stuDao.findCount();
        
        Integer allPages = count/pageSize == 0 ? count/pageSize 
                : count/pageSize + 1;
        
        if(currentPage > allPages){
            currentPage = allPages;
        }
        if(currentPage < 1){
            currentPage = 1;
        }
        PageBean<Student> pb = new PageBean<Student>();
        Integer startSize = (currentPage-1)*pageSize;
        List<Student> list = stuDao.findPageStudent(startSize, pageSize);
        
        pb.setAllPages(allPages);
        pb.setCount(count);
        pb.setCurrentPage(currentPage);
        pb.setCurrentCount(pageSize);
        pb.setList(list);
        
        return pb;
    }

    public int doInsert(Student stu) {
        return stuDao.doInsert(stu);
    }

    public int doDeleteBySno(String sno) {
        return stuDao.doDeleteBySno(sno);
    }

    public int doUpdateStudent(Student stu) {
        return stuDao.doUpdateStudent(stu);
    }

4.5 servlet主要操作的方法

4.5.1 分頁查詢方法

private void sendPageData(HttpServletRequest request,
            HttpServletResponse response) throws IOException{
        int pageSize = 5;
        int currentPage = 1;
        String currPage = request.getParameter("currentPage");
        if(currPage!=null){
            currentPage = Integer.parseInt(currPage);
        }
        
        PageBean<Student> pb = stuService.findPageStudent(currentPage, pageSize);
    
        JSONObject json = JSONObject.fromObject(pb);

        PrintWriter writer = response.getWriter();

        String callback = request.getParameter("callback");

        String result = callback + "(" + json.toString() + ")";
        
        writer.write(result);
    }

4.5.2 數(shù)據(jù)更新操作

private void doUpdate(HttpServletRequest request,
            HttpServletResponse response) throws IOException{
        String sno = request.getParameter("sno");
        String sname = request.getParameter("sname");
        String ssex = request.getParameter("ssex");
        Integer sage = null;
        if(request.getParameter("sage")!=null){
            sage = Integer.parseInt(request.getParameter("sage"));
        }
        
        System.out.println("姓名:"+sname+"\t性別:"+ssex+"\t學號:"+sno+"\t年紀:"+sage);
        Student stu = new Student();
        stu.setSno(sno);
        stu.setSname(sname);
        stu.setSsex(ssex);
        stu.setSage(sage);
        JSONObject json = new JSONObject();
        
        if(stuService.doUpdateStudent(stu)==1){
            json.put("msg", "修改成功");
        }else{
            json.put("msg", "修改失敗");
        }
        
        PrintWriter writer = response.getWriter();

        String callback = request.getParameter("callback");

        String result = callback + "(" + json.toString() + ")";
        
        writer.write(result);
    }

4.5.3 通過學號刪除學生操作

private void doDeleteBySno(HttpServletRequest request,
            HttpServletResponse response) throws IOException{
        
        String sno = request.getParameter("sno");
        JSONObject json = new JSONObject();
        if(stuService.doDeleteBySno(sno)==1){
            json.put("msg", "刪除成功");
        }else{
            json.put("msg", "刪除失敗");
        }
        
        PrintWriter writer = response.getWriter();

        String callback = request.getParameter("callback");

        String result = callback + "(" + json.toString() + ")";
        
        writer.write(result);
    }

五莫瞬、總結

? 對于mybatis框架的使用,主要還是在映射文件的配置醉锄,將數(shù)據(jù)庫內所查出的數(shù)據(jù)與實體類的映射乏悄,從而實現(xiàn)數(shù)據(jù)的持久化操作。
? MyBatis是一個優(yōu)秀的持久層框架恳不,它對jdbc的操作數(shù)據(jù)庫的過程進行封裝檩小,使開發(fā)者只需要關注 SQL 本身,而不需要花費精力去處理例如注冊驅動烟勋、創(chuàng)建connection规求、創(chuàng)建statement、手動設置參數(shù)卵惦、結果集檢索等jdbc繁雜的過程代碼阻肿。


對于前臺頁面,我會在下一篇文章中寫出沮尿,如上面觀點你們有所異議丛塌,歡迎大家給我指出较解。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赴邻,隨后出現(xiàn)的幾起案子印衔,更是在濱河造成了極大的恐慌,老刑警劉巖姥敛,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奸焙,死亡現(xiàn)場離奇詭異,居然都是意外死亡彤敛,警方通過查閱死者的電腦和手機与帆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墨榄,“玉大人玄糟,你說我怎么就攤上這事“乐龋” “怎么了茶凳?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長播揪。 經(jīng)常有香客問我,道長筒狠,這世上最難降的妖魔是什么猪狈? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮辩恼,結果婚禮上雇庙,老公的妹妹穿的比我還像新娘。我一直安慰自己灶伊,他們只是感情好疆前,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著聘萨,像睡著了一般竹椒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上米辐,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天胸完,我揣著相機與錄音,去河邊找鬼翘贮。 笑死赊窥,一個胖子當著我的面吹牛,可吹牛的內容都是我干的狸页。 我是一名探鬼主播锨能,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了址遇?” 一聲冷哼從身側響起熄阻,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎傲隶,沒想到半個月后饺律,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡跺株,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年复濒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乒省。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡巧颈,死狀恐怖,靈堂內的尸體忽然破棺而出袖扛,到底是詐尸還是另有隱情砸泛,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布蛆封,位于F島的核電站唇礁,受9級特大地震影響,放射性物質發(fā)生泄漏惨篱。R本人自食惡果不足惜盏筐,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砸讳。 院中可真熱鬧琢融,春花似錦、人聲如沸簿寂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽常遂。三九已至纳令,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間克胳,已是汗流浹背泊碑。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毯欣,地道東北人馒过。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像酗钞,于是被迫代替她去往敵國和親腹忽。 傳聞我的和親對象是個殘疾皇子来累,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內容

  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL窘奏、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,455評論 0 4
  • 1 引言# 本文主要講解JDBC怎么演變到Mybatis的漸變過程嘹锁,重點講解了為什么要將JDBC封裝成Mybait...
    七寸知架構閱讀 76,442評論 36 980
  • Day21 #40 會春 參加呆萌寫作營有感 三周21天的打卡寫作結束了。似乎是松口氣着裹,卻不是如釋重負领猾,而是有一絲...
    會春閱讀 264評論 0 0
  • 一、找茬小組 1骇扇、完善了找茬第4期的活動規(guī)則摔竿。 2、形成了評論文章的模板少孝。 3继低、修改第4期寫作課件的內容。 二稍走、育...
    四毛慢成長閱讀 116評論 0 0