build模式入门,build模式理解(转载)
问:为何要用?
普通做法:
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模式理解(转载)的更多相关文章
- 对IIS7经典模式和集成模式的理解(转载)
从IIS6新增应用程序池的概念,到现在IIS7,对HTTP请求处理功能已经越来越精确化和不断改善,IIS7应用程序池新增了经典模式和集成模式可供选择,不管官方还是一些书籍或文章都有介绍,但多数过于官方 ...
- 【转载】Gradle for Android 第二篇( Build.gradle入门 )
理解Gradle脚本 当然我们现在讨论的所有内容都是基于Android studio的,所以请先行下载相关工具.当我们创建一个新的工程,Android studio会默认为我们创建三个gradle文件 ...
- 【转】前端Web开发MVC模式-入门示例
前端Web开发MVC模式-入门示例 MVC概论起初来之桌面应用开发.其实java的structs框架最能体现MVC框架:model模型是理解成服务器端的模块程序:view为发送给客服端的内容:cont ...
- [转载]Java中继承、装饰者模式和代理模式的区别
[转载]Java中继承.装饰者模式和代理模式的区别 这是我在学Java Web时穿插学习Java设计模式的笔记 我就不转载原文了,直接指路好了: 装饰者模式和继承的区别: https://blog.c ...
- IIS 7 托管管道模式 经典模式(Classic) 集成模式(Integrated) 分析与理解
IIS 7.0 支持两种管道模式:一种是IIS 7.0最新提供的集成管道模式,另一种是经典管道模式,经典管道模式是由先前版本的IIS提供的. 我们可以通过应用程序池设置管道模式,这项功能对IIS管理员 ...
- 对于观察者模式,Reactor模式,Proactor模式的一点理解
最近就服务器程序IO效率这一块了解一下设计模式中的Reacotr模式和proactor模式,感觉跟观察者模式有些类似的地方,网上也看了一些其他人对三者之间区别的理解,都讲得很仔细,在此根据自己的理解做 ...
- 设计模式笔记之一:MVP架构模式入门(转)
写在前面:昨天晚上,公司请来专家讲解了下MVP,并要求今后各自负责的模块都要慢慢的转到MVP模式上来.以前由于能力有限,没有认真关注过设计模式.框架什么的,昨晚突然兴趣大发,故这两天空闲时间一直在学习 ...
- RabbitMQ入门-Topic模式
上篇<RabbitMQ入门-Routing直连模式>我们介绍了可以定向发送消息,并可以根据自定义规则派发消息.看起来,这个Routing模式已经算灵活的了,但是,这还不够,我们还有更加多样 ...
- Java设计模式之工厂模式(Factory模式)介绍(转载)
原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...
- 说说对npm的开发模式和生产模式的理解
nodejs这些年的发展非常快,相信没有哪个前端不知道的了,npm也成为了前端开发中经常用到了的一个命令.那么npm不是只用一个 "npm install xxx"命令就够了吗?实 ...
随机推荐
- 代理模式(Proxy Pattern)C#版本的
引用地址 https://www.cnblogs.com/zhili/p/ProxyPattern.html --------------------------------------------- ...
- (六--二)scrapy框架之持久化操作
scrapy框架之持久化操作 基于终端指令的持久化存储 基于管道的持久化存储 1 基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过 ...
- Python Learning Day6
selenium操作 点击.清除操作 from selenium import webdriver from selenium.webdriver.common.keys import Keys im ...
- java类加载及new对象的过程
/* SubClass sub = new SubClass(); 这句话到底做了什么事情呢? 1.javac编译.java源文件形成.class字节码文件; 2.new SubClass()对象时, ...
- python实现微信发送服务器监控报警消息代码实现
这篇文章主要介绍了python3.8 微信发送服务器监控报警消息代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 ! python版本 > ...
- Maven - 构建生命周期、阶段、目标
版权所有,未经授权,禁止转载 章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven – pom.xml 文件 Maven – 依赖管理 Ma ...
- Linux基础(1) 安装
Linux基础 一.创建CentOS 7 Linux虚拟机 1.安装虚拟机 桥接网络:相当于这台机器就是物理机,多个电脑在连接在一个交换机上,同一个子网 NAT:这台机器只能通过物理机(相当于 ...
- UML-持久框架-目标&关键思想
1.目标 1).使用模板方法.状态模式.命令模式来设计部分框架 2).介绍对象-关系(O-R)映射中的一些问题 3).使用虚代理实现的滞后具体化 2.关键思想 1).映射(Mapping) 类--表 ...
- PyMySQL学习笔记
一些常用函数及解释 db = pymysql.connect('host','user','password','database') # 连接数据库 cursor = db.cursor() # 创 ...
- Linux学习-课后练习(第二章命令)20200216