问:为何要用?

普通做法:

1.创建pojo

public class Person {

private String name;

private int age;

private double height;

private double weight;

public Person(String name) {

this.name = name;

}

public Person(String name, int age) {

this.name = name;

this.age = age;

}

public Person(String name, int age, double height) {

this.name = name;

this.age = age;

this.height = height;

}

public Person(String name, int age, double height, double weight) {

this.name = name;

this.age = age;

this.height = height;

this.weight = weight;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public double getHeight() {

return height;

}

public void setHeight(double height) {

this.height = height;

}

public double getWeight() {

return weight;

}

public void setWeight(double weight) {

this.weight = weight;

}

}

2.创建对象

Person p1 = new Person();

Person p2 = new Person("张三");

Person p3 = new Person("李四", 18);

Person p4 = new Person("王五", 21, 180);

Person p5 = new Person("赵六", 17, 170, 65.4);

或者使用setName()、setWeight()等set方法

这样创建是没问题,

使用构造函数,前提是你自己很熟悉这个Person里面的参数顺序是什么,比如p4对象的21和180,抛开常理,这两个都是数字,你怎么知道那个是年龄那个是身高呢,这样就产生问题,如果数字类型的参数过多,那简直就是灾难,你自己都不知道每个数字代表什么,所以builder模式就很好解决了这个问题。

使用set方法,有可能导致对象不一致

构造模式的使用:

public class Person {

private String name;

private String sex;

private int age;

private int weight;

private int hight;

/**

* 带参构造

* @param name

* @param sex

* @param age

* @param weight

* @param hight

*/

public Person(String name, String sex, int age, int weight, int hight) {

super();

this.name = name;

this.sex = sex;

this.age = age;

this.weight = weight;

this.hight = hight;

}

/**

* getter和setter

* @return

*/

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public int getWeight() {

return weight;

}

public void setWeight(int weight) {

this.weight = weight;

}

public int getHight() {

return hight;

}

public void setHight(int hight) {

this.hight = hight;

}

@Override

public String toString() {

return "Person [name=" + name + ", sex=" + sex + ", age=" + age + ", weight=" + weight + ", hight=" + hight

+ "]";

}

/**

* builder模式

*/

static class Builder {

private String name;

private String sex;

private int age;

private int weight;

private int hight;

public Builder name(String name) {

this.name = name;

return this;//返回自身对象,在后面的链式调用中就可以自身对象的属性和方法了

}

public Builder sex(String sex) {

this.sex = sex;

return this;//返回自身对象,在后面的链式调用中就可以自身对象的属性和方法了

}

public Builder age(int age) {

this.age = age;

return this;//返回自身对象,在后面的链式调用中就可以自身对象的属性和方法了

}

public Builder weight(int weight) {

this.weight = weight;

return this;//返回自身对象,在后面的链式调用中就可以自身对象的属性和方法了

}

public Builder hight(int hight) {

this.hight = hight;

return this;//返回自身对象,在后面的链式调用中就可以自身对象的属性和方法了

}

public Person build() {

return new Person(name, sex, age, weight, hight);

}

}

public static void main(String[] args) {

Person p1= new Person.Builder().age(18).hight(180).name("lx").build();

System.out.println(p1.toString());

}

这里注意一下几点基础知识:

1、类中的再声明一个类

java类里面还可以定义一个类,即内部类,但是要注意:1.内部类不能通过普通方式访问,内部类时外部类的一个普通成员,所以内部类可以方位外部类成员,即使这些类时private;2.若内部类声明成static时,就只能访问同样声明为static的外部类成员了。

2、只能有一个public 修饰的类(因为一个类文件中类名必须和文件名一致,而文件名根据规则必须是public修饰的那个类名)

做了这么多的铺垫,重点来了 ,build模式的应用场景在什么地方呢?

1、mybatis

mybatis四大核心,

SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper

1、SqlSessionFactoryBuilder

从命名上可以看出,这个是一个 Builder 模式的,用于创建 SqlSessionFactory 的类。SqlSessionFactoryBuilder 根据配置来构造 SqlSessionFactory。

2、SqlSessionFactory

SqlSessionFactory 顾名思义,是用于生产 SqlSession 的工厂。

通过如下的方式来获取 SqlSession 实例:

SqlSession session = sqlSessionFactory.openSession();

3、SqlSession

SqlSession 包含了执行 SQL 的所有的方法(执行持久化的操作对象)。以下是示例:

SqlSession session = sqlSessionFactory.openSession();
try {
Blog blog = session.selectOne(
"org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {
session.close();
}

当然,下面的方式可以做到类型安全:

SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);//面向接口编程
Blog blog = mapper.selectBlog(101);
} finally {
session.close();
}
4、Mapper

Mapper 顾名思义,是用做 Java 与 SQL 之间的映射的。包括了 Java 映射为 SQL 语句,以及 SQL 返回结果映射为 Java。

 

比如,下面是一个常见的 Mapper 接口映射文件:

<?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="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>

其中 “org.mybatis.example.BlogMapper” 就是我们要射射的接口,selectBlog 就是BlogMapper上的方法。而这个 selectBlog 具体就是要执行“select * from Blog where id = #{id}”这个 SQL 语句。

这样,我们就能通过

Blog blog = session.selectOne(
"org.mybatis.example.BlogMapper.selectBlog", 101);

或者是

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

来获取到执行的结果。

当然,如果是采用注解的方式的话,可以省去 XML 文件:

public interface BlogMapper {
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}
 

build模式入门,build模式理解(转载)的更多相关文章

  1. 对IIS7经典模式和集成模式的理解(转载)

    从IIS6新增应用程序池的概念,到现在IIS7,对HTTP请求处理功能已经越来越精确化和不断改善,IIS7应用程序池新增了经典模式和集成模式可供选择,不管官方还是一些书籍或文章都有介绍,但多数过于官方 ...

  2. 【转载】Gradle for Android 第二篇( Build.gradle入门 )

    理解Gradle脚本 当然我们现在讨论的所有内容都是基于Android studio的,所以请先行下载相关工具.当我们创建一个新的工程,Android studio会默认为我们创建三个gradle文件 ...

  3. 【转】前端Web开发MVC模式-入门示例

    前端Web开发MVC模式-入门示例 MVC概论起初来之桌面应用开发.其实java的structs框架最能体现MVC框架:model模型是理解成服务器端的模块程序:view为发送给客服端的内容:cont ...

  4. [转载]Java中继承、装饰者模式和代理模式的区别

    [转载]Java中继承.装饰者模式和代理模式的区别 这是我在学Java Web时穿插学习Java设计模式的笔记 我就不转载原文了,直接指路好了: 装饰者模式和继承的区别: https://blog.c ...

  5. IIS 7 托管管道模式 经典模式(Classic) 集成模式(Integrated) 分析与理解

    IIS 7.0 支持两种管道模式:一种是IIS 7.0最新提供的集成管道模式,另一种是经典管道模式,经典管道模式是由先前版本的IIS提供的. 我们可以通过应用程序池设置管道模式,这项功能对IIS管理员 ...

  6. 对于观察者模式,Reactor模式,Proactor模式的一点理解

    最近就服务器程序IO效率这一块了解一下设计模式中的Reacotr模式和proactor模式,感觉跟观察者模式有些类似的地方,网上也看了一些其他人对三者之间区别的理解,都讲得很仔细,在此根据自己的理解做 ...

  7. 设计模式笔记之一:MVP架构模式入门(转)

    写在前面:昨天晚上,公司请来专家讲解了下MVP,并要求今后各自负责的模块都要慢慢的转到MVP模式上来.以前由于能力有限,没有认真关注过设计模式.框架什么的,昨晚突然兴趣大发,故这两天空闲时间一直在学习 ...

  8. RabbitMQ入门-Topic模式

    上篇<RabbitMQ入门-Routing直连模式>我们介绍了可以定向发送消息,并可以根据自定义规则派发消息.看起来,这个Routing模式已经算灵活的了,但是,这还不够,我们还有更加多样 ...

  9. Java设计模式之工厂模式(Factory模式)介绍(转载)

    原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...

  10. 说说对npm的开发模式和生产模式的理解

    nodejs这些年的发展非常快,相信没有哪个前端不知道的了,npm也成为了前端开发中经常用到了的一个命令.那么npm不是只用一个 "npm install xxx"命令就够了吗?实 ...

随机推荐

  1. 115-PHP实例化和不实例化输出类常量

    <?php class boy{ //定义男孩类 const sex='男'; public $age=15; } echo '不实例化对象输出类常量:'.boy::sex; $boy=new ...

  2. win10,64位操作系统安装mysql-8.0.16经验总结(图文详细,保证一次安装成功)

    文章目录 1.mysql下载 2.解压及配置文件 3.启动MySQL数据库 4.登录 MySQL 5.配置系统环境变量 6.mysql-8.0.16修改初始密码 机器配置: win10,64位: my ...

  3. 【LGR-(-8)】洛谷入门赛 #5 题解

    比赛链接 9道题. 注:题目名称中链接为题目链接,题号中链接为比赛内链接 题目编号 洛谷题号 题目名称 题目难度 A P5713 [深基3.例5]洛谷团队系统 \(\color{red}{入门}\) ...

  4. 吴裕雄--天生自然C++语言学习笔记:C++ 运算符

    运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C++ 内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 算术运算符 下表显示 ...

  5. C# Stream篇(六) -- BufferedStream

    BufferedStream 目录: 简单介绍一下BufferedStream 如何理解缓冲区? BufferedStream的优势 从BufferedStream 中学习装饰模式 如何理解装饰模式 ...

  6. softmax、交叉熵

    Softmax是用于分类过程,用来实现多分类的 它把一些输出的神经元映射到(0-1)之间的实数,并且归一化保证和为1,从而使得多分类的概率之和也刚好为1. Softmax可以分为soft和max,ma ...

  7. SpringBoot+SpringSecurity之多模块用户认证授权同步

    在之前的文章里介绍了SpringBoot和SpringSecurity如何继承.之后我们需要考虑另外一个问题:当前微服务化也已经是大型网站的趋势,当我们的项目采用微服务化架构时,往往会出现如下情况: ...

  8. arm 裸机学习笔记

    位置无关码 bl 是位置无关码,指令中带的数值是,编译的时候,编译器计算好的,需要跳转的位置减去 bl 指令所在位置的结果.这样当程序最开始在 4k sram 中运行的时候,跳转的位置是在 0 + o ...

  9. gentoo 修改键盘映射

    gentoo 上面修改键盘映射分为两种,一种是终端环境,一种是X环境. 终端环境 https://www.emacswiki.org/emacs/MovingTheCtrlKey https://wi ...

  10. HTML元素类型和类型的转换

    HTML元素分为:块状元素和内联元素 块元素:(block) 1.默认独占一行 2.没有宽度时,默认撑满一排 3.可以定义元素的宽和高 常见的块状元素有div,ul,li,h1-h6,ol 内联,行内 ...