Mybatis框架demo--实现学生信息的增删改查


一、简述

 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。 现在托管到gitHub上,下载:https://github.com/mybatis/mybatis-3/releases
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
 这个demo是针对mybatis学习而进行的简单的crud操作,并通过jsonp跨域将查询封装的数据发送至前台。关于mybatis这个框架的原理我就不再赘述了,上实例!

二、运行环境

2.1 软件环境

Eclipse + Tomcat7 + Mysql

2.2 软件架构

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

2.3 数据库表结构

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 前台项目结构

四、主要实现代码

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代理方法开发时,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>
    
    <!-- 实现分页查询学生信息 -->
    <select id="findPageStudent" parameterType="map" resultType="entity.Student">
        SELECT * FROM stu LIMIT #{startSize},#{pageSize}
    </select>
    
    <!-- 实现学生信息的添加操作 -->
    <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片段结束 -->
    
    <!-- 实现学生信息的更新操作 -->
    <update id="doUpdateStudent" parameterType="entity.Student">
        update stu 
            set sname = #{sname},
            ssex = #{ssex},
            sage = #{sage}
        where sno = #{sno}
    </update>
    
    <!-- 根据学生id进行删除操作 -->
    <delete id="doDeleteBySno" parameterType="String">
        delete from stu where sno = #{sno}
    </delete>
    
    <!-- 查询学生表总人数 -->
    <select id="findCount" resultType="int">
        select count(*) from stu
    </select>
</mapper>

4.3 Mapper实现类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 数据更新操作

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框架的使用,主要还是在映射文件的配置,将数据库内所查出的数据与实体类的映射,从而实现数据的持久化操作。
  MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。


对于前台页面,我会在下一篇文章中写出,如上面观点你们有所异议,欢迎大家给我指出。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容