• mybatis(二)接口编程 、动态sql 、批量删除 、动态更新、连表查询


    原理等不在赘述,这里主要通过代码展现。

    在mybatis(一)基础上,新建一个dao包,并在里面编写接口,然后再在xml文件中引入接口路径,其他不变,在运用阶段将比原始方法更节约时间,因为不用再去手动的

    引用sql,我们只需调用dao层的方法,然后让dao层的方法去找配置文件,去找sql,sql查询数据并赋值给对象,或者设置对象参数值在经过sql更新到数据库,小伙伴们这就是

    orm对象关系映射模型!(个人见解,不对之处请指正。)

    新增后项目:

    一、新建一个com.ckx.dao包,并new一个(interface)DeptDao.java。

    DeptDao.java:

    package com.ckx.dao;
    
    import java.util.List;
    
    import org.apache.ibatis.annotations.Param;
    
    import com.ckx.entity.Dept;
    
    public interface DeptDao {
        //通过ID查数据
        public Dept selectDeptById(int deptno);
        //查询一个结果集
        public List<Dept> selectDeptAll();
        //多条件动态 ,查询注意@Param的重要性,没有回报参数not find错误
        public List<Dept> selectDeptByMore(@Param("deptno") int deptno,@Param("dname") String dname);
        //根据ID动态修改
        public int updateDeptById(Dept d);
        //批量删除
        public int deleteDepts(List<Integer> list);
        //新增
        public int insertDept(Dept d); 
        public int insertDept2(Dept d); 
        //多表关联
        public Dept selectDeptEmps(int t);
        
    
    }

    二、配置Dept.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">
    <!--接口编程-->
    <mapper namespace="com.ckx.dao.DeptDao">
    
        <resultMap type="Dept" id="DeptList">
            <result column="deptno" property="deptno"/>
            <result column="dname" property="dname"/>
            <result column="loc" property="loc"/>
            <!--        代表集合数据  property:实体bean中的属性名称 ofType:数据类型 -->
            <collection property="emps" ofType="Emp">
                <result column="EMPNO" property="empno" />
                <result column="ENAME" property="ename" />
                <result column="JOB" property="job" />
                <result column="MGR" property="mgr" />
                <result column="HIREDATE" property="hiredate" />
                <result column="SAL" property="sal" />
                <result column="COMM" property="comm" />
                <result column="DEPNO" property="depno" />
            </collection>
        </resultMap>
    <!--    通过ID查询-->
        <select id="selectDeptById" parameterType="int" resultType="Dept">
            select * from dept where deptno = #{deptno}
        </select>
    <!--    查询整张表,注意返回参数是一个DeptList集合,这个需要在上面配置-->
        <select id="selectDeptAll"  resultMap="DeptList">
            select * from dept 
        </select>
    <!--    多参数动态查询-->
        <select id="selectDeptByMore"  resultMap="DeptList">
            select * from dept  
            <where>
                <if test="deptno != 0">
                    deptno = #{deptno}
                </if>
                <if test="dname != null">
                    or dname like #{dname}
                </if>
            </where>
        </select>
    <!--    动态更新数据-->
        <update id="updateDeptById"  parameterType="Dept">
            update   
            dept 
            <set>
                <if test="deptno != null">
                     dname = #{dname},
                </if>
                <if test="deptno != null">
                     loc = #{loc}
                </if>
            </set>
            where 
            deptno = #{deptno}
        </update>
    <!--    批量删除-->
        <delete id="deleteDepts" parameterType="list">
            delete from dept where deptno in
            <foreach item="item" index="index" collection="list" open="("
                separator=", " close=") ">
                #{item}
             </foreach>
        </delete>
    <!--    新增数据-->
        <insert id="insertDept" parameterType="Dept" >
            insert into dept (deptno,dname,loc) values (#{deptno},#{dname},#{loc})
        </insert>
    <!--    连表查询,注意1、到层返回值为对象类本身 2、查询返回值为list集合。-->
        <select id="selectDeptEmps" parameterType="int" resultMap="DeptList">
            SELECT d.DNAME,e.*  FROM dept d,emp e WHERE d.DEPTNO=e.DEPNO and d.DEPTNO = #{deptno}
        </select>
        
    <!--    未完成-->
        <sql id='dept'>TEST_USER</sql>
         <!-- 注意这里需要先查询自增主键值 -->
         <insert id="insertDept2" parameterType="Dept">
             <selectKey keyProperty="deptno" resultType="int" order="BEFORE">
                 SELECT LAST_INSERT_deptno()
             </selectKey>
             insert into <include refid="dept" /> (deptno,dname,loc)
                 values ( #{deptno},#{dname},#{loc} )
         </insert>
    
    
    
    </mapper>

    三、测试

    DeptTest.java:

    package com.ckx.test;
    
    import java.io.IOException;
    import java.io.Reader;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.List;
    import java.util.ListIterator;
    
    import javax.mail.Session;
    
    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.ckx.dao.DeptDao;
    import com.ckx.entity.Dept;
    import com.ckx.entity.Emp;
    
    public class DeptTest {
        static SqlSessionFactory sessionFactory;
        static Reader reader;
        static SqlSession sqlSession;
    
        static {
            try {
                reader = Resources.getResourceAsReader("config.xml");
                sessionFactory = new SqlSessionFactoryBuilder().build(reader);
                sqlSession = sessionFactory.openSession();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        public void select(){
            DeptDao dao = sqlSession.getMapper(DeptDao.class);
            Dept d =  dao.selectDeptById(10);
            System.out.println(d.getDname());
        }
    
        public void selectDeptAll(){
            DeptDao dao = sqlSession.getMapper(DeptDao.class);
            List<Dept> list = dao.selectDeptAll();
            
            for (Dept dept : list) {
                String s = dept.getDname();
                System.out.println(s);
            }
            
            Iterator<Dept> ite = list.iterator();
            while (ite.hasNext()) {
                Dept d = ite.next();
                String ss = d.getLoc();
                System.out.println(ss);
            }
            
            for (int i = 0; i < list.size(); i++) {
                Dept d = list.get(i);
                int t = d.getDeptno();
                System.out.println(t);
            }
        }
    
        public void selectDeptByMore(){
            DeptDao dao = sqlSession.getMapper(DeptDao.class);
            List<Dept> list = dao.selectDeptByMore(20,"A%");
            Iterator<Dept> it = list.iterator();
            while (it.hasNext()) {
                Dept dept = (Dept) it.next();
                String s = dept.getDname();
                System.out.println(s);
            }
        }
        
        public void updateDeptById(){
            DeptDao dao = sqlSession.getMapper(DeptDao.class);
            Dept d = new Dept();
            d.setDeptno(10);
            d.setDname("ASC");
            d.setLoc("desc");
            dao.updateDeptById(d);
            System.out.println(d.getDeptno()+d.getDname()+d.getLoc());
            sqlSession.commit();
        }
        
        public void deleteDepts(){
            DeptDao dao = sqlSession.getMapper(DeptDao.class);
            List<Integer> list = new ArrayList<Integer>();
            list.add(0);
            dao.deleteDepts(list);
        }
    
        public void insertDept(){
            DeptDao dao = sqlSession.getMapper(DeptDao.class);
            Dept d = new Dept();
            d.setDeptno(10);
            d.setDname("assc");
            d.setLoc("deff");
            dao.insertDept(d);
            sqlSession.commit();
        }
        //多表联查
        public void selectDeptEmps(){
            DeptDao dao = sqlSession.getMapper(DeptDao.class);
            Dept d = dao.selectDeptEmps(10);
            List<Emp> list = d.getEmps();
            for (Emp emp : list) {
                String s = emp.getEname();
                System.out.println(d.getDname()+"	"+s);
            }
            
        }
        ;
        //主键自增为完成
         public void insertDept2(){
            DeptDao dao = sqlSession.getMapper(DeptDao.class);
            Dept d = new Dept();
            d.setDname("sss");
            d.setLoc("ddd");
            dao.insertDept(d);
            sqlSession.commit();
            System.out.println(d.getDeptno());
        }
        
        public static void main(String[] args) {
            DeptTest dt = new DeptTest();
            dt.selectDeptEmps();
        }
    }

    以上皆为测试过运行正常的方法,每一个方法的调用只需能改dt后的方法即可。

    具体注意说明:

  • 相关阅读:
    Java String, StringBuffer和StringBuilder实例
    java中字符串的比较
    java中子类继承父类时是否继承构造函数
    Java中抽象类和接口的用法和区别
    与(&)、非(~)、或(|)、异或(^)
    Linux03
    Linux02
    Linux01
    力扣算法题
    算法 栈、队列、二分查找
  • 原文地址:https://www.cnblogs.com/ckxlovejava/p/6072016.html
Copyright © 2020-2023  润新知