原理等不在贅述,這里主要通過代碼展現。
在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()+"\t"+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后的方法即可。
具體注意說明: