一个C#开发编写Java框架的心路历程(二)

简介: 本文主要描述我作为一个C#开发者,在编写Java框架时的一些心得感悟。 因为我是C#的开发者,所以,在编写Java框架时,或多或少会带入一些C#的固有观念,所以,这也是一个C#观念与Java观念碰撞的一个框架。

06

代码实现——数据库


在本框架中,数据库链接使用Mybatis开源包。

Mybatis学习

在使用mybatis之前需要先学习一些知识,搞懂mybatis的一些类库的关系,不然用起来会很迷茫。

mybatis:一个java的orm包。

mybatis-spring-boot-starter:一个mybatis工作组为了spring单独开发的包,他让spring框架使用mybatis更简单,springBoot,springCloud等框架都可以用(映射使用注解@mapper,最新版 2.1.2)。

mybatis-plus:一个基于mybatis的扩展包,拥有一些在mapper创建后,会自带一些基础的增删改查的方法。

mybatis-plus-boot-starter:mybatis-plus工作组为了spring单独开发的包,,他让spring框架使用mybatis-plus更简单,springBoot,springCloud等框架都可以用(映射使用继承BaseMapper,最新版3.42,mybatisplus-springboot-starter是mybatis-plus-boot-starter的增强包)。

了解了以上概念后,我们可得知,在springboot项目中使用mybatis,我们有两个选择,即使用mybatis-spring-boot-starter或mybatis-plus-boot-starter。

因为我是C#出身,所以,映射我更倾向于继承,所以下面代码使用的是mybatis-plus-boot-starter。

Mybatis配置

在resources/application.yml下输入配置代码如下:


server:
  port: 8088
spring:
  servlet:
    multipart:
      max-file-size: 5000MB
      max-request-size: 5000MB
  datasource:
    driver-class-name: oracle.jdbc.OracleDriver
    url: jdbc:oracle:thin:@192.168.1.1:1521/orcl
    username: abc
    password: 123
# mybatis
mybatis:
  mapper-locations: classpath:mapper/**/*.xml


代码中配置了Spring节点下的数据源,配置为Oracle并设置链接账户密码;还配置了mybatis节点下的映射路径。该映射路径下面会用到。

然后配置启动类,增加注解@MapperScan("com.kiba.k_framework.mapper"),如下图:

24.png


数据库实体

接着我们建立数据库实体,属性跟数据库表字段一样即可。但Java里写属性太麻烦,所以这里使用了@Data注解,被注解的类下,只要写私有字段即可,编译时会为我们生成首字母大写的属性,并且编写代码时,还可以点出【getName()/setName()】这样的方法来获取或设置属性的值。代码如下:

package com.kiba.k_framework.entity;
import lombok.Data;
@Data
public class Kiba_User {
    private int id;
    private String name;
}


如果是第一次使用Idea,我们编写代码时,在对象的后面是点不出【getName()/setName()】这样的方法的,这是因为,我们没有安装lombok插件,安装插件在File—Setting中,如下图所示。

25.png


映射类

映射类,顾名思义,就是建立实体与数据库关系的类,在这里类中会指定实体类与数据库表的关系,和实体字段和表字段的关系(通常情况是同名映射)。不过在Java里,映射类除了要处理映射关系,还要担任数据库访问的角色,而C#的映射类就是处理映射关系,访问数据库则有数据库上下文实体负责,说实话,Java这种模式是有点奇怪,不过用久了也就无所谓了。

映射类代码如下:

public interface Kiba_UserMapper extends BaseMapper<Kiba_User> {
    @Select("select * from Kiba_User")
    List<Kiba_User> test();
    @Select("select * from Kiba_User where id=#{value}")
    List<Kiba_User> test2(Integer id);
    List<Kiba_User> test3(Integer id);
}


如上代码所示,映射类通过继承泛型BaseMapper 实现了数据库实体和表的映射。

然后代码里定义了三个方法,都是查询数据库数据。

第一个方法—test:在方法上加了@Select注解,并且在注解里编写sql语句,这样调用这个方法时,就会执行注解里的语句。

第二个方法—test2:方法2多了一个入参,注解里多了一个查询条件, 注解里通过#{value}的方式使用了入参的值。看到这,我们可以发现,注解里有自己的方言,即注解里还有一套自己的语法,这显然明目张胆的增加了开发者的学习内容,我表示反对,但无效。

第二个方法—test3:这个方法没有注解,但有对应的XML配置文件,什么是XML配置文件?

如下图所示,里面有两个同名,但后缀名不同的文件,下方的Kiba_UserMapper.xml文件就是,Kiba_UserMapper.java的xml配置文件,这两个文件编译的时候会被捏成一个类。系统根据什么把他们捏一起的呢?还记得我们上面的配置吗?我们配置了一个映射扫描包和一个映射配置路径,系统就是根据它俩的扫描文件结果,然后把同名的捏到一起的。

26.png


现在我们看一下Kiba_UserMapper.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" >
<mapper namespace="com.kiba.k_framework.mapper.Kiba_UserMapper"> 
    <select id="test3" resultType="com.kiba.k_framework.entity.Kiba_User" parameterType="Integer">
        select * from Kiba_User where id=#{value}
    </select>  
</mapper>

如代码所示,在mapper标签里配置了命名空间——com.kiba.k_framework.mapper.Kiba_UserMapper,即它明确指定了这个XML要和谁捏在一起。(java里命名空间+类名还是命名空间)

然后在mapper标签里配置了一个select标签,【id="test3"】标记了它对应的函数名,resultType和parameterType标签标识这他们对应的这个函数传入传出类型,然后内容是一个带方言的sql语句。

看到这里,我们可以得出,这个xml的select标签是等于@select注解的,即为函数设置sql语句有两种方式,一种是注解一种是xml文件配置,因为上面的映射类中的前两个方法已经有注解了,所以,xml配置文件中并没有重复配置。

业务域

现在我们在业务域里使用一下映射类来获取数据。

代码如下:

public class GetUserQueryHandler implements IHandler
{
    @Override
    public GetUserQueryReuslt Excute(String commandJson, SqlSession sqlSession)     {
        Kiba_UserMapper mapper = sqlSession.getMapper(Kiba_UserMapper.class);
        List<Kiba_User> users = mapper.test();
        GetUserQueryReuslt ret=new GetUserQueryReuslt();
        ret.setUsers(users);
        ret.setSuccess(true);
        return ret;
    }
}


这里使用sqlSession.getMapper(Kiba_UserMapper.class)来获取我们的maper实例,然后下面就可以正常调用他下面的方法了。

测试

现在我们启动项目,用postman测试一下。

输入http://localhost:8088/Command/Get?commandName=GetUserQuery&commandJson={}进行测试,得到结构如下图所示:

27.png


测试成功,我们成功的通过发送DTO实体实现了业务查询。

结语

Java的错误提示、开发工具的使用、工程文件的管理等等都很不友好。Spring框架看上去很简洁,但因为这些不友好的朋友在中间阻碍着,整体的开发进度,并没有想象中那么快速。


到此Java框架的开发就已经介绍完了,代码已经传到Github上了,欢迎大家下载。

Github地址:https://github.com/kiba518/Kiba_Java_Framework

本文作者:kiba518,全栈.Net软件工程师

声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。

相关文章
|
10天前
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
47 5
|
14天前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
181 70
|
4天前
|
人工智能 Java 定位技术
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
本文详细讲解了Java开发者如何基于Spring AI Alibaba框架玩转MCP(Model Context Protocol),涵盖基础概念、快速体验、服务发布与调用等内容。重点包括将Spring应用发布为MCP Server(支持stdio与SSE模式)、开发MCP Client调用服务,以及在Spring AI Alibaba的OpenManus中使用MCP增强工具能力。通过实际示例,如天气查询与百度地图路线规划,展示了MCP在AI应用中的强大作用。最后总结了MCP对AI开发的意义及其在Spring AI中的实现价值。
135 9
|
1月前
|
机器学习/深度学习 人工智能 NoSQL
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
随着大模型的越来越盛行,现在很多企业开始接入大模型的接口,今天我从java开发角度来写一个demo的示例,用于接入DeepSeek大模型,国内的大模型有很多的接入渠道,今天主要介绍下阿里云的百炼模型,因为这个模型是免费的,只要注册一个账户,就会免费送百万的token进行学习,今天就从一个简单的可以执行的示例开始进行介绍,希望可以分享给各位正在学习的同学们。
237 3
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
|
27天前
|
人工智能 Java 物联网
没有好的学历,Java开发未来的路应该怎么走?
在数字化时代,Java开发者即使没有高学历,也能通过拥抱新兴技术(如大模型应用与鸿蒙系统开发)、积累实战经验、持续学习新技能等途径实现职业突破。从参与开源项目到关注行业动态,再到规划技术专家或管理路线,建立人脉网络并利用教育平台提升能力,开发者可拓宽技术边界,适应日新月异的技术需求,在未来发展中占据一席之地。
|
5天前
|
人工智能 Java 定位技术
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
本文以原理与示例结合的形式讲解 Java 开发者如何基于 Spring AI Alibaba 框架玩转 MCP。
|
1月前
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
93 3
|
18天前
|
存储 安全 Java
Java 集合框架详解:系统化分析与高级应用
本文深入解析Java集合框架,涵盖List、Set、Map等核心接口及其常见实现类,如ArrayList、HashSet、HashMap等。通过对比不同集合类型的特性与应用场景,帮助开发者选择最优方案。同时介绍Iterator迭代机制、Collections工具类及Stream API等高级功能,提升代码效率与可维护性。适合初学者与进阶开发者系统学习与实践。
45 0
|
25天前
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
|
1月前
|
存储 并行计算 Java
java 中的fork join框架
Java中的Fork Join框架于Java 7引入,旨在提升并行计算能力。它通过“分而治之”的思想,将大任务拆分为多个小任务(fork),再将结果合并(join)。核心组件包括:ForkJoinPool(管理线程池和工作窃取机制)、ForkJoinWorkerThread(执行具体任务的工作线程)和ForkJoinTask(定义任务逻辑,常用子类为RecursiveAction和RecursiveTask)。框架支持通过invoke、fork/join等方式提交任务,广泛应用于高性能并发场景。
下一篇
oss创建bucket