当前位置: 首页 > news >正文

Mybatis,动态代理方式的CRUD

1. 如何实现mapper.xml文件和接口中方法的映射关系

如图所示:一一对应,完全一致

namespace=接口的全类名

id=方法名

parameterType=参数类型,resultType=返回类型

 mapper.xml和接口放在同一个包里面:

 2. 别名

 使用package,会制动将该包中的所有类批量定义别名:别名就是类名(不带包名)

3. 类型处理器

  例如StringTypeHandler会自动把char类型转换为varchar类型

示例:实体类和数据库表的字段类型不同,进行转换

如上面约定:true为男=》数据库中为1,false=》数据库中为0

3.1 自定义类型转换器(boolean->number)步骤【java类型=>jdbc数据库类型】

  1.  创建转换器:需要实现TypeHandler接口
  2. 实现TypeHandler接口太复杂,我们实现他的实现类BaseTypeHandler
  3. 第一个set方法,如图:
  4. 其他get方法,如图:
  5. 新建列sex,性别
  6.  配置:

 

 4. resultMap

如果 类中属性和表中的字段类型能够合理识别(String-varchar),则可以使用resultType,否则(boolean-number)使用resultMap

如果类中属性名和表中的字段名能够合理识别(stuNo-stuno)则可以使用resultType;否则(id-stuno)使用resultMap

 上诉情况,需要使用resultMap

 ClientDao层代码如下:方法名和ClientMapper.xml文件中标签的id一致

5. 实现代码:类型转换(t_clientt_sex是integer类型,Client的sex属性是Boolean类型)以及在查询返回结果封装时,属性名与字段名不一致

实现步骤:

1. 使用上面创建的表t_client、Client类和ClientMapper.xml文件

 注意对于sex字段,在mapper文件中,resultMap标签,以及insert标签中,都要加上javaType和jdbcType属性,如图所示

(jdbcType属性值:Interger要全部大写)

 

2. 如图:

 其中的typeHandler标签的handler属性值,是上诉类型转换器,代码如下

package com.lyx.mybatis.change;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class BooleanToIntConverter extends BaseTypeHandler<Boolean> {
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Boolean aBoolean, JdbcType jdbcType) throws SQLException {
        if (aBoolean) {
            preparedStatement.setInt(i, 1);
        } else {
            preparedStatement.setInt(i, 0);
        }
    }

    @Override
    public Boolean getNullableResult(ResultSet resultSet, String s) throws SQLException {
        int anInt = resultSet.getInt(s);
        return anInt == 1 ? true : false;
    }

    @Override
    public Boolean getNullableResult(ResultSet resultSet, int i) throws SQLException {
        int anInt = resultSet.getInt(i);
        return anInt == 1 ? true : false;
    }

    @Override
    public Boolean getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        int anInt = callableStatement.getInt(i);
        return anInt == 1 ? true : false;
    }
}

3. 测试

import com.lyx.mybatis.dao.ClientDao;
import com.lyx.mybatis.entity.Client;
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 java.io.IOException;
import java.io.Reader;

public class ClientTest {
    public static void main(String[] args) throws IOException {
        Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        Client client = new Client("liuyuxin","123456",14,true);
        ClientDao mapper = sqlSession.getMapper(ClientDao.class);
        int i = mapper.insertClient(client);
        if(i!=0){
            System.out.println("增加成功!");
        }
        sqlSession.commit();
    }
}

相关文章:

  • Linux 进程管理类
  • 魔法方阵(CSP-J模拟赛)
  • 线上服务宕机,码农试用期被毕业,原因竟是给MySQL加个字段
  • 【axios】二次封装——避免重复发送请求
  • 没有那么难,基于 Echarts + Python Flask 动态实时大屏轻松可以实现
  • 【每日一算法】高精度算法 | 加法 | 减法_模板应用
  • 2022华为杯A题第一问详细思路
  • Qt5.14.2开发Mqtt应用程序
  • 【U3D小游戏】愤怒的小鸟(三)猪的相关
  • 【UEFI实战】LinuxBoot
  • Linux: kernel: 调试:DYNAMIC_DEBUG
  • 开发一个Canvas小游戏 实现一个游戏“引擎”
  • Java Spring MVC框架 II
  • Python注释、Python风格规范
  • 算法面试题——给定一个只包括 ‘(‘,‘)‘,‘{‘,‘}‘,‘[‘,‘]‘ 的字符串 s ,判断字符串是否有效。
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • java2019面试题北京
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Netty源码解析1-Buffer
  • October CMS - 快速入门 9 Images And Galleries
  • Otto开发初探——微服务依赖管理新利器
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • SpingCloudBus整合RabbitMQ
  • tweak 支持第三方库
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • vue的全局变量和全局拦截请求器
  • vue总结
  • webpack+react项目初体验——记录我的webpack环境配置
  • win10下安装mysql5.7
  • 基于Android乐音识别(2)
  • 全栈开发——Linux
  • 使用权重正则化较少模型过拟合
  • 自定义函数
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #Linux(权限管理)
  • #Ubuntu(修改root信息)
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (2)Java 简介
  • (day 12)JavaScript学习笔记(数组3)
  • (二)Linux——Linux常用指令
  • (二十三)Flask之高频面试点
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (一)RocketMQ初步认识
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .Net6 Api Swagger配置
  • .NET项目中存在多个web.config文件时的加载顺序
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48