使用动态代理实现dao接口

  • 使用动态代理实现dao接口的实现类

MyBatis允许只声明一个dao接口,而无需写dao实现类的方式实现数据库操作。前提是必须保证Mapper文件中的<mapper>标签的namespace属性值必须要和dao接口的类路径一致,MyBatis容器会自动通过动态代理生成接口的实现类。

Mapper.java

 1 package cn.mybatis.dao;
 2
 3 import cn.mybatis.domain.Student;
 4
 5 public interface StudentMapper {
 6     public void insertStudent(Student s);
 7     public void updateStudent(Student s);
 8     public void deleteStudent(String stuid);
 9     public Student selectStudentById(String stuid);
10 }

Mapper.xml

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 4 <mapper namespace="cn.mybatis.dao.StudentMapper">
 5     <resultMap type="student" id="BaseResultMap">
 6         <id column="stu_id" property="stuId" jdbcType="VARCHAR" javaType="java.lang.String" />
 7         <result column="stu_name" property="stuName" jdbcType="VARCHAR" javaType="java.lang.String" />
 8         <result column="stu_birthdate" property="stuBirthdate" jdbcType="DATE" javaType="java.util.Date" />
 9         <result column="stu_phone" property="stuPhone" jdbcType="VARCHAR" javaType="java.lang.String" />
10     </resultMap>
11
12     <!-- 插入数据 -->
13     <insert id="insertStudent" parameterType="student">
14         insert into student (stu_id,stu_name,stu_birthdate,stu_phone)
15         values(#{stuId},#{stuName},#{stuBirthdate},#{stuPhone})
16     </insert>
17
18     <!-- 更新数据 -->
19     <update id="updateStudent" parameterType="student">
20         update student set stu_name=#{stuName}, stu_birthdate=#{stuBirthdate},
21         stu_phone=#{stuPhone} where stu_id=#{stuId}
22     </update>
23     <!-- 删除数据 -->
24     <delete id="deleteStudent" parameterType="string">
25         delete from student where stu_id=#{stuId}
26     </delete>
27
28     <!-- 查询数据,返回的数据会根据resultMap设置封装到实体类对象中 -->
29     <select id="selectStudentById" resultType="cn.mybatis.domain.Student" parameterType="string" >
30         select stu_name as stuName from student where stu_id=#{stuId}
31     </select>
32 </mapper>

测试

 1 package cn.mybatis.demo;
 2
 3 import java.io.InputStream;
 4 import java.text.SimpleDateFormat;
 5
 6 import org.apache.ibatis.io.Resources;
 7 import org.apache.ibatis.session.SqlSession;
 8 import org.apache.ibatis.session.SqlSessionFactory;
 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
10 import org.apache.log4j.Logger;
11
12 import cn.mybatis.dao.StudentMapper;
13 import cn.mybatis.domain.Student;
14
15 public class Demo_01 {
16     private static SqlSessionFactory fac;
17     static{
18         InputStream is = null;
19         try{
20             //处理并根据config配置文件实例化SqlSessionFactory
21             is = Resources.getResourceAsStream("SqlMapperConfig.xml");
22             //获取session工厂类
23             fac = new SqlSessionFactoryBuilder().build(is);
24         }catch(Exception e){
25             e.printStackTrace();
26             Logger.getLogger(Demo_01.class).debug(e.getMessage());
27         }
28     }
29     public static void main(String[] args) throws Exception {
30         //创建要保存的学生信息
31         Student s = new Student();
32         s.setStuId("5");
33         s.setStuName("zhou");
34         s.setStuBirthdate(new SimpleDateFormat("yyyy-MM-dd").parse("1991-1-12"));
35         s.setStuPhone("341324123");
36
37         SqlSession session = fac.openSession();
38         StudentMapper mapper = session.getMapper(StudentMapper.class);
39 //        mapper.insertStudent(s);
40 //        mapper.updateStudent(s);
41 //        mapper.deleteStudent("5");
42         Student s1 = mapper.selectStudentById("1");
43         System.out.println(s1.getStuName());
44         session.commit();
45         session.close();
46     }
47 }

原文地址:https://www.cnblogs.com/zhouyeqin/p/8359558.html

时间: 2024-11-14 12:35:07

使用动态代理实现dao接口的相关文章

MyBatis使用mapper动态代理实现DAO接口

工具: mysql 5.5.62   IDEA 参考自:https://www.cnblogs.com/best/p/5688040.html 遇到的问题: 无法读取src/main/java下配置文件, 解决方法参考自https://blog.csdn.net/qq_32778043/article/details/80746668 项目目录如下: 1   创建maven项目,添加jar包 首先不使用模板创建一个maven项目,groupid填com.admin,  artifactid为My

Spring的AOP实现使用的JDK的动态代理必须使用接口

今天,在项目中遇到一个问题,情况是这样的:在一个项目中,我配置了一个用以处理任务的工厂类,然后将这个工厂类注入到其他的service类中进行使用.在Spring中的配置如下: <bean id="linkingDetectService" class="cn.vobile.service.linkingdetect.LinkingDetectServiceImpl"> <property name="taskPriority"

MyBatis开发Dao的原始Dao开发和Mapper动态代理开发

摘自:https://www.cnblogs.com/yichunguo/p/11990961.html 目录 咳咳...初学者看文字(Mapper接口开发四个规范)属实有点费劲,博主我就废了点劲做了如下图,方便理解: 原始Dao开发方式 1. 编写映射文件 3.编写Dao实现类 4.编写Dao测试 Mapper动态代理方式 1.定义Mapper.xml(映射文件) 2.编写UserMapper.xml配置文件内容: 3.编写UserMapper(接口文件) 4.加载UserMapper.xml

Java动态代理——JDK和CGlib(简单易懂)

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6542259.html 一:代理模式(静态代理) 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由 业务实现类.业务代理类 两部分组成.业务实现类 负责实现主要的业务方法,业务代理类负责对调用的业务方法作拦截.过滤.预处理,主要是在方法中首先进行预处理动作,然后调用业务实现类的方法,还可以规定调用后的操作.我们在需要调用业务时,不是直接通过业

mapper 动态代理 注意事项

mapper 借口 同 dao 接头类似 mybatis 框架 会根据  接口定义 创建接口的动态代理对象 mapper 接口 开发 需要遵循 4个 开发 规范 mapper中的 映射文件的 namesapce 要与mapper接口的类路径相同 mapper 接口方法名  和 mapper映射文件中定义的每个sql 的 id 相同 mapper 接口方法的输入参数类型 和 mapper映射文件中 每个sql 定义的paramentType 的类型相同 mapper 接口 方法的输出参数类型和ma

Mybatis Mapper动态代理方式

目录结构及配置文件与原始dao方法相比更简便 只需一个UserMapper的接口,放在一起的配置文件,配置文件中namespace的地址确定jdk动态代理的对象 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybati

java动态代理和cglib动态代理

动态代理应用广泛,Spring,Struts等框架很多功能是通过动态代理,或者进一步封装来实现的. 常见的动态代理模式实现有Java API提供的动态代理和第三方开源类库CGLIB动态代理. Java API提供的动态代理是基于类反射实现的,用到的类有: java.lang.reflect.InvocationHandler; java.lang.reflect.Method; java.lang.reflect.Proxy; 其实现是通过Proxy类的newProxyInstance()方法产

java 动态代理示例,带主要注释

Java proxy是基于反射,仅仅支持基于接口的动态代理. java 动态代理是一切架构的基础,必须了解. 废话少说,先上代码获得感性认识. 示例代码有主要注释. 接口: public interface Subject { String hello(String name); void say();} 接口实现: public class ImpSubject implements Subject { @Override public String hello(String name){ r

Atitit 代理CGLIB&#160;动态代理&#160;AspectJ静态代理区别

Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为代表 1 1.2. JDK动态代理是模拟接口实现的方式,cglib是模拟子类继承的方式1 1.3. CGLIB代理模式的缺点 在static和final方法上应用横切关注点也是无法做到的.2 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以