首页 > 其他分享 >[MyBatis]DAO层只写接口,不用写实现类

[MyBatis]DAO层只写接口,不用写实现类

时间:2023-06-02 16:31:35浏览次数:35  
标签:xml mapper Object return DAO 接口 MyBatis method


团队开发一个项目,由老大架了一个框架,遇到了DAO层不用写接口了,我也是用了2次才记住这个事的,因为自己一直都是习惯于写DAO层的实现类,所以,习惯性的还是写了个实现类。于是遇到错误了。

找不到那个方法。问了团队的人才知道,方法名和Mapper中配置的id名必须一样。

实现:
一、配置Spring集成MyBatis:

<beans xmlns=“http://www.springframework.org/schema/beans”
 xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
 xmlns:p=“http://www.springframework.org/schema/p”…


<bean id=“dataSource” class=“com.alibaba.druid.pool.DruidDataSource”


要实现对数据库的操作必须要有sqlSession,而sqlSession是由sqlSessionFactory创建的。我们可以在spring配置好bean。

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
        p:basePackage="com.xiaojuzi.chaojijuhui.**.dao"
        p:sqlSessionFactoryBeanName="sqlSessionFactory" />

这个配置就是配置映射文件的路径,这样做的好处就是不用再写Dao的实现类了,也就是说,我们写好接口,写好配置文件,会自动映射到对应的方法和sql语句。

二、开发mapper.xml映射文件


在这里只有一个UserDao(被代理的接口)。
user.mapper.xml–namespace配置的就是UserDao的包全名。

三、开发mapper.java的接口
/**
* 根据用户的用户名查询用户
* @param user
* @return
*/
User queryUserByLoginName (String loginName);

/**
 * 用户通过手机号码去修改密码
 * @param userModel
 * @return
 */
Boolean updatePasswordByMobile(UserModel userModel);

如果需要特定类型的参数,就自己再造一个POJO类(例如:UserModel)。

u.id,
u.login_name as “loginName”,
u.head_img as “headImg”,

SELECT FROM juhui_user u WHERE u.login_name = #{loginName} and u.del_flag = #{DEL_FLAG_NORMAL} update juhui_user set update_date=DATE_FORMAT(#{updateDate}, '%Y-%m-%d %H:%i:%S'), salt = #{salt}, password = #{password} where mobile = #{mobile} 这里mapper.xml的(select、insert、update..)标签的id必须和DAO接口的方法名一样!

Mapper开发规则
1、 在mapper.xml中将namespace设置为mapper.Java的全限定名
2、 将mapper.java接口的方法名和mapper.xml中statement的id保持一致。
3、 将mapper.java接口的方法输入参数类型和mapper.xml中statement的parameterType保持一致
4、 将mapper.java接口的方法输出 结果类型和mapper.xml中statement的resultType保持一致

注意遵循上边四点规范!

这样抛弃Dao实现类的写法:
具有更好的可扩展性,提高了灵活度。

原理
再根据网上的一些知识点,讲一下原理:

mybatis通过JDK的动态代理方式,在启动加载配置文件时,根据配置mapper的xml去生成Dao的实现。

session.getMapper()使用了代理,当调用一次此方法,都会产生一个代理class的instance,看看这个代理class的实现.

public class MapperProxy implements InvocationHandler {
 …
 public static T newMapperProxy(Class mapperInterface, SqlSession sqlSession) {
 ClassLoader classLoader = mapperInterface.getClassLoader();
 Class<?>[] interfaces = new Class[]{mapperInterface};
 MapperProxy proxy = new MapperProxy(sqlSession);
 return (T) Proxy.newProxyInstance(classLoader, interfaces, proxy);
 }public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 if (!OBJECT_METHODS.contains(method.getName())) {
 final Class<?> declaringInterface = findDeclaringInterface(proxy, method);
 final MapperMethod mapperMethod = new MapperMethod(declaringInterface, method, sqlSession);
 final Object result = mapperMethod.execute(args);
 if (result == null && method.getReturnType().isPrimitive()) {
 throw new BindingException(“Mapper method '” + method.getName() + “’ (” + method.getDeclaringClass() + “) attempted to return null from a method with a primitive return type (” + method.getReturnType() + “).”);
 }
 return result;
 }
 return null;
 }


这里是用到了JDK的代理Proxy。 newMapperProxy()可以取得实现interfaces 的class的代理类的实例。

当执行interfaces中的方法的时候,会自动执行invoke()方法,其中public Object invoke(Object proxy, Method method, Object[] args)中 method参数就代表你要执行的方法.

MapperMethod类会使用method方法的methodName 和declaringInterface去取 sqlMapxml 取得对应的sql,也就是拿declaringInterface的类全名加上 sql-id…

总结:
这个就是利用JDK的代理类实现的。


标签:xml,mapper,Object,return,DAO,接口,MyBatis,method
From: https://blog.51cto.com/chengzheng183/6403974

相关文章

  • 【电商api接口淘宝系列分享】获得商品评论+获得淘宝店铺详情演示示例
    商品评论是电商平台中一个非常重要的功能,对于商家和消费者都具有重要的意义。以下是商品评论的重要性:帮助其他消费者做出购买决策:消费者在购物前往往会查看其他消费者对商品的评价,通过评论得知商品的好、坏之处,从而做出更准确的购买决策。提供商家改进产品的意见和建议:通过......
  • 【电商api接口系列分享】按关键字搜索商品演示示例
     在电商平台中,关键词推荐是提高用户购物体验和销售业绩的一个重要手段。它的重要性体现在以下几个方面:提升购物体验:通过关键词推荐,电商平台可以根据用户的搜索意图和行为来向其推荐相关的商品。这样可以帮助用户更快地找到自己需要的商品,提高购物体验和满意度。增加销售......
  • 如果还不懂如何使用 Consumer 接口,来青岛我当面给你讲!
    背景没错,我还在做XXXX项目,还在与第三方对接接口,不同的是这次是对自己业务逻辑的处理。在开发过程中我遇到这么一个问题:表结构:一张主表A,一张关联表B,表A中存储着表B记录的状态。场景:第一步创建主表数据,插入A表;第二步调用第三方接口插入B表同时更新A表的状态。此时大家应该都......
  • MyBatis常见好用的插件
    阅读文本大概需要3分钟。0x01:MybatisPageHelper分页插件在没有分页插件之前,写一个分页需要两条SQL语句,一条查询一条统计,然后才能计算出页码,这样的代码冗余而又枯燥,更重要的一点是数据库迁移,众所周知不同的数据库分页写法是不同的,而Mybatis不同于Hibernate的是它只提供动态SQL和结......
  • 在线教育_Day02-_项目环境搭建和讲师管理接口开发
    一、数据库设计1.1创建数据库创建数据库:自定义数据库名1.2创建数据表导入资料中的gl_edu.sql文件,创建表1.3数据库设计规约以下规约只针对本模块,更全面的文档参考《阿里巴巴Java开发手册》:五、MySQL数据库1、库名与应用名称尽量一致2、表名、字段名必须使用小写字母或数字,禁止出......
  • 在web应用中使用mybatis
    1. 实现功能:52银⾏账户转账1.1 使⽤技术:HTML + Servlet + MyBatis1.2 WEB应⽤的名称:bank2. 数据库表的设计和准备数据  523. 注意MyBatis对象作⽤域以及事务问题   573.1 MyBatis核⼼对象的作⽤域   573.1.1 SqlSessionFactoryBuilder这个类可以被实例化、使⽤......
  • 快手商品详情API接口如何使用
    使用快手开的API接口获取商品详情,可按照以下步骤进行:1.注册账号并创建应用注册开发者账号,并在账号后台中创建一个应用,获得AppKey和AppSecret等信息。这些信息是使用API接口访问快手平台资源的密钥,所以需要妥善保存。2.授权获取AccessToken使用AppKey和AppSecret授权获取Acces......
  • Hazelcast的ManagedService接口类执行顺序
    在Hazelcast中,ManagedService接口中定义的方法的执行顺序如下:init(NodeEnginenodeEngine,Propertiesproperties):此方法在服务初始化时调用,允许你执行一些初始化逻辑或设置。reset():此方法在服务重置时调用,允许你重置或清理服务的状态。partitionLost(intpartitio......
  • hazelcast的NodeExtension接口类所有定义的方法分析
    在Hazelcast中,NodeExtension接口是一个扩展点,用于自定义和定制节点级别的行为。它定义了以下方法:voidbeforeStart(Nodenode,Propertiesproperties)此方法在节点启动之前调用。它允许你在节点启动之前执行一些自定义逻辑或设置。node:当前节点的Node对象。properties:......
  • DP1040 DP国产代替TJA1040 CAN总线收发器接口芯片 SOP8
    1简述DP1040C是一款应用于CAN协议控制器和物理总线之间的接口芯片,可应用于卡车、公交、小汽车、工业控制等领域,速率可达到1Mbps,具有在总线与CAN协议控制器之间进行差分信号传输的能力,完全兼容“ISO11898”标准。2短路保护DP1040C的驱动级具有限流保护功能,以防止驱动电路短......