1.原始方法开发Dao

Dao接口

 package cn.sm1234.dao;

 import java.util.List;

 import cn.sm1234.domain.Customer;

 public interface CustomerDao {

     public void saveCustomer(Customer customer);

     public void updateCustomer(Customer customer);

     public void deleteCustomer(Integer id);

     public List<Customer> queryAllCustomer();

     public Customer queryCustomerById(Integer id);

     public List<Customer> queryCustomerByName(String name);
}

Dao实现:

 package cn.sm1234.dao.impl;

 import java.util.List;

 import org.apache.ibatis.session.SqlSession;

 import cn.sm1234.dao.CustomerDao;
import cn.sm1234.domain.Customer;
import cn.sm1234.utils.SessionUtils; public class CustomerDaoImpl implements CustomerDao { @Override
public void saveCustomer(Customer customer) {
SqlSession sqlSession = null;
try {
sqlSession = SessionUtils.getSesion();
sqlSession.insert("insertCustomer", customer);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
sqlSession.close();
}
} @Override
public void updateCustomer(Customer customer) {
SqlSession sqlSession = null;
try {
sqlSession = SessionUtils.getSesion();
sqlSession.update("updateCustomer", customer);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
sqlSession.close();
} } @Override
public void deleteCustomer(Integer id) {
SqlSession sqlSession = null;
try {
sqlSession = SessionUtils.getSesion();
sqlSession.delete("deleteCustomer", id);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
sqlSession.close();
} } @Override
public List<Customer> queryAllCustomer() {
SqlSession sqlSession = null;
try {
sqlSession = SessionUtils.getSesion();
return sqlSession.selectList("queryAllCustomer");
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
return null;
} @Override
public Customer queryCustomerById(Integer id) {
SqlSession sqlSession = null;
try {
sqlSession = SessionUtils.getSesion();
return sqlSession.selectOne("queryCustomerById", id);
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
return null;
} @Override
public List<Customer> queryCustomerByName(String name) {
SqlSession sqlSession = null;
try {
sqlSession = SessionUtils.getSesion();
return sqlSession.selectList("queryCustomerById", name);
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
return null;
} }

测试类:

package cn.sm1234.test;

import java.util.List;

import org.junit.Test;

import cn.sm1234.dao.CustomerDao;
import cn.sm1234.dao.impl.CustomerDaoImpl;
import cn.sm1234.domain.Customer; public class Demo1 { @Test
public void test1(){
Customer c = new Customer();
c.setName("陈六222");
c.setGender("男");
c.setTelephone("13244445555"); CustomerDao dao = new CustomerDaoImpl();
dao.saveCustomer(c);
} @Test
public void test2(){
Customer c = new Customer();
c.setId(1);
c.setName("李四"); CustomerDao dao = new CustomerDaoImpl();
dao.updateCustomer(c);
} @Test
public void test3(){
CustomerDao dao = new CustomerDaoImpl();
dao.deleteCustomer(14);
} @Test
public void test4(){
CustomerDao dao = new CustomerDaoImpl();
List<Customer> list = dao.queryAllCustomer();
for (Customer customer : list) {
System.out.println(customer);
}
} @Test
public void test5(){
CustomerDao dao = new CustomerDaoImpl();
Customer customer = dao.queryCustomerById(1);
System.out.println(customer);
} @Test
public void test6(){
CustomerDao dao = new CustomerDaoImpl();
List<Customer> list = dao.queryCustomerByName("%陈%");
for (Customer customer : list) {
System.out.println(customer);
}
}
}

Customer.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">
<!-- 该文件存放CRUD的sql语句 -->
<mapper namespace="test">
<!-- 添加 -->
<insert id="insertCustomer" parameterType="customer">
INSERT INTO t_customer(NAME,gender,telephone) VALUES(#{name},#{gender},#{telephone})
</insert> <!-- 修改 -->
<!-- parameterType传入对象,包含需要使用的值 -->
<update id="updateCustomer" parameterType="customer">
UPDATE t_customer SET NAME = #{name} WHERE id = #{id}
</update> <!-- 查询所有数据 -->
<!-- 输出映射 resultType -->
<!-- parameterType可以省略,resultType不可以省略 -->
<select id="queryAllCustomer" resultType="customer">
SELECT * FROM t_customer
</select> <!-- 根据id查询 -->
<select id="queryCustomerById" parameterType="_int" resultType="customer">
SELECT * FROM t_customer WHERE id=#{value}
</select> <!-- 根据name模糊查询 -->
<select id="queryCustomerByName" parameterType="string" resultType="customer">
<!-- 方法一 -->
SELECT * FROM t_customer WHERE NAME LIKE #{value}
<!-- 方法二 -->
<!-- SELECT * FROM t_customer WHERE NAME LIKE '%${value}%' -->
</select> <!-- 删除 -->
<delete id="deleteCustomer" parameterType="int">
DELETE FROM t_customer WHERE id=#{value}
</delete> </mapper>

缺点:代码繁琐。

解决方法:利用动态代理方式Dao接口开发。Dao层只需要接口,不需要重复的Dao层实现。

2.动态代理方式开发Dao层(推荐使用)

好处:无需再去编写Dao层的实现类。

Dao接口:

 package cn.sm1234.dao;

 import java.util.List;

 import cn.sm1234.domain.Customer;

 public interface CustomerDao {

     public void saveCustomer(Customer customer);

     public void updateCustomer(Customer customer);

     public void deleteCustomer(Integer id);

     public List<Customer> queryAllCustomer();

     public Customer queryCustomerById(Integer id);

     public List<Customer> queryCustomerByName(String name);
}

Customer.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">
<!-- 该文件存放CRUD的sql语句 -->
<!--
如果是动态代理方式
1)namespace必须和Dao接口的路径保持一致
2)Dao接口里面的方法和sql语句的id保持一致
3)Dao接口的方法的参数和返回值类型 和 映射文件的parameterType和resultType要对应
-->
<mapper namespace="cn.sm1234.dao.CustomerDao">
<!-- 添加 -->
<insert id="saveCustomer" parameterType="customer">
INSERT INTO t_customer(NAME,gender,telephone) VALUES(#{name},#{gender},#{telephone})
</insert> <!-- 修改 -->
<!-- parameterType传入对象,包含需要使用的值 -->
<update id="updateCustomer" parameterType="customer">
UPDATE t_customer SET NAME = #{name} WHERE id = #{id}
</update> <!-- 查询所有数据 -->
<!-- 输出映射 resultType -->
<!-- parameterType可以省略,resultType不可以省略 -->
<select id="queryAllCustomer" resultType="customer">
SELECT * FROM t_customer
</select> <!-- 根据id查询 -->
<select id="queryCustomerById" parameterType="_int" resultType="customer">
SELECT * FROM t_customer WHERE id=#{value}
</select> <!-- 根据name模糊查询 -->
<select id="queryCustomerByName" parameterType="string" resultType="customer">
<!-- 方法一 -->
SELECT * FROM t_customer WHERE NAME LIKE #{value}
<!-- 方法二 -->
<!-- SELECT * FROM t_customer WHERE NAME LIKE '%${value}%' -->
</select> <!-- 删除 -->
<delete id="deleteCustomer" parameterType="int">
DELETE FROM t_customer WHERE id=#{value}
</delete> </mapper>

测试代码:

 package cn.sm1234.test;

 import java.util.List;

 import org.apache.ibatis.session.SqlSession;
import org.junit.Test; import cn.sm1234.dao.CustomerDao;
import cn.sm1234.domain.Customer;
import cn.sm1234.utils.SessionUtils; public class Demo2 { @Test
public void test1(){
Customer c = new Customer();
c.setName("陈六333");
c.setGender("男");
c.setTelephone("13244445555"); SqlSession sqlSession = SessionUtils.getSession();
//getMapper(): 返回指定接口的动态代理的实现类对象
CustomerDao dao = sqlSession.getMapper(CustomerDao.class);
dao.saveCustomer(c);
sqlSession.commit();
sqlSession.close();
} @Test
public void test2(){
Customer c = new Customer();
c.setId(1);
c.setName("李四222"); SqlSession sqlSession = SessionUtils.getSession();
//getMapper(): 返回指定接口的动态代理的实现类对象
CustomerDao dao = sqlSession.getMapper(CustomerDao.class);
dao.updateCustomer(c);
sqlSession.commit();
sqlSession.close();
} @Test
public void test3(){
SqlSession sqlSession = SessionUtils.getSession();
CustomerDao dao = sqlSession.getMapper(CustomerDao.class);
dao.deleteCustomer(19);
sqlSession.commit();
sqlSession.close();
} @Test
public void test4(){
SqlSession sqlSession = SessionUtils.getSession();
CustomerDao dao = sqlSession.getMapper(CustomerDao.class);
List<Customer> list = dao.queryAllCustomer();
for (Customer customer : list) {
System.out.println(customer);
}
} @Test
public void test5(){
SqlSession sqlSession = SessionUtils.getSession();
CustomerDao dao = sqlSession.getMapper(CustomerDao.class);
Customer customer = dao.queryCustomerById(1);
System.out.println(customer);
} @Test
public void test6(){
SqlSession sqlSession = SessionUtils.getSession();
CustomerDao dao = sqlSession.getMapper(CustomerDao.class);
List<Customer> list = dao.queryCustomerByName("%陈%");
for (Customer customer : list) {
System.out.println(customer);
}
}
}

要点总结:

如果是动态代理方式
1)namespace必须和Dao接口的路径保持一致
2)Dao接口里面的方法和sql语句的id保持一致
3) Dao接口的方法的参数和返回值类型 和 映射文件的parameterType和resultType要对应

Mybatis进阶学习笔记——动态代理方式开发Dao接口、Dao层(推荐第二种)的更多相关文章

  1. Mybatis进阶学习笔记——动态sql

    1.if标签 <select id="queryByNameAndTelephone" parameterType="Customer" resultTy ...

  2. Mybatis框架基础入门(三)--Mapper动态代理方式开发

    使用MyBatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper动态代理开发方法. 原始Dao开发方法需要程序员编写Dao接口和Dao实现类,此方式开发Dao,存在以下问题: Dao方 ...

  3. Spring与MyBatis整合上_Mapper动态代理方式

         将MyBatis与Spring进行整合,主要解决的问题就是将SqlSessionFactory对象交由Spring来管理..所以该整合,只需将SQLSessionFactory的对象生成器S ...

  4. JS定义函数的2种方式以及区别简述(为什么推荐第二种方式)

     无意中看到了阮一峰大神多年前的一篇博客: 12种不宜使用的Javascript语法    看到第9条的时候受到了启发,感觉之前没怎么理解清楚的一些问题好像突然就清晰了,如下图 可能光这样看,有些小伙 ...

  5. Java学习笔记——动态代理

    所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记——RMI&q ...

  6. Java学习笔记--动态代理

    动态代理 1.JDK动态代理 JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy ...

  7. Mybatis进阶学习笔记——输入映射

    1.输入映射 输入映射支持的类型: 1) 基本的类型,int,String,double 等(*)2) JavaBean 类型(*)3) 包装JavaBean 类型(对象里面包含另一个对象) 1.1基 ...

  8. Mybatis进阶学习笔记——关系查询——一对多查询

    一个客户拥有多个订单 <resultMap type="User" id="UserOrderResultMap"> <id column=& ...

  9. Mybatis进阶学习笔记——关系查询——一对一查询

    用户和订单的需求 通过查询订单,查询用户,就是一对一查询 (1)自定义JavaBean(常用,推荐使用) <select id="queryOrderUser" result ...

随机推荐

  1. BZOJ2002[Hnoi2010]弹飞绵羊——LCT

    题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ...

  2. LOJ121 动态图连通性(LCT)

    用LCT维护一下删除时间的最大生成树即可.当然也可以线段树分治. #include<iostream> #include<cstdio> #include<cmath&g ...

  3. HNOI2017单旋

    单旋 这道题做法贼多,LCT,splay,线段树什么的貌似都行. 像我这种渣渣只会线段树了(高级数据结构学了也不会用). 首先离线所有操作,因为不会有两个点值重复,所以直接离散. 一颗线段树来维护所有 ...

  4. 【BZOJ2159】Crash的文明世界(第二类斯特林数,动态规划)

    [BZOJ2159]Crash的文明世界(第二类斯特林数,动态规划) 题面 BZOJ 洛谷 题解 看到\(k\)次方的式子就可以往二项式的展开上面考,但是显然这样子的复杂度会有一个\(O(k^2)\) ...

  5. 【转】C语言中,为什么字符串可以赋值给字符指针变量

    本文是通过几篇转帖的文章整理而成的,内容稍有修改: 一. C语言中,为什么字符串可以赋值给字符指针变量 char *p,a='5';p=&a;                     //显然 ...

  6. 洛谷 P3258 [JLOI2014]松鼠的新家 解题报告

    P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  7. sklearn 总结

    一张思维导图总结一下用到的大体模块:

  8. Java 多线程间通信

    JDK 1.5 以后, 将同步和锁封装成了对象, 并将操作锁的隐式方法定义到了该对象中, 将隐式动作变成了显示动作. Lock 接口 Lock 接口, 位于 java.util.concurrent. ...

  9. 20145215《网络对抗》Exp6 信息搜集与漏洞扫描

    20145215<网络对抗>Exp6 信息搜集与漏洞扫描 基础问题回答 哪些组织负责DNS,IP的管理? 全球根服务器均由美国政府授权的ICANN统一管理,负责全球的域名根服务器.DNS和 ...

  10. C# TextBox猜想输入和历史记录输入

    什么是猜想输入 当我们在使用查询应用时,输入某个关键字后文本框下面就会自动弹出跟此关键字相附的词组供我们选择,为我们节省了输入的时间,这就是猜想输入,例如:百度,谷歌,等等,如下图: 如上图所示,使用 ...