通过MyBatis操作数据库
MyBatis是一款优秀的持久层框架,同样也是做OR Mapping的。与JPA不同,MyBatis里面需要我们自己来定制sql。
MyBatis和JPA的选择
其实如果业务比较操作比较简单使用JPA加hibernate还是比较方便的。但是如果业务复杂即sql映射也复杂这个时候还是使用mybatis比较方便。另外在bat更多的使用是mybatis,这样dba对所写的业务sql能够有更强的把控。
SpringBoot中使用MyBatis
添加依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.4</version>
</dependency>
简单配置
- mybatis.mapper-locations:表示mapper的xml文件位置
- mybatis.type-aliases-package:类型别名的包名。这个配置是为了配置mapper的xml文件中resultType返回值的包的位置,如果未配置需要使用全包名
- mybatis.type-handlers-package:typeHandlers就是用来完成javaType和jdbcType之间的转换,举个比较简单的例子,我创建一个博客表,表中的创建时间和修改时间用VARCHAR类型,但是在我的POJO对象中,创建时间和修改时间的类型是Date,这样我在向数据库插入数据时,需要将日期类型转化成VARCHAR,而从数据库中查询出的结果中,又需要将VARCHAR类型转换成Date。MyBatis中的类型处理器也存在系统定义的和自定义两种,MyBatis会根据javaType和jdbcType来决定采用哪个typeHandler来处理这些转换规则,而且系统定义的能满足大部分需求,可以说是非常好用,用户只需要自定义一些特有的转换规则,如枚举类型。
- mybatis.configuration.map-underscore-to-camel-case:下划线与驼峰命名规则的对应关系
- mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl:控制台打印MyBatis执行sql
Mapper的定义与扫描
MyBatis中映射有两种 一种是使用xml一种是使用注解(两者的选择,对于简单的场景使用注解比较方便;但是对于复杂的查询业务还是使用xml的方式比较方便)。另外使用@MapperScan配置扫描Mapper文件的位置,使用@Mapper注解标识Mapper文件。如下代码是使用注解的使用定义的Mapper文件的映射,并使用@Mapper注解标识是Mapper文件。
/**
* Created by zhangdd on 2020/7/29
*/
@Mapper
public interface CoffeeMapper {
@Insert("insert into t_coffee (name, price, create_time, update_time)"
+ "values (#{name}, #{price}, now(), now())")
@Options(useGeneratedKeys = true)
Long save(Coffee coffee);
@Select("select * from t_coffee where id = #{id}")
@Results({
@Result(id = true, column = "id", property = "id"),
@Result(column = "create_time", property = "createTime"),
// map-underscore-to-camel-case = true 可以实现一样的效果
// @Result(column = "update_time", property = "updateTime"),
})
Coffee findById(@Param("id") Long id);
}
调用Mapper方法执行sql
package com.lucky.spring;
import com.lucky.spring.mapper.CoffeeMapper;
import com.lucky.spring.model.Coffee;
import lombok.extern.slf4j.Slf4j;
import org.joda.money.CurrencyUnit;
import org.joda.money.Money;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.lucky.spring.mapper")
@Slf4j
public class Application implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Autowired
private CoffeeMapper coffeeMapper;
@Override
public void run(String... args) throws Exception {
Coffee c = Coffee.builder().name("espresso")
.price(Money.of(CurrencyUnit.of("CNY"), 20.0)).build();
Long id = coffeeMapper.save(c);
log.info("Coffee {} => {}", id, c);
c = coffeeMapper.findById(id);
log.info("Coffee {}", c);
}
}
打印结果如下
2020-07-29 22:20:53.251 INFO 78971 --- [ main] com.lucky.spring.Application : Coffee 1 => Coffee(id=5, name=espresso, price=CNY 20.00, createTime=null, updateTime=null)
2020-07-29 22:20:53.265 INFO 78971 --- [ main] com.lucky.spring.Application : Coffee Coffee(id=1, name=espresso, price=CNY 20.00, createTime=Wed Jul 29 22:07:31 CST 2020, updateTime=Wed Jul 29 22:07:31 CST 2020)
可以看到有时候插入数据后,我们需要这个数据的ID;同时查询数据的时间格式不一定是我们所需要的。这些场景如何结局呢?如下:
时间返回格式 和 显示null值字段
#所有日期格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
# 所有字段都不过滤 null值也显示
spring.jackson.default-property-inclusion=always
获取插入数据的自增ID
使用注解的映射Mapper文件
使用@Options注解的useGeneratedKeys属性。useGeneratedKeys设为true是表示使用jdbc的getGeneratedKeys方法来取出数据的主键值(默认为false)
使用xml映射
同样也是使用 useGeneratedKeys 设置为true,keyProperty标记返回的主键值传递给某个具体的属性
<insert id="add2" parameterType="employee" useGeneratedKeys="true" keyProperty="id">
insert into employee(username) values(#{username})
</insert>
通过MyBatis操作数据库的更多相关文章
- JAVA - SpringBoot项目引用MyBatis操作数据库
JAVA - SpringBoot项目引用MyBatis操作数据库 1. 创建SpringBoot项目,参考:https://www.cnblogs.com/1285026182YUAN/p/1232 ...
- mybatis 操作数据库(05)
类型转换.动态排序,查询接口与mapper对应关系说明及其注意事项 一.MyBatis 自带写常见类型转换器.例如:java 类中 String 对应 mySQL中的varchar 二.自定义类型转换 ...
- MyBatis操作数据库(基本增删改查)
一.准备所需工具(jar包和数据库驱动) 网上搜索下载就可以 二.新建一个Java project 1.将下载好的包导入项目中,build path 2.编写MyBatis配置文件:主要填写prope ...
- spring-boot-route(八)整合mybatis操作数据库
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...
- Mybatis 操作数据库的主键自增长
本篇文章将研究mybatis 实现oracle主键自增的机制 首先我们看对于同一张student表,对于mysql,sql server,oracle中它们都是怎样创建主键的 在mysql中 crea ...
- 非Spring环境下使用Mybatis操作数据库的流程
准备工作 1, 导入mybatis-3.2.7.jar,mysql-connector-5.1.25-bin.jar两个jar包 2, 在数据库中创建一个db_test数据库,库中有一个表为use ...
- mybatis操作数据库
导入jar包 共13包 注意:mysql-connction的版本是5.1.7版低版本可能不行 2.编写配置文件 a. 配置连接数据库的文件 a.1创建数据库 user表 a.2配置文件目录 a.2. ...
- SpringBoot-(9)-MyBatis 操作数据库
这里仅仅以插入数据为例: 一, 创建基于MyBatis的项目 具体流程参考之前帖 二,创建Mapper接口 public interface AccountMapper { @Insert(" ...
- SpringBoot 整合Mybatis操作数据库
1.引入依赖: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId> ...
随机推荐
- 在java中捕获异常时,使用log4j打印出错误堆栈信息
当java捕获到异常时,把详细的堆栈信息打印出来有助于我们排查异常原因,并修复相关bug,比如下面两张图,是打印未打印堆栈信息和打印堆栈信息的对比: 那么在使用log4j输出日志时,使用org.apa ...
- day03 编程语言介绍
一.编程语言分类 目录 一.编程语言分类 1.低级语言 1.1机器语言 1.2.汇编语言 2.高级语言 2.1编译型语言(例:c语言) 2.2解释型语言(例:世界上最好的语言python) 3总结 二 ...
- DVWA学习记录 PartⅨ
XSS(DOM) 1. 题目 XSS,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在 ...
- classpath路径(转)
src不是classpath, WEB-INF/classes,lib才是classpathWEB-INF/ 是资源目录, 客户端不能直接访问, 这话是没错,不过现在的IDE编译器在编译时会把src下 ...
- JVM 专题六:运行时数据区(一)概述
1. 运行时数据区架构图 2. 内存 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了JAVA在运行过程中内存申请.分配.管理的策略, ...
- python 并发专题(六):协程相关函数以及实现(gevent)
文档资源 http://sdiehl.github.io/gevent-tutorial/ 一.协程实现 线程和协程 既然我们上面也说了,协程也被称为微线程,下面对比一下协程和线程: 线程之间需要上下 ...
- Python之爬虫(七)正则的基本使用
什么是正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是 事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符”,这个“规则字符” 来表达对字符的一种过滤逻辑. 正则并不是pyth ...
- bzoj4582[Usaco2016 Open]Diamond Collector
bzoj4582[Usaco2016 Open]Diamond Collector 题意: n个钻石,每个都有一个大小,现在将其装进2个盒子里,每个盒子里的钻石最大的与最小的大小不能超过k,问最多能装 ...
- 聊聊Mysql主从同步读写分离配置实现
Hi,各位热爱技术的小伙伴您们好,好久没有写点东西了,今天写点关于mysql主从同步配置的操作日志同大家一起分享.最近自己在全新搭建一个mysql主从同步读写分离数据库简单集群,我讲实际操作步骤整理分 ...
- Spring Bean的生命周期 ---附详细流程图及测试代码
一.生命周期流程图: Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,这其中包含了一系列关键点 假设一个Bean实现了所有的接口,大的概况一下Be ...