原文链接:

简介

MyBatis 官网 是这么介绍它自己的:

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

示例代码

依赖

这里仅展示和 MyBatis 相关的数据库依赖项,完整的示例,在文末会附上项目代码链接。

  1. <!--mysql-->
  2. <dependency>
  3. <groupId>mysql</groupId>
  4. <artifactId>mysql-connector-java</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.mybatis.spring.boot</groupId>
  8. <artifactId>mybatis-spring-boot-starter</artifactId>
  9. <version>2.1.0</version>
  10. </dependency>

spring-boot-start 系列的包,真是给 Spring Boot 开发带来了极大的便利,它的项目地址是:

配置

创建 users 表的 SQL:

  1. SET FOREIGN_KEY_CHECKS=0;
  2. -- ----------------------------
  3. -- Table structure for `users`
  4. -- ----------------------------
  5. DROP TABLE IF EXISTS `users`;
  6. CREATE TABLE `users` (
  7. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  8. `userName` varchar(32) DEFAULT NULL COMMENT '用户名',
  9. `passWord` varchar(32) DEFAULT NULL COMMENT '密码',
  10. `user_sex` varchar(32) DEFAULT NULL,
  11. `nick_name` varchar(32) DEFAULT NULL,
  12. PRIMARY KEY (`id`)
  13. ) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;
  14. -- ----------------------------
  15. -- Records of sys_user
  16. -- ----------------------------
  17. INSERT INTO `users` VALUES (1,'michael翔', '123', 'MAN', 'zx');
  18. INSERT INTO `users` VALUES (2,'张小敬', '123', 'MAN', 'zxj');
  19. INSERT INTO `users` VALUES (3,'李司辰', '123', 'MAN', 'lsc');
  20. INSERT INTO `users` VALUES (4,'崔器', '123', 'MAN', 'cq');
  21. INSERT INTO `users` VALUES (5,'姚汝能', '123', 'MAN', 'yrn');
  22. INSERT INTO `users` VALUES (null,'檀棋', '123', ' WOMAN', 'tq');
  23. INSERT INTO `users` (`userName`,`passWord`,`user_sex`,`nick_name`) VALUES ('michael', '123', 'MAN', 'zx');

说明:

  • id 设置的是自增,当插入数据时,可以不传或者传 null 值,都可以;
  • 插入数据,可以指定 column 也可以不指定;

application-dev.properties

  1. swagger.enable=true
  2. server.port=8081
  3. spring.datasource.url=jdbc:mysql://192.168.3.43:3306/beta?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
  4. spring.datasource.username=root
  5. spring.datasource.password=123456
  6. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  7. mybatis.type-aliases-package==com.michael.springbootmybatis.model
  8. mybatis.configuration.map-underscore-to-camel-case=true
  • 配置驼峰属性自动映射,例如实体中属性为 userSex,数据库属性为 user_sex,MyBatis 默认是不能自动转换的。我们可以配置 mybatis.configuration.map-underscore-to-camel-case 实现自动映射。如果不进行此配置,通常我们要自定义以下结果集映射:
  1. @Results({
  2. @Result(property = "userSex", column = "user_sex"),
  3. @Result(property = "nickName", column = "nick_name")
  4. })
  5. @Select("SELECT * FROM users WHERE id = #{id}")
  6. UserEntity getUserById(Long id);

在很多 Select 语句需要做结果映射时,自然是相当麻烦。除了上面配置「驼峰属性自动映射」,也可以用在 @Results 中使用 id 来标识一个映射关系,然后可以用 @ResultMap 复用这个映射关系:

  1. @Select("SELECT * FROM users")
  2. @Results(id = "user", value = {
  3. @Result(property = "userSex", column = "user_sex"),
  4. @Result(property = "nickName", column = "nick_name")
  5. })
  6. @Select("SELECT * FROM users WHERE id = #{id}")
  7. List<UserEntity> getAll();
  8. @ResultMap("user")
  9. @Select("SELECT * FROM users WHERE id = #{id}")
  10. UserEntity getUserById(Integer id);

代码

这里仅展示关键的部分的代码,完整可看下文的示例代码。

实体类:

  1. @Data
  2. @ApiModel(description = "UserEntity 实体类")
  3. public class UserEntity implements Serializable {
  4. private static final long serialVersionUID = 1L;
  5. @ApiModelProperty(value = "用户 id", dataType = "Long")
  6. private Long id;
  7. @ApiModelProperty(value = "用户名", required = true)
  8. private String userName;
  9. @ApiModelProperty(value = "密码")
  10. private String passWord;
  11. @ApiModelProperty(value = "性别")
  12. private UserSexEnum userSex;
  13. @ApiModelProperty(value = "昵称")
  14. private String nickName;
  15. @Override
  16. public String toString() {
  17. return "userName " + this.userName + ", password " + this.passWord + " , sex " + this.userSex;
  18. }
  19. }

dao/mapper 接口,数据库交互(Data Access Object)层:

  1. public interface UserMapper {
  2. // @Results({
  3. // @Result(property = "userSex", column = "user_sex", javaType = UserSexEnum.class),
  4. // @Result(property = "nickName", column = "nick_name")
  5. // })
  6. @Select("SELECT * FROM users")
  7. Page<UserEntity> getAll();
  8. // @Results({
  9. // @Result(property = "userSex", column = "user_sex"),
  10. // @Result(property = "nickName", column = "nick_name")
  11. // })
  12. @Select("SELECT * FROM users WHERE id = #{id}")
  13. UserEntity getUserById(Long id);
  14. @Insert("INSERT INTO users(userName, passWord, user_sex, nick_name) " +
  15. "VALUES(#{userName}, #{passWord}, #{userSex}, #{nickName})")
  16. @Options(useGeneratedKeys = true, keyProperty = "id")
  17. // @SelectKey(statement = "select last_insert_id()", keyProperty = "id", before = false, resultType = Integer.class)
  18. void insert(UserEntity user);
  19. @Update("UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id = #{id}")
  20. void update(UserEntity user);
  21. @Delete("DELETE FROM users WHERE id= #{id}")
  22. void deleteUserById(Long id);
  23. }

说明:

  • insert 这里用了一个 @Options 的注解,实现了「主键回填」的功能,也就是说,再创建好一个 user 之后,user 请求体中的 id 属性会自动赋值好;
  • @SelectKey 注解被注释掉了,这个注解也同样可以实现「主键回填」的功能;

service 接口:

  1. public interface UserService {
  2. /**
  3. * 查询所有用户
  4. *
  5. * @return
  6. */
  7. Map<String,Object> getAll(int pageNum, int pageSize);
  8. /**
  9. * 根据用户 ID 查询用户
  10. *
  11. * @param id 用户 ID
  12. * @return
  13. */
  14. UserEntity getUserById(Long id);
  15. /**
  16. * 新增一个用户
  17. *
  18. * @param user
  19. */
  20. void insert(UserEntity user);
  21. /**
  22. * 更新用户信息,用户 ID 不传,会更新失败
  23. *
  24. * @param user
  25. */
  26. String update(UserEntity user);
  27. /**
  28. * 根据用户 ID 删除用户
  29. *
  30. * @param id
  31. */
  32. String deleteById(Long id);
  33. }

service 接口的实现类:

  1. @Service
  2. public class UserServiceImpl implements UserService {
  3. @Autowired
  4. private UserMapper userMapper;
  5. @Override
  6. public Map<String,Object> getAll(int pageNum, int pageSize) {
  7. //将参数传给这个方法就可以实现物理分页了,非常简单。
  8. PageHelper.startPage(pageNum, pageSize);
  9. PageInfo<UserEntity> pageInfo = new PageInfo<>(userMapper.getAll());
  10. Long total = pageInfo.getTotal();
  11. List<UserEntity> users = pageInfo.getList();
  12. Map<String,Object> map = new HashMap<>();
  13. map.put("total", total);
  14. map.put("data", users);
  15. return map;
  16. }
  17. @Override
  18. public UserEntity getUserById(Long id) {
  19. return userMapper.getUserById(id);
  20. }
  21. @Override
  22. public void insert(UserEntity user) {
  23. userMapper.insert(user);
  24. }
  25. @Override
  26. public String update(UserEntity user) {
  27. userMapper.update(user);
  28. return "success";
  29. }
  30. @Override
  31. public String deleteById(Long id) {
  32. userMapper.deleteUserById(id);
  33. return "success";
  34. }
  35. }

controller 类:

  1. @RestController
  2. @RequestMapping("/api/v1/")
  3. @Api(tags = {"用户相关接口"}, value = "用户模块")
  4. public class UserController {
  5. @Autowired
  6. private UserService userService;
  7. /**
  8. * 查询全部用户
  9. *
  10. * @return
  11. */
  12. @ApiOperation(value = "获取用户列表", notes = "获取全部用户信息")
  13. @RequestMapping(value = "/users", method = RequestMethod.GET)
  14. public Map<String,Object> getUsers(
  15. @RequestParam(name = "pageNum", defaultValue = "1", required = false) int pageNum,
  16. @RequestParam(name = "pateSize", defaultValue = "2", required = false) int pageSize) {
  17. return userService.getAll(pageNum, pageSize);
  18. }
  19. /**
  20. * 根据用户 ID 查询用户
  21. *
  22. * @param id
  23. * @return
  24. */
  25. @ApiOperation(value = "查询单用户", notes = "根据用户id 查询其信息")
  26. @ApiImplicitParam(name = "id", value = "用户id", paramType = "query", required = true)
  27. @GetMapping("/user/{id}")
  28. public UserEntity getUser(Long id) {
  29. UserEntity user = userService.getUserById(id);
  30. return user;
  31. }
  32. /**
  33. * 存储用户信息
  34. *
  35. * @param user
  36. */
  37. @ApiOperation(value = "存储用户信息", notes = "存储用户详细信息")
  38. @RequestMapping(value = "/user", method = RequestMethod.POST)
  39. public String save(UserEntity user) {
  40. userService.insert(user);
  41. // 用到了 主键回填 的配置
  42. return "Create success, user id: " + user.getId();
  43. }
  44. /**
  45. * 更新用户信息
  46. *
  47. * @param user
  48. */
  49. @ApiOperation(value = "更新用户信息", notes = "更新用户的个人信息")
  50. @PutMapping("/user/")
  51. public void update(@RequestBody UserEntity user) {
  52. userService.update(user);
  53. }
  54. /**
  55. * 根据用户 ID 删除用户
  56. *
  57. * @param id
  58. */
  59. @ApiOperation(value = "删除用户", notes = "根据用户id删除用户信息")
  60. @ApiImplicitParams({
  61. @ApiImplicitParam(name = "id", value = "用户id", required = true, paramType = "path")
  62. })
  63. @RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)
  64. public void delete(@PathVariable("id") Long id) {
  65. userService.deleteById(id);
  66. }
  67. }

启动类:

  1. @SpringBootApplication
  2. @MapperScan("com.michael.springbootmybatis.mapper")
  3. public class SpringBootMybatisApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(SpringBootMybatisApplication.class, args);
  6. }
  7. }
  • @MapperScan("com.winter.mapper") 这个注解非常的关键,这个对应了项目中 mapper/dao 所对应的包路径。
  • 如果不用上面的方式,就需要在每个 mapper/dao 类上使用 @Mapper 注解;

分页

通常,在进行查询时,我们为了避免一次性返回所有结果,通常会进行分页。比如查询所有用户的接口,实际应用中,用户数据可能会很多,如果全部一次返回,明显不合适。这时候,就需要进行分页查询。

本文我们选用插键 pagehelper-spring-boot-starter 要进行分页。

添加依赖

  1. <!-- 分页插件 -->
  2. <dependency>
  3. <groupId>com.github.pagehelper</groupId>
  4. <artifactId>pagehelper-spring-boot-starter</artifactId>
  5. <version>1.2.5</version>
  6. </dependency>

分页配置

需要添加相应的配置:

  1. #pagehelper分页插件
  2. pagehelper.helperDialect=mysql
  3. pagehelper.reasonable=true
  4. pagehelper.supportMethodsArguments=true
  5. pagehelper.params=count=countSql
  6. pagehelper.row-bounds-with-count=true
  7. pageSizeZero=true

分页插键参数介绍:

  • helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式
  • reasonable:分页合理化参数,默认值为 false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认 false 时,直接根据参数进行查询
  • params:为了支持 startPage(Object params) 方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为 pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
  • supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值 false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页
  • pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。我测试时,发现不设置,pageSize=0 也会返回全部;

代码变动

mapper 中查找全部用户的方法改成如下:

  1. @Select("SELECT * FROM users")
  2. Page<UserEntity> getAll();

service 接口和其实现类的方法改成:

  1. PageInfo<UserEntity> getAll(int pageNum, int pageSize);

service 接口实现类:

  1. @Override
  2. public PageInfo<UserEntity> getAll(int pageNum, int pageSize) {
  3. //将参数传给这个方法就可以实现物理分页了,非常简单。
  4. PageHelper.startPage(pageNum, pageSize);
  5. PageInfo<UserEntity> pageInfo = new PageInfo<>(userMapper.getAll());
  6. return pageInfo;
  7. }

注意点:

  • PageHelper.startPage(pageNo,pageSize); 只对其后的第一个查询有效;

controller 类:

  1. @ApiOperation(value = "获取用户列表", notes = "获取全部用户信息")
  2. @RequestMapping(value = "/users", method = RequestMethod.GET)
  3. public PageInfo<UserEntity> getUsers(
  4. @RequestParam(name = "pageNum", defaultValue = "1", required = false) int pageNum,
  5. @RequestParam(name = "pateSize", defaultValue = "2", required = false) int pageSize) {
  6. return userService.getAll(pageNum, pageSize);
  7. }

除了上面的参数名,还习惯用下面的参数名:

  • offset:和 pageNum 意思一样,指定返回记录的开始位置;
  • limit:和 pageSize 意思一样,指定返回记录的数量;

进一步

上面的分页结果返回的内容有点多,一些属性并不想放在返回体中。可以进一步优化。编写工具类限定关心的属性。

分页查询结果封装类:

  1. @Data
  2. public class PageResult {
  3. /**
  4. * 当前页码
  5. */
  6. private int pageNum;
  7. /**
  8. * 每页数量
  9. */
  10. private int pageSize;
  11. /**
  12. * 记录总数
  13. */
  14. private long totalSize;
  15. /**
  16. * 页码总数
  17. */
  18. private int totalPages;
  19. /**
  20. * 数据模型
  21. */
  22. private List<?> content;
  23. }

分页查询工具类:

  1. public class PageUitls {
  2. /**
  3. * 将分页信息封装到统一的接口
  4. *
  5. * @param pageInfo
  6. * @return
  7. */
  8. public static PageResult getPageResult(PageInfo<?> pageInfo) {
  9. PageResult pageResult = new PageResult();
  10. pageResult.setPageNum(pageInfo.getPageNum());
  11. pageResult.setPageSize(pageInfo.getPageSize());
  12. pageResult.setTotalSize(pageInfo.getTotal());
  13. pageResult.setTotalPages(pageInfo.getPages());
  14. pageResult.setContent(pageInfo.getList());
  15. return pageResult;
  16. }
  17. }

接口方法:

  1. /**
  2. * 查询所有用户
  3. *
  4. * @return
  5. */
  6. PageResult getAll(int pageNum, int pageSize);

接口实现类:

  1. @Override
  2. public PageResult getAll(int pageNum, int pageSize) {
  3. //将参数传给这个方法就可以实现物理分页了,非常简单。
  4. PageHelper.startPage(pageNum, pageSize);
  5. List<UserEntity> users = userMapper.getAll();
  6. PageInfo<UserEntity> pageInfo = new PageInfo<>(users);
  7. return PageUitls.getPageResult(pageInfo);
  8. }

这样改写后,返回体就简洁许多了:

  1. {
  2. "pageNum": 1,
  3. "pageSize": 2,
  4. "totalSize": 3,
  5. "totalPages": 2,
  6. "content": [
  7. {
  8. "id": 1,
  9. "userName": "Michael翔",
  10. "passWord": "123",
  11. "userSex": "MAN",
  12. "nickName": "ZX"
  13. },
  14. {
  15. "id": 2,
  16. "userName": "HQH",
  17. "passWord": "123",
  18. "userSex": "WOMAN",
  19. "nickName": "QQ"
  20. }
  21. ]
  22. }

IN 查询

关于 MyBatis 的 IN 查询,也是试验了很久,才 OK 的。 StackOverflow 上就有类似的问题 How to use Annotations with iBatis (myBatis) for an IN query?

为了测试 MyBatis IN 查询,我们将之前的根据 ID 查询用户信息的接口进行修改,让它支持根据输入的 ID 列表查询多用户信息。

controller:

  1. @ApiOperation(value = "查询指定 ID 的用户", notes = "根据用户 id 列表查询其信息")
  2. @ApiImplicitParam(name = "ids", value = "用户 id 列表", paramType = "path", required = true)
  3. @GetMapping(value = "/user/{ids}")
  4. public PageResult getUser(@RequestParam(name = "pageNum", defaultValue = "1", required = false) int pageNum,
  5. @RequestParam(name = "pageSize", defaultValue = "2", required = false) int pageSize,
  6. @PathVariable String ids) {
  7. List<String> idLst = Arrays.asList(ids.split(","));
  8. PageResult user = userService.getUserById(pageNum, pageSize, idLst);
  9. return user;
  10. }

这里有个小注意点,@ApiImplicitParam 注解中的 paramType = "path" 记得修改为 path,因为请求参数中包含路径变量了,否则渲染 URL 时,会出问题。

mapper 类:

  1. @Select({
  2. "<script>",
  3. "SELECT * ",
  4. "FROM users WHERE id IN",
  5. "<foreach item='id' index='index' collection='ids' open='(' separator=',' close=')'>",
  6. "#{id}",
  7. "</foreach>",
  8. "</script>"
  9. })
  10. List<UserEntity> getUserById(@Param("ids") List<String> ids);

说明:

  • item 标识集合中每一个元素进行迭代是的别名,很多教程中设置为 item,我这里改为 id 也是 OK,而且也易于理解;
  • index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置,从 0 开始;
  • open 表示该语句以什么开始;
  • separator 表示在每次进行迭代之间以什么符号作为分隔符;
  • close 表示以什么结束;
  • collection 属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的;
  • @Param 的设置比较关键,相当于给其修饰的参数指定一个别名:
    • 使用 @Param,默认会和参数名同名,或者以注解传入的变量名为准。变量名将作为 @Select 中的可用参数,比如,我这里这样定义 @Param("ids2") List<String> ids,那么,@Select 中可用参数名将是 ids2collection 也须定义为 ids2,否则会报错:nested exception is org.apache.ibatis.binding.BindingException: Parameter 'list' not found. Available parameters are [ids2, param1];
    • 不使用 @Param 时,那么,此时 collection 需要定义为 list,否则会报错:nested exception is org.apache.ibatis.binding.BindingException: Parameter 'list2' not found. Available parameters are [collection, list];

上面的说明参考自 mybatis查询sql中in条件使用(foreach) ,没有找到官方文档支撑,待补充。

动态 SQL

待后续补充

FAQ

MyBatis 中 # 和 $ 的区别

  • 简单说 #{} 是经过预编译的,是安全的,而 ${} 是未经过预编译的,仅仅是取变量的值,是非安全的,存在 SQL 注入。${} 将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
  • 使用 ${} 的情况,order bylike 语句只能用 ${},用 #{} 会多个 ' ' 导致 SQL 语句失效。此外动态拼接 SQL,模糊查询时也要用 ${}

参考

分页

FAQ

欢迎关注个人公众号 「iPlayMichael」

Spring Boot 实战 —— MyBatis(注解版)使用方法的更多相关文章

  1. Spring Boot中@Scheduled注解的使用方法

    Spring Boot中@Scheduled注解的使用方法 一.定时任务注解为@Scheduled,使用方式举例如下 //定义一个按时间执行的定时任务,在每天16:00执行一次. @Scheduled ...

  2. 【spring boot】14.spring boot集成mybatis,注解方式OR映射文件方式AND pagehelper分页插件【Mybatis】pagehelper分页插件分页查询无效解决方法

    spring boot集成mybatis,集成使用mybatis拖沓了好久,今天终于可以补起来了. 本篇源码中,同时使用了Spring data JPA 和 Mybatis两种方式. 在使用的过程中一 ...

  3. Spring Boot整合Mybatis(注解方式和XML方式)

    其实对我个人而言还是不够熟悉JPA.hibernate,所以觉得这两种框架使用起来好麻烦啊. 一直用的Mybatis作为持久层框架, JPA(Hibernate)主张所有的SQL都用Java代码生成, ...

  4. Spring Boot的MyBatis注解:@MapperScan和@Mapper(十七)

    1.Spring Boot与MyBatis融合的矛盾问题: Spring家族的使命就是为了简化而生,但是随着Spring的发展壮大,有点事与愿违了.为了坚持初心,Spring家族祭出了一大杀器---S ...

  5. Spring Boot集成Mybatis注解相关

    mybatis3开始支持java注解,使用java注解可以替代xml配置文件,简化代码.下面来看一下怎么在spring boot中使用mybatis注解. 1 使用mybatis注解需要的配置.如下面 ...

  6. Spring Boot 使用Mybatis注解开发增删改查

    使用逆向工程是遇到的错误 错误描述 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): c ...

  7. Spring Boot整合MyBatis(非注解版)

    Spring Boot整合MyBatis(非注解版),开发时采用的时IDEA,JDK1.8 直接上图: 文件夹不存在,创建一个新的路径文件夹 创建完成目录结构如下: 本人第一步习惯先把需要的包结构创建 ...

  8. Spring Boot实战二:集成Mybatis

    Spring Boot集成Mybatis非常简单,在之前搭建好的项目中加入Mybatis依赖的jar,在配置文件中加入数据库配置即可,如下图所示: 创建对应的Controller.Service.Da ...

  9. spring boot 实战教程

    二八法则 - get more with less Java.spring经过多年的发展,各种技术纷繁芜杂,初学者往往不知道该从何下手.其实开发技术的世界也符合二八法则,80%的场景中只有20%的技术 ...

随机推荐

  1. AIX 系统参数配置

    AIX 系统参数配置 原创 Linux操作系统 作者:fanhongjie 时间:2008-05-08 22:46:37 540 0 AIX内核属于动态内核,核心参数基本上可以自动调整,因此当系统安装 ...

  2. 010-MySQL批量插入测试数据

    1.由于测试需要 需要将数据插入到百万级别,故需要使用循环语句,循环参看:009-MySQL循环while.repeat.loop使用 方式三.使用values批量插入[[推荐答案]] 基础格式 IN ...

  3. Mysql关键字之Group By(一)

    原文地址,优先更新https://hhe0.github.io group by 是一个我们在日常工作学习过程中经常遇到的一个Mysql关键字.现总结其用法如下,内容会不断补充,出现错误欢迎批评指正. ...

  4. IDEA 如何搭建maven 安装、下载、配置(图文)

    1.下载 maven 压缩包 输入网址 www.apache.org 会看到以下界面 住下划看到以下界面 然后看到这个界面 选择下载这个版本 下载后 解压 maven 压缩包 (文件路径不建议用有中文 ...

  5. PAT 甲级 1074 Reversing Linked List (25 分)(链表部分逆置,结合使用双端队列和栈,其实使用vector更简单呐)

    1074 Reversing Linked List (25 分)   Given a constant K and a singly linked list L, you are supposed ...

  6. 【翻译】Flink Table Api & SQL — 自定义 Source & Sink

    本文翻译自官网: User-defined Sources & Sinks  https://ci.apache.org/projects/flink/flink-docs-release-1 ...

  7. LeetCode_405. Convert a Number to Hexadecimal

    405. Convert a Number to Hexadecimal Easy Given an integer, write an algorithm to convert it to hexa ...

  8. [LeetCode] 61. Rotate List 旋转链表

    Given a linked list, rotate the list to the right by k places, where k is non-negative. Example 1: I ...

  9. [LeetCode] 128. Longest Consecutive Sequence 求最长连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  10. soapUI使用-调用post方法

    前言 soapUI的安装请查看此链接:https://www.cnblogs.com/linxiu-0925/p/10138771.html 使用步骤 1打开soapUI 2新建一个项目:New SO ...