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"),如下图:
数据库实体
接着我们建立数据库实体,属性跟数据库表字段一样即可。但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中,如下图所示。
映射类
映射类,顾名思义,就是建立实体与数据库关系的类,在这里类中会指定实体类与数据库表的关系,和实体字段和表字段的关系(通常情况是同名映射)。不过在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配置文件,这两个文件编译的时候会被捏成一个类。系统根据什么把他们捏一起的呢?还记得我们上面的配置吗?我们配置了一个映射扫描包和一个映射配置路径,系统就是根据它俩的扫描文件结果,然后把同名的捏到一起的。
现在我们看一下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={}进行测试,得到结构如下图所示:
测试成功,我们成功的通过发送DTO实体实现了业务查询。
结语
Java的错误提示、开发工具的使用、工程文件的管理等等都很不友好。Spring框架看上去很简洁,但因为这些不友好的朋友在中间阻碍着,整体的开发进度,并没有想象中那么快速。
到此Java框架的开发就已经介绍完了,代码已经传到Github上了,欢迎大家下载。
Github地址:https://github.com/kiba518/Kiba_Java_Framework
本文作者:kiba518,全栈.Net软件工程师
声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。