美文网首页
(二)MyBatis 实现CRUD(增删改查,有条件分页,和无条

(二)MyBatis 实现CRUD(增删改查,有条件分页,和无条

作者: 花季浅忆 | 来源:发表于2019-03-06 10:20 被阅读0次

    基于上一篇博文的基础上我们来实现MyBatis的增删改查,以及分页功能。
    先看
    1.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名字可以随便写,但是一般都写成实体类的名字-->
    
    <mapper namespace="com.flyz.app01.Student">
        <!-- resultMap标签:映射实体与表
             type属性:表示实体全路径名
             id属性:为实体与表的映射取一个任意的唯一的名字
        -->
        <resultMap type="student" id="studentMap">
            <!-- id标签:映射主键属性
                 result标签:映射非主键属性
                 property属性:实体的属性名
                 column属性:表的字段名
            -->
            <id property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="sal" column="sal"/>
        </resultMap>
    
    
        <!--<select id="findById" parameterType="int" resultType="student">-->
             <!--select * from students where id = #{id}-->
       <!--</select>-->
        <!--
                insert标签:要书写insert这么一个sql语句
                id属性:为insert这么一个sql语句取一个任意唯一的名字
                parameterType:要执行的dao中的方法的参数,如果是类的话,必须使用全路径类
            -->
    
    
        <!--没有参数的add方法-->
        <insert id="add1">
            insert into students(id,name,sal) values(5,'哈哈',7000)
        </insert>
    
    
        <!--带一个Student为参数的方法-->
        <insert id="add2" parameterType="student">
            insert into students(id,name,sal) values(#{id},#{name},#{sal}) <!-- #{属性名} 这种方式引用从参数中传过来的student的参数中的值-->
        </insert>
    
    
        <!-- 根据ID查询学生
             如果参数不是一个实体的话,只是一个普通变量,例如:int,double,String
             这里的#{中间的变量名可以随便写},不过提倡就用方法的形参
         -->
        <select id="findById" parameterType="int" resultType="student">
            select id,name,sal from students where id = #{id}<!-- #{属性名} 这种方式引用从参数中传过来的student的参数中的值-->
        </select>
    
    
    
        <!-- 查询所有学生
             理论上resultType要写List<Student>
             但这里只需书写List中的类型即可,即只需书写Student的全路径名
        -->
        <select id="findAll" resultType="student">
            select id,name,sal from students
        </select>
    
    
    
        <!-- 更新学生 -->
        <update id="update" parameterType="student">
            update students set name=#{name},sal=#{sal} where id=#{id}<!-- #{属性名} 这种方式引用从参数中传过来的student的参数中的值-->
        </update>
    
    
    
        <!-- 删除学生 -->
        <delete id="delete" parameterType="student">
            delete from students where id = #{id}<!-- #{属性名} 这种方式引用从参数中传过来的student的参数中的值-->
        </delete>
    
    
        <!--
        <insert id="delete" parameterType="cn.itcast.javaee.mybatis.app09.Student">
            delete from students where id = #{id}
        </insert>
        -->
    
    
        <!--
            注意:这个insert/update/delete标签只是一个模板,在做操作时,其实是以SQL语句为核心的
                 即在做增/删/时,insert/update/delete标签可通用,
                 但做查询时只能用select标签
                 我们提倡什么操作就用什么标签
        -->
    
        <select id="findAllWithFy" parameterType="map" resultMap="studentMap">
            select id,name,sal
            from students
            limit #{pstart},#{psize}
        </select>
    
    
        <select id="findAllByNameWithFy" parameterType="map" resultMap="studentMap">
            select id,name,sal
            from students
            where name like #{pname}
            limit #{pstart},#{psize}
        </select>
    
    </mapper>
    

    2.StudentDao.java:

    package com.flyz.app01;
    
    import com.flyz.util.MybatisUtil;
    import org.apache.ibatis.session.SqlSession;
    
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map;
    
    public class StudentDao {
        /**
         * 增加学生
         */
        public void add1() throws Exception{
            SqlSession sqlSession = null;
            try{
                sqlSession = MybatisUtil.getSqlSession();
                //事务开始(默认)
                //读取StudentMapper.xml映射文件中的SQL语句
                int i = sqlSession.insert("com.flyz.app01.Student.add1");//命名空间+对应的sql的id
                System.out.println("本次操作影响了"+i+"行");
                //事务提交
                sqlSession.commit();
            }catch(Exception e){
                e.printStackTrace();
                //事务回滚
                sqlSession.rollback();
                throw e;
            }finally{
                MybatisUtil.closeSqlSession();
            }
        }
        /**
         * 增加学生
         */
        public void add2(Student student) throws Exception{
            SqlSession sqlSession = null;
            try{
                sqlSession = MybatisUtil.getSqlSession();
                //事务开始(默认)
                //读取StudentMapper.xml映射文件中的SQL语句
                sqlSession.insert(Student.class.getName()+".add2",student);
                //事务提交
                sqlSession.commit();
            }catch(Exception e){
                e.printStackTrace();
                //事务回滚
                sqlSession.rollback();
                throw e;
            }finally{
                MybatisUtil.closeSqlSession();
            }
        }
    
        /**
         * 根据ID查询学生
         */
        public Student findById(int id) throws Exception{
            SqlSession sqlSession = null;
            try{
                sqlSession = MybatisUtil.getSqlSession();
                Student student = sqlSession.selectOne(Student.class.getName()+".findById",id);
                sqlSession.commit();
                return student;
            }catch(Exception e){
                e.printStackTrace();
                sqlSession.rollback();
                throw e;
            }finally{
                MybatisUtil.closeSqlSession();
            }
        }
        /**
         * 查询所有学生
         */
        public List<Student> findAll() throws Exception{
            SqlSession sqlSession = null;
            try{
                sqlSession = MybatisUtil.getSqlSession();
                return sqlSession.selectList(Student.class.getName()+".findAll");
            }catch(Exception e){
                e.printStackTrace();
                throw e;
            }finally{
                MybatisUtil.closeSqlSession();
            }
        }
        /**
         * 更新学生
         */
        public void update(Student student) throws Exception{
            SqlSession sqlSession = null;
            try{
                sqlSession = MybatisUtil.getSqlSession();
                sqlSession.update(Student.class.getName()+".update",student);
                sqlSession.commit();
            }catch(Exception e){
                e.printStackTrace();
                sqlSession.rollback();
                throw e;
            }finally{
                MybatisUtil.closeSqlSession();
            }
        }
        /**
         * 删除学生
         */
        public void delete(Student student) throws Exception{
            SqlSession sqlSession = null;
            try{
                sqlSession = MybatisUtil.getSqlSession();
                sqlSession.delete(Student.class.getName()+".delete",student);
                sqlSession.commit();
            }catch(Exception e){
                e.printStackTrace();
                sqlSession.rollback();
                throw e;
            }finally{
                MybatisUtil.closeSqlSession();
            }
        }
    
    
    
    
        /**
         * 无条件分页
         * @param start 表示在mysql中从第几条记录的索引号开始显示,索引从0开始
         * @param size 表示在mysql中最多显示几条记录
         */
        public List<Student> findAllWithFy(int start,int size) throws Exception{
            SqlSession sqlSession = null;
            try{
                sqlSession = MybatisUtil.getSqlSession();
    
                Map<String,Object> map = new LinkedHashMap<String,Object>();
                map.put("pstart",start);
                map.put("psize",size);
                return sqlSession.selectList(Student.class.getName()+".findAllWithFy",map);
            }catch(Exception e){
                e.printStackTrace();
                throw e;
            }finally{
                MybatisUtil.closeSqlSession();
            }
        }
        /**
         * 有条件分页
         */
        public List<Student> findAllByNameWithFy(String name,int start,int size) throws Exception {
            SqlSession sqlSession = null;
            try {
                sqlSession = MybatisUtil.getSqlSession();
                Map<String, Object> map = new LinkedHashMap<String, Object>();
                map.put("pname", "%" + name + "%");
                map.put("pstart", start);
                map.put("psize", size);
                return sqlSession.selectList(Student.class.getName() + ".findAllByNameWithFy", map);
            } catch (Exception e) {
                e.printStackTrace();
                throw e;
            } finally {
                MybatisUtil.closeSqlSession();
            }
        }
    }
    
    

    MybatisUtil.java

    package com.flyz.util;
    
    import java.io.IOException;
    import java.io.Reader;
    import java.sql.Connection;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    /**
     * 工具类
     * @author AdminTC
     */
    public class MybatisUtil {
        private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
        private static SqlSessionFactory sqlSessionFactory;
        /**
         * 加载位于src/mybatis.xml配置文件
         */
        static{
            try {
                Reader reader = Resources.getResourceAsReader("mybatis.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
        /**
         * 禁止外界通过new方法创建
         */
        private MybatisUtil(){}
        /**
         * 获取SqlSession
         */
        public static SqlSession getSqlSession(){
            //从当前线程中获取SqlSession对象
            SqlSession sqlSession = threadLocal.get();
            //如果SqlSession对象为空
            if(sqlSession == null){
                //在SqlSessionFactory非空的情况下,获取SqlSession对象
                sqlSession = sqlSessionFactory.openSession();
                //将SqlSession对象与当前线程绑定在一起
                threadLocal.set(sqlSession);
            }
            //返回SqlSession对象
            return sqlSession;
        }
        /**
         * 关闭SqlSession与当前线程分开
         */
        public static void closeSqlSession(){
            //从当前线程中获取SqlSession对象
            SqlSession sqlSession = threadLocal.get();
            //如果SqlSession对象非空
            if(sqlSession != null){
                //关闭SqlSession对象
                sqlSession.close();
                //分开当前线程与SqlSession对象的关系,目的是让GC尽早回收
                threadLocal.remove();
            }
        }
    
    }
    
    
    
    
    

    以上就是关于这CRUD的配置,基于上一篇博文的基础就可以实现正删改查了。需要说的是,这两个文件的内容是相互配合的。

    3.下面以update方法来说明一下:

    a) StudentDao.java文件中


    09.jpg

    a) StudentMapping.xml文件中


    10.jpg

    4.在分页查询中的参数需要注意了:如果传的不是student类型,而且是多个参数的话,参数类型就应该写map 以分页条件查询为例:


    11.jpg 11.png

    ok以上就是普通方式的CURD查询

    相关文章

      网友评论

          本文标题:(二)MyBatis 实现CRUD(增删改查,有条件分页,和无条

          本文链接:https://www.haomeiwen.com/subject/vdvzuqtx.html