Mybatis进阶学习笔记——动态代理方式开发Dao接口、Dao层(推荐第二种)
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层(推荐第二种)的更多相关文章
- Mybatis进阶学习笔记——动态sql
1.if标签 <select id="queryByNameAndTelephone" parameterType="Customer" resultTy ...
- Mybatis框架基础入门(三)--Mapper动态代理方式开发
使用MyBatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper动态代理开发方法. 原始Dao开发方法需要程序员编写Dao接口和Dao实现类,此方式开发Dao,存在以下问题: Dao方 ...
- Spring与MyBatis整合上_Mapper动态代理方式
将MyBatis与Spring进行整合,主要解决的问题就是将SqlSessionFactory对象交由Spring来管理..所以该整合,只需将SQLSessionFactory的对象生成器S ...
- JS定义函数的2种方式以及区别简述(为什么推荐第二种方式)
无意中看到了阮一峰大神多年前的一篇博客: 12种不宜使用的Javascript语法 看到第9条的时候受到了启发,感觉之前没怎么理解清楚的一些问题好像突然就清晰了,如下图 可能光这样看,有些小伙 ...
- Java学习笔记——动态代理
所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记——RMI&q ...
- Java学习笔记--动态代理
动态代理 1.JDK动态代理 JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy ...
- Mybatis进阶学习笔记——输入映射
1.输入映射 输入映射支持的类型: 1) 基本的类型,int,String,double 等(*)2) JavaBean 类型(*)3) 包装JavaBean 类型(对象里面包含另一个对象) 1.1基 ...
- Mybatis进阶学习笔记——关系查询——一对多查询
一个客户拥有多个订单 <resultMap type="User" id="UserOrderResultMap"> <id column=& ...
- Mybatis进阶学习笔记——关系查询——一对一查询
用户和订单的需求 通过查询订单,查询用户,就是一对一查询 (1)自定义JavaBean(常用,推荐使用) <select id="queryOrderUser" result ...
随机推荐
- Luogu3804 【模板】后缀自动机(后缀自动机)
建出parent树统计即可.开始memcpy处写的是sizeof(son[y]),然后就T掉了……还是少用这种东西吧. 同时也有SA做法.答案子串一定是名次数组中相邻两个串的lcp.单调栈统计其是几个 ...
- AtCoder Regular Contest 063 F : Snuke’s Coloring 2 (线段树 + 单调栈)
题意 小 \(\mathrm{C}\) 很喜欢二维染色问题,这天他拿来了一个 \(w × h\) 的二维平面 , 初始时均为白色 . 然后他在上面设置了 \(n\) 个关键点 \((X_i , Y_i ...
- php laravel 多条件筛选
效果如图,点击的条件出现在已选择的地方,点击已选择的条件可以删除当前点击的条件 语言是php 框架是laravel. 一.html <div class="doctor-conditi ...
- sql server 小技巧(1) 导入csv数据到sql server
1. 右击 DataBaseName,选择 Tasks->Import Data 2. 选择数据源: Flat File Source , 选择一个csv文件 Advance: 选择所有的列,改 ...
- 51nod1237 最大公约数之和 V3
题意:求 解: 最后一步转化是因为phi * I = Id,故Id * miu = phi 第二步是反演,中间省略了几步... 然后就这样A了......最终式子是个整除分块,后面用杜教筛求一下phi ...
- Java:终于找到了在alloy中的JFileChooser中的弹出式菜单不显示文字的解决办法
alloy界面可以说是我写过的最漂亮的一种JAVA界面. 可惜不知为什么,至从几年前推出1.4版后,就再也没有更新了. 随着java版本的升级,一直很担心alloy有一天不再适用于java的最新版. ...
- c/c++ 整形转字符串
int findex;char instr[10]; sprintf(instr,"%d",findex); 好像ltoa用不了...
- EClipse for PHP 中文乱码问题
UTF-8 格式的php,中文都是乱码. 如果此时在EClipse中输入中文会有 CP1252 错误( CP1252不支持xxxx ) 解决方法: windows->preferences-&g ...
- C++中hpp的适用
本文第一部分转载百度百科,在此感谢百度.第二部分示例为独立编写. hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即 ...
- java中各种时间公式
/** * 返回当前时间 * * @return 返回当前时间 */ public static Date getCurrentDateTime() { java.util.Calendar calN ...