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()+"\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后的方法即可。
具体注意说明:
mybatis(二)接口编程 、动态sql 、批量删除 、动态更新、连表查询的更多相关文章
- 利用sql批量删除表,存储过程
利用sql批量删除表,存储过程. 最近用godaddy的空间,由于系统里面的表多,一个个的删除很麻烦,就网上搜集了一下解决方法. 给大家分享一下: 1.批量删除存储过程 declare @procNa ...
- SQL触发器批量删除数据库中的表
以下通过触发器批量删除数据库中的表,SQL2008已验证 DECLARE @Table NVARCHAR() DECLARE @Count Int = DECLARE tmpCur CURSOR FO ...
- hibernate批量删除和更新数据
转载自:http://blog.csdn.net/yuhua3272004/article/details/2909538 Hibernate3.0 採用新的基于ANTLR的HQL/SQL查询翻译器, ...
- SQLServer 命令批量删除数据库中指定表(游标循环删除)
DECLARE @tablename VARCHAR(30),@sql VARCHAR(500)DECLARE cur_delete_table CURSOR READ_ONLY FORWARD_ON ...
- Mybatis基于接口注解配置SQL映射器(二)
Mybatis之增强型注解 MyBatis提供了简单的Java注解,使得我们可以不配置XML格式的Mapper文件,也能方便的编写简单的数据库操作代码.但是注解对动态SQL的支持一直差强人意,即使My ...
- MyBatis进阶--接口代理方式实现Dao 和动态SQL
MyBatis接口代理方式实现Dao层 接口代理方式-实现规则 传统方式实现Dao层,我们既要写接口.还要写实现类.而MyBatis框架可以帮助我们省略写Dao层接口实现类的步骤.程序员只需要编写接口 ...
- MyBatis的动态SQL操作--删除
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUYAAAC/CAIAAAANX+LCAAAYvElEQVR4nO2dWWycV9nHDyC6UEGBGy
- MyBatis动态SQL第一篇之实现多条件查询(if、where、trim标签)
一.动态SQL概述 以前在使用JDBC操作数据时,如果查询条件特别多,将条件串联成SQL字符串是一件痛苦的事情.通常的解决方法是写很多的if-else条件语句对字符串进行拼接,并确保不能忘了空格或在字 ...
- Mybatis基于接口注解配置SQL映射器(一)
上文已经讲解了基于XML配置的SQL映射器,在XML配置的基础上MyBatis提供了简单的Java注解,使得我们可以不配置XML格式的Mapper文件,也能方便的编写简单的数据库操作代码. Mybat ...
- 如何用sql批量删除一个id段内的dedecms文章?
之前因为ytkah批量添加了dedecms文章,数量有些多,后面出现问题了,想要删除一部分织梦文章,后台一篇篇删,删到手软(相关内容:修改dedecms关键词到手软),于是就想到了sql数据库操作!那 ...
随机推荐
- Spring源码学习之:ClassLoader学习(1)
转载:http://longdick.iteye.com/blog/442213 java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个jvm中默认的classloade ...
- Python scikit-learn机器学习工具包学习笔记:feature_selection模块
sklearn.feature_selection模块的作用是feature selection,而不是feature extraction. Univariate feature selecti ...
- Win7 Update 遭遇8024200D
可用办法如下: 1.点击开始菜单,点运行,输入cmd然后按回车.然后在命令行下输入: net stop WuAuServ 2.点击开始菜单,点运行,输入%windir%然后按回车. 3.在打开的文件夹 ...
- 是不是content-type: text/html的数据包一到,浏览器就肯定刷新页面?
整理自:http://q.cnblogs.com/q/54726/ 是不是content-type: text/html的数据包一到,浏览器就肯定刷新页面? 或者说,浏览器收到的状态正常的conten ...
- Android模拟器部署历程
由于想玩一款手机的游戏,本人手机Android系统版本太低,不能安装.所以就想在WindowS上安装一个模拟器,然后安装游戏.想法挺好.实现起来确实经历了一个坎坷的过程.为了让其他人少走弯路,本人把此 ...
- 【转】编译quickfast解析库(沪深level2行情转码库)
转自http://blog.csdn.net/hacode/article/details/7065889 编译quickfast解析库(沪深level2行情转码库) 目录(?)[-] 1 下载源代 ...
- Web前端图表绘制JQuery插件jqplot
在此之前使用了Chart.js.Highcharts,首先了解一下这两款插件的优势与不足,然后再来了解jqplot. 1.Chart Chart中文官网:http://chartjs.cn/ 1.1优 ...
- 解决Tomcat catalina.out 不断成长导致档案过大的问题
Tomcat的网站上的说法http://wiki.apache.org/tomcat/FAQ/Logging#Q6: System.out 和 System.err 都被打印到 catalina.ou ...
- .netGDI+(转)
架上图片了你就可以在画板上涂改了啊我要写多几个字上去 string str = "Baidu"; //写什么字? Font font = Font("宋体",3 ...
- Chap6: question 46 - 48
46. 求 1+2+ … +n. 要求:不用乘除法.for.while.if.else.switch.case 以及条件判断语句(A?B:C). a. 利用构造函数求解 #include <io ...