数据治理之springboot项目入门
controller和service交互
- @Autowired自动装载service的服务
- @Service标记该服务已上线
为什么@Autowired要使用接口而不是实现类?
- 解耦:使用时只需要知道哪些功能需要使用即可,不需要知道功能是如何实现的
- 实现类可以是本地的不同实现类实现,通过@Qualifier(“别名”)进行指定。也可以是远程的实现类,通过注册中心进行指定。
mybatis数据层
- 创建mapper包
- 创建表名+mapper类
- 根据根据业务需求,以select, insert, update, delete来命名方法
- 使用@Param(“cus”)在参数列表中获取参数
- 使用@Insert(“拼接SQL”), 使用#{cus}的形式来使用参数
- #{参数名}: 半自动指代符,自动判断变量的类型,来决定是否加入单引号,适用于纯参数传递,不包含语法
- ${SQL语句}: 不做任何判断,使用传递SQL语句
- 在接口类上面加上注解@Mapper, mybatis会帮你创建实现类
mybatis-plus框架
在mybatis的基础上,封装了 很多现成的插删改查的方法。
- 凡是单表的插删改查,不用程序员自己写SQL,直接使用现成的方法即可。
- 如果包含了Join, union子查询等复杂查询。还要使用mybatis自己编写SQL。
- 帮你封装Service层的代码,自动生成相应代码。
- impl类继承extends ServiceImpl<数据层mapper类, bean类>
- 接口类继承extends IService<bean类>
使用
- 添加mybatis-plus依赖
- 继承BaseMapper<自定义bean对象>
- 在Service层使用mapper对象调用现成的插删改查方法即可
- 查询操作的参数为QueryWrapper, 用于存放各种查询条件,常见的条件为eq, gt, lt, ge, le
- new QueryWrapper().eq(“数据库字段名”, 函数变量)
- mapper.selectList(wrapper);
代码生成器
- 引入依赖mybatis-plus-generator 和模板velocity-engine-core + freemarker
- 工具类CodeGen3531, 3531是模板号
public static void main(String[] args) {
// String[] tables={ "governance_metric","governance_type","governance_assess_detail"};
// String[] tables={ "t_ds_task_definition","t_ds_task_instance"};
// String[] tables={ "governance_assess_table","governance_assess_tec_owner","governance_assess_global"};
String[] tables={ "table_meta_info","table_meta_info_extra" };
FastAutoGenerator.create("jdbc:mysql://hadoop102:3306/dga","root","000000")
.globalConfig(builder -> {
builder.author("zhangchen") //作者
.outputDir("D:\\Code\\code_java\\data-governance-assesment\\src\\main\\java") //输出路径(写到java目录)
.commentDate("yyyy-MM-dd")
.dateType(DateType.ONLY_DATE); //选择实体类中的日期类型 ,Date or LocalDatetime
})
.packageConfig(builder -> { //各个package 名称
builder.parent("com.atguigu.dga")
.moduleName("meta")
.entity("bean")
.service("service")
.serviceImpl("service.impl")
.controller("controller")
.mapper("mapper");
})
.strategyConfig(builder -> {
builder.addInclude(tables)
.serviceBuilder()
.formatServiceFileName("%sService") //类后缀
.formatServiceImplFileName("%sServiceImpl") //类后缀
.entityBuilder()
.enableLombok() //允许使用lombok
.controllerBuilder()
.formatFileName("%sController") //类后缀
.enableRestStyle() //生成@RestController 否则是@Controller
.mapperBuilder()
//生成通用的resultMap 的xml映射
.enableBaseResultMap() //生成xml映射
.superClass(BaseMapper.class) //标配
.formatMapperFileName("%sMapper") //类后缀
.enableFileOverride() //生成代码覆盖已有文件 谨慎开启
.mapperAnnotation(Mapper.class) ; //生成代码Mapper上自带@Mapper
})
.templateConfig(new Consumer<TemplateConfig.Builder>() {
@Override
public void accept(TemplateConfig.Builder builder) {
// 实体类使用我们自定义模板
builder.entity("templates/myentity.java");
}
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
JSON工具
- fastjson, 阿里出品
- gson,谷歌出品
- jackson,apche出品
FastJson
- java对象转为Json字符串:JSON.toJSONString(obj)
- json字符串解析为java对象:
- 单值对象{}的json,转换成自定义的bean:parseObject(obj, Customer.class)
- 多值对象JSON.parseArray()
动态数据源
- 添加依赖
- 修改application.properties文件
- 使用@DS(“数据库名”)来指定Service层和Mapper层的数据库
日志
- 日志级别:低级会包含高级别的信息,trace最低,fatal最高,一般很少用。
- trace
debug
info
warn
error
- fatal
- 调整日志级别
logging.level.root=info #全局日志级别
logging.level.com.atguigu.dga.meta.mapper=debu #数据层日志级别,为了查看SQL
连接池
作用:复用
参数 | 作用 |
---|---|
initial-size | 初始连接数 |
min-idle | 最少保持空闲连接数 |
max-active | 最大可活动的连接数 |
max-wait | 最长等待时长 |
test-on-borrow | 借走时测试 |
test-while-idle | 空闲时测试 |
test-on-return | 归还时测试 |
# druid的多数据源配置和多数据源插件的自动配置有冲突,排除掉druid的配置
spring.autoconfigure.exclude=com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
spring.datasource.dynamic.datasource.demo.url=jdbc:mysql://hadoop102:3306/dga?characterEncoding=utf-8&useSSL=false
spring.datasource.dynamic.datasource.demo.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.demo.username=root
spring.datasource.dynamic.datasource.demo.password=000000
spring.datasource.dynamic.datasource.demo.druid.initial-size=5
spring.datasource.dynamic.datasource.demo.druid.min-idle=5
spring.datasource.dynamic.datasource.demo.druid.max-active=20
spring.datasource.dynamic.datasource.demo.druid.max-wait=60000
spring.datasource.dynamic.datasource.demo.druid.test-on-borrow=true
spring.datasource.dynamic.datasource.demo.druid.test-while-idle=true
spring.datasource.dynamic.datasource.demo.druid.test-on-return=false
#spring.datasource.dynamic.datasource.demo2.url=jdbc:mysql://hadoop102:3306/atguigu?characterEncoding=utf-8&useSSL=false
#spring.datasource.dynamic.datasource.demo2.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.dynamic.datasource.demo2.username=root
#spring.datasource.dynamic.datasource.demo2.password=000000
#spring.datasource.dynamic.datasource.demo2.druid.initial-size=5
#spring.datasource.dynamic.datasource.demo2.druid.min-idle=5
#spring.datasource.dynamic.datasource.demo2.druid.max-active=20
#spring.datasource.dynamic.datasource.demo2.druid.max-wait=60000
#spring.datasource.dynamic.datasource.demo2.druid.test-on-borrow=true
#spring.datasource.dynamic.datasource.demo2.druid.test-while-idle=true
#spring.datasource.dynamic.datasource.demo2.druid.test-on-return=false