0%

前言

使用 xml 配置开发,我们 mybatis 也有注解开发。以后我们在公司做项目的时候多数会用到的注解,但是在 Mybatis 中还是 XML 为主。

我们这里也要回顾下什么是面向接口编程。

  • 真正的开发中,很多时候我们会面向接口编程
  • 根本原因:解耦,可拓展,提高复用,分层开发中,上层不用管具体的实现,大家都遵守共同的标准,是的开发变得容易,规范性好
  • 在一个面向对象的系统中,系统的各种共嗯那个有许许多多不同的对象写作完成,大到各个模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是按照这种思想来编程。

关于接口的理解

  • 接口从更深层次的理解,就是定义(规范、约束)与实现(名实分离的原则)的分离
  • 接口的本身反应了系统设计人员对系统的抽象理解
  • 接口应有两类:
    • 第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class)
    • 第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface)
  • 个体可能有多个抽象面,抽象体与抽象面是由区别的

三个面向的区别

  • 面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法
  • 面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现
  • 接口设计与非接口设计时针对复用技术而言的,与面向对象(过程)不是一个问题。更多的体现就是对系整体的架构
阅读全文 »

前言

我们的数据库会被请求很多数据,但是如果数据是很多的时候,我们肯定是分批返回而不是全部返回。所以在实际开发中,我们会对数据进行分页。

分页

分页操作的本质就是MySQL中的 limit 关键字,之前我们检索数据的做法是:

1
select * from users;

实际工作中,我们并不会这么用,因为数据库的数据随着时间的增加肯定是越来越多的,有可能是 1W、10W、100W,但是作为人我们没有办法一次性看这么多,而且性能上也是不允许。一般我们会使用 limit 来对其进行限制

1
-- 这句话就是从头部开始十五条
2
select * from users limit 0, 15;
阅读全文 »

前言

日志作为我们开发中的辅助工具,早期我们开发只是使用 System.out.println() 来输出内容,但是在实际开发中我们更青睐于日志系统,Mybatis 也支持日志系统的配置,我们来看看日志系统是如何配置启动的。

设置日志系统配置

日志系统的配置相当简单,只需要在 mybatis-config.xml 文件中加入 <settings> 标签即可,注意这里的 <setting>namevalue 都不能写错,必须和官方提供的文档相同,否则就会有不知名的原因报错,我们为了减少报错,我一般的习惯是直接打开官方文档复制即可。

支持的类型有:

  • SLF4J
  • LOG4J 【掌握】
  • LOG4J2
  • JDK_LOGGING
  • COMMONS_LOGGING
  • STDOUT_LOGGING【掌握】
  • NO_LOGGING
阅读全文 »

前言

我们在实际开发的时候,有没有遇到数据库字段和我们实体类中字段不一样的时候。这个时候 Mybatis 有没有提供解决方案呢?作为一个程序框架肯定是考虑到了这点。举个例子我们数据库表像下面这样。直接给出 SQL,在数据库中执行就行了,还是放在我们的 mybatis 数据库中:

1
CREATE TABLE users_test (
2
    `id` int(20) UNSIGNED NOT NULL AUTO_INCREMENT,
3
    `name` VARCHAR(64) NOT NULL,
4
    `pwd` VARCHAR(64) NOT NULL,
5
    PRIMARY KEY(`id`)
6
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
7
8
INSERT INTO `users_test` (`name`, `pwd`) VALUES ('鱼不浪', '666666'), ('鲁班', '666666'), ('西施', '666666'), ('麦特凯', '666666');

而我们的实体类是 com.yubulang.pojo.UserTest,里面的 password 与 数据库表的 pwd 现在是没有办法对应匹配的。我们需要让实体类与他绑定。

1
package com.yubulang.pojo;
2
3
public class UserTest {
4
    private int id;
5
    private String name;
6
    private String password;
7
8
    ...
9
}

为了复习之前的知识点,我们新建一个项目: mybatis-demo,一路下一步。哈哈哈

阅读全文 »

前言

在快速搭建 mybatis 环境,实现增删改查的操作,配置的相关操作之后,我们也需要了解一下 Mybatis 的生命周期以及作用域,之所以会提到肯定是在某些场景下容易出现问题。为了避免这些不必要的问题。

生命周期与作用域

右连接

不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的 并发问题

阅读全文 »

前言

经过了增删改查的编写,我们对 Mybatis 的使用有了一个大致的了解,但是仅仅知道增删改查的使用还不够,就好像我们使用 Nginx 去作为服务器,我们作为程序员不仅是要用,更多的是去配置他们一样。所以我们也要来学习一下 Mybatis 的配置,也是我们真正要掌握的能力。

核心配置文件

官方建议把配置文件命名为:mybatis-config.xml,配置文档中的层级机构如下:

  • configuration(配置)
    • properties(属性)[完全掌握]
    • settings(设置)[部分掌握]
    • typeAliases(类型别名)[完全掌握]
    • typeHandlers(类型处理器)[了解]
    • objectFactory(对象工厂)[了解]
    • plugins(插件)[了解]
    • environments(环境配置)[完全掌握]
      • environment(环境变量)
        • transactionManager(事务管理器)
        • dataSource(数据源)
    • databaseIdProvider(数据库厂商标识)[了解]
    • mappers(映射器)[完全掌握]

看着多,我们一个一个的看。我们进入配置的时候最先配置的肯定是连接数据库的环境配置。所以我们先看环境配置。

阅读全文 »

前言

有了第一篇《Mybaits-入门(一)》的铺垫,我们已经有一个基本的程序骨架了,虽然只是简单的查询,但是我们可以大概了解到 Mybatis 的相关操作了。接下来咱们一点一点的来,慢慢了解 Mybatis 的操作。

CRUD

我们把上一篇文章中com/yubulang/dao/UserMapper.xml的配置贴出来,看看相关的参数

1
<?xml version="1.0" encoding="UTF-8" ?>
2
<!DOCTYPE mapper
3
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5
6
<!-- 绑定一个指定的Dao/Mapper接口 -->
7
<mapper namespace="com.yubulang.dao.UserMapper">
8
    <!-- 查询语句, id对应UserMapper接口中的方法名 -->
9
    <!-- resultType 返回类型:要填写全类型名 -->
10
    <select id="getUserList" resultType="com.yubulang.pojo.User">
11
        select * from users
12
    </select>
13
</mapper>
阅读全文 »

前言

学完 JDBC 后,其实很多时候我们项目开发中不会直接使用 JDBC,而是会用到一些更好的第三方封装库,Mybatis 就是第三方库中使用人数最多,口碑最好的一个存在。为了快速上手,当然是盘它吖。

搭建 MySQL 数据库相关的表环境

  • 搭建数据库,并创建数据
1
-- 创建数据库
2
CREATE DATABASE IF NOT EXISTS `mybatis` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3
4
-- 使用数据库
5
USE `mybatis`;
6
7
-- 创建users表
8
CREATE TABLE `users` (
9
  `id` int(20) unsigned NOT NULL AUTO_INCREMENT,
10
  `name` varchar(64) NOT NULL,
11
  `password` varchar(64) NOT NULL,
12
  PRIMARY KEY (`id`)
13
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
14
15
-- 插入数据库
16
INSERT INTO `users` (`name`, `password`) VALUES ('鱼不浪', '666666');
17
INSERT INTO `users` (`name`, `password`) VALUES ('鲁班', '666666');
18
INSERT INTO `users` (`name`, `password`) VALUES ('西施', '666666');
19
INSERT INTO `users` (`name`, `password`) VALUES ('麦特凯', '666666');
阅读全文 »

前言

有了之前的注解内容,要搭配 Java 反射就能给注解注入灵魂了。

Java Reflection——反射

基础概念

  • Reflecttion(反射)是 Java 被视为动态语言的关键,反射机制允许程序在执行期借助于 Reflection API 取地任何类的内部信息,并且直接操作任意对象的内部属性及方法。
  • 加载完类之后,在堆内存的方法中就产生了一个 Class 类型的对象(一个类只有一个 Class 对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看类的结构。这个对象就像是一面镜子,透过这个镜子看到类的结构,所以 Reflection 我们形象的成为反射。

正常方式:引入需要的"包类"名称 -> 通过 new 实例化 -> 取得实例化对象
反射方式:实例化对象 -> getClass()方法 -> 得到完整的"包类"名称

反射机制提供的功能

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时获取泛型信息
  • 在运行时调用任意一个对象的成员变量和方法
  • 在运行时处理注解
  • 生成动态代理
  • 等等

优点和缺点

优点

  • 可以实现动态创建对象和编译,体现出很大的灵活性

缺点

  • 对性能有影响。使用反射基本上是一种解释操作,我们可以告诉 JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于直接执行相同操作。
阅读全文 »

前言

之前我常用的语言是 PHP,受限于语言特性,说实话 PHP 被很多公司边缘化了,感觉后面发展空间和路子并不是很大,加上很多解决方案还是 Java 的比较多,且资料更加健全,我一头扎入了 Java 的学习中。

注解和反射在我们在现在的框架中常常看到,查看框架的底层也会发现反射的身影,如果我们不了解这些通用的方法,显然有点说不过去。边学边记录,记录自己的学习路线。

注解

基本概念

  • Annotation 是从 JDK5.0 开始引入的新技术
  • 作用:
    • 不是程序本身,可以对程序做出解释(这一点和注释没有什么区别)
    • 可以被其他程序(比如:编译器等)读取
  • Annotation 的格式:
    • 注解以“@注解名”在代码中存在,还可以添加一些参数值,例如:@SuppressWarnings(value=”unchecked”)
  • Annotation 在哪里使用?
    • 可以附加在 package、class、method、field 等上面,相当于给爱他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。

内置注解

  • @Override:定义在java.lang.Override中,此注解只适用于修饰方法,表示一个方法声明打算重写超类中的一个方法声明。
  • @Deprecated:定义在java.lang.Deprecated中,此注解可用于修饰方法,属性,类,表示不鼓励大家使用这个元素,通常是因为它很危险或者有更好的选择。
  • @SuppressWarning:定义在java.lang.SuppressWarning中,用来抑制编译时的警告信息
    • 与前面两个注解有所不同,你需要添加一个参数才能正确使用,这些参数都是已经定义好了的,我们选择性使用就好了。
      • @SuppressWarning(“all”)
      • @SuppressWarning(“unchecked”)
      • @SuppressWarning(value={“unchecked”, “deprecation”})
      • 等等……
阅读全文 »