宇宙无敌第一帅的Java笔记

1.java的执行顺序            java(编译)   Java(运行)       编写源码----------->字码文件----------->执行

2.编写源码注意    a.类名和文件名一致.    b.括号要成对出现.

3.println和print的区别    println会换行    print不会 4.转义字符     表示换行     表示空格

5.java注释    //:单行注释   /*  */:表示多行注释  /**   */表示文本注释

6.java代码规范    a.类名要用oublic修饰    b.一行只写一个语句    c.注意{}的位置    d.代码层次关系缩进(tab键

第二章   变量,数据类型和运算符

2.1变量     变量:一个数据存储空间表示(代词)

2.2变量的基本语法    数据类型 变量名       //声明变量                    =变量值;   //赋值

2.3变量的使用     a.变量必需声明,并且初始化够才能使用.     b.变量名不能重复.

2.4常见数据类型     int(整数) double(双精度浮点数) char(字符) String(字符串)        

补充:8种基本数据类型              

byte  (字节类型)              

short  (短整型)              

char    (字符型)              

int     (整型)             

long    (长整型)              

float   (单精度浮点型)              

double   (双精度浮点型)              

boolean   (布尔型)

2.5变量命名规则    变量名:由数字,字符,下划线,美元符号组成, 但是不能以数字开头

2.6赋值运算    变量名=表达式;

2.7算术运算符    +,-,*(乘),/(除取整),

%(取余)    ++,(自增)等价于  本身= 本身+1    --,(自减)等价于  本身= 本身-1

2.8类型转换    

2.8.1分类      

a.自动类型转换      

b.强制类型转换

2.8.2自动类型转换    

大类型  =   小类型

2.8.3强制类型转换     小类型  =  (小类型)大类型  

注意:强制类型转换是可能会出现溢出

2.9关系运算符   >(大于),<(小于)   ==(等于) !=(不等于)   >=(大于等于) <=(小于等于)

注意:==表示:等于, 表示:赋值

3.0  boolean类型    只有true和false两个值

3.1运算符运算优先级   () > 算术运算符 > 关系运算符 > 逻辑运算符  >   赋值运算(=)       +,-...   >, <...  ||(或)&&(与)!(非)

选择结构

  第一种:

    if(条件){

      //代码块

    }

  解释:如果条件结果为true,那么执行代码块,否则不执行

  第二种:

    if(条件){

      //代码块1

    }else{

      //代码块2

    }

  解释:如果条件结果为true,那么执行代码块1,否则执行代码块2

  第三种

    if(条件){

      //代码块1

    }else if(条件2){

      //代码块2

    }......{

      ...

    }else{

      //代码块n

    }

  解释:如果条件1结果为true,那么执行代码块1

      如果条件1为false,那么将执行下一个条件

      判断,依次重复上面的过程.

注意

  判断字符串是否相同用 str1.equals(str2)

  判断数字相同用num1 == num2

2.switch...case 选择结构

  switch(表达式值){

    case 值1:语句;break;

    case 值2:语句;break;

    .....

    default:语句n;

  }

  解释:如果表达式的值为值1,那么执行语句1,

    如果表达式的值为值2,那么执行语句2,

    ........

    如果表达式从上至下都没有找到匹配到值,那么执行default后面的语句n.

注意: 

    1).表达式值可是整型,字符型。jdk1.7以后可以是sting类型

    2).break:表示终止,表达式整个swtich语句结果.

    3).如果匹配到值,并且没有执行break,那么从匹配到那个值的语句

    开始,下面的每一个语句都会执行,知道整个程序结束后者遇到break.

 循环结构

1.while循环

  while(条件){

    //代码块

  }

解释:如果条件的结构为true,那么执行代码块

当代码块执行完后,又会执行条件,

依次循环,知道结果为false,整个循环结束.

2.程序调试

  第一步:设置断点(左键双击)

  第二步:debug方式执行代码

  第三步:逐条执行条码调试(f6)

  第四步:检查代码(看变量值的变化)

注意:在右上角可以切换java视图和debug视图.

3.do...while循环

  do{

    //代码块

  }while(条件){     //代码块

  }  

解释:先执行代码块,然后进行条件判断.

  如果条件为true,那么继续执行代码块

  依次循环,知道条件为false,整个循环结束.

注意

  变量的作用域:从变量声明开始到它所在代码块结束.

4.while和do....while区别

  a.执行顺序不一样

  b.do...while中的循环体至少会执行一次;

  而while中的循环体在结果为false时,不会被执行.

5.for循环

语法:

  for(初始化表达式;条件表达式;循环变量变化表达式){

    //循环体

  }

初始化表达式:用于初始化循环变量值

条件表达式:如果为true则执行循环体,否则退出

循环变量表达式:用于循环变量的控制如i++..

执行顺序:

  第一步:初始化表达式(只会执行一次)

  第二步:条件表达式;如果为true则执行第三步,否则退出循环.

  第三步:循环体

  第四步:循环变量表达式,执行完之后,再执行第二步,依次循环.

注意:

  for循环中三个表达式都可以省略.

  如果第二个表达式没有写,那么它的结果为true.

数组

1.数组的声明定义

  数组类型[] 变量名 = new 数据类型 [长度];

  例:int [] ary = new int [5];

2.取值,赋值.

  取值:数组名[下标];

  int a = ary [1];

  赋值:变量 = 数组名[下标];

  例:ary [1] = 10;

3.数组的遍历

  数组的长度:数组名.length;

  for(int i=0;i<数组名.length;i++){

    //数组名[i]:访问每个元素的值

  }

4.数组常见的异常

  ArrayIndexOutOfBoundsException     //数组下标越界

  当访问数组的下标超过0~length-1时,就会出现以上错误.

注意:数组下标范围:0~length-1

5.数组的常用方法

  Arrays.toString(数组名);    //展示数组内容

  Arrays.sort(数组名);  //数组按升序排序

6.后序遍历

  for{int i = ary.length-1; i>=0; i--

    ary[i];

  }

7.比较字符串的大小

  如果a.compareToIgnoreCase(b)>0 为true 那么a大于b.

  如果a.compareToIgnoreCase(b)<0 为true 那么a小于b.

  如果a.compareToIgnoreCase(b)==0 为true 那么a等于b.

8.break和continue

  continue:继续(表示结束本轮循环,进入下一个循环)

  break:终止,结束(表示终止当前循环结构)

注意:多层循环,只会对直接的循环起作用

类和对象

1.对象和类

  类是对象的抽象,对象是类的具体事例.

例:人是类,小明是对象.

2.创建对象

  语法:类名 对象名 = new 类名();

例:Person p = new Person();

注意:类名也是数据类型.语法也可以写成.

  数据类型 变量名 = new 数据类型();

3.类的语法

  public class 类名 {

    //属性 --->特征

    //方法 --->行为

  }

4.定义属性

  class 类{

    //属性的数据类型 属性名;

    例:int age;//表示年龄

  }

  属性的访问: 对象名.属性名;

  属性的赋值:对象名.属性名 = 值;

5.方法的访问:

  对象名.方法名();

无参方法

1.方法的定义

  public 返回值 方法名(){

    //方法体

  }

注意

  如果没有返回值,那么返回值类型是void.

  如果有返回值,那么必须用return 返回值,并且该值的数据类型必须是定义方法

  时的数据类型.

  return的作用:

    a.返回值

    b.结束方法.(与break类似)

 

2.写方法时注意

  第一点:定义void为返回值类型时,不能使用return+返回值.

  第二点:方法不能返回多个值.

  第三点:方法不能嵌套.

  第四点:不能在方法外部直接写程序逻辑代码.

3.成员变量和局部变量的区别

  a.作用域不同

    局部变量的作用域仅限于定义它的方法

    成员变量的作用域在整个类内部都是可见的

  b.初始值不同

    java会给成员变量一个初始值

    java不会给局部变量赋予初始值

注意

  a.相同的方法中,局部变量名不能重复

  b.不同方法中,局部变量名可以重复

  c.同一个类中,成员变量名和局部变量可以相同,一般以局部变量为准.(就近原则)

4.java.lang.NullpointerException(空指针异常)

  原因:对象的值为null,并且对次对象进行了操作.

  解决方案:找到次对象的数据来源,查看到new对象的代码

  是否执行或是否编写,根据不同的原因去解决问题.

注意: 

  写任何代码

  第一点代码的执行过程.

  第二点:值来自于哪里.

建议

  1.别先写代码,先写步骤.

  2.不要关注实现细节

有参方法

1.方法的定义

  public 返回值类型 方法名(参数类型1,参数名1,参数类型2,参数名2,.....参数类型n){

    //方法体

  }

2.有参数的调用

  a.如果同一个类中,方法可以直接调用.

  b.如果不同的类,方法必须通过对象调用,

  对象名.方法名(实参,实参2...)

注意

  1)实参的数据类型,参数的个数,参数的顺序要跟形象保持一致.

  2)调用有返回值的方法,一般要接受返回值,并作出相应的处理.

3.包

  a.包:文件夹(从src目录下开始算起)

    例:oo.day01

  b.包命名规范

    包由小写字母组成,不能以圆点开头或结尾.

  c.当使用不同包中的类时,必须用import将这个类导入到

  指定的类中,(如果是同一个包中的类,不需要import,java会自动导入).

4.字符串(String)的定义

  String str = “内容”

  String str = new String();  //内容为null

  String str = new String(“内容”);

5.java.lang.*

  字符串所在的包是java.lang.

注意:所有在java.lang包下的类,我们使用时,不需要import.

6.常用方法

  str.length();  //字符串的长度

  str.indexOf(str1);  //子串str1出现的下标.(从前往后找).

  str.lastIndexOf(str1);  //子串str1出现的下标(从后往前找).

  str.substring(begin);  //截取从下标begin开始到末尾的子串.

  str.substring(begin,end);  //截取从下标begin开始到下标end的子串.

  str.trim();  //去掉首尾空白

  str.toLowerCase();  //返回字符串的小写

  str.toUpperCase();  //返回字符串大写

7.从现实抽象出类的步骤

  第一:找出分类(分析出类)

  第二:找出类的特征(分析类的相关属性)

  第三:找出类的行为(分析类的方法)

8.常量(经常出现的变量值)

  语法:public static final 数据类型 变量名 = 变量值;

注意

  变量名的所有字母都大写,多个单词用下划线(_)分割.

例:public static final String SEX_MALE=“Q仔”;

常量的访问方式

  类名.常量名;

构造方法(特殊方法,用来创建对象 没写就会默认有构造方法)

1.语法

  public 类名 (参数列表){

      //方法体

  }

2使用

  类名 对象 new 构造方法名(参数);

例: Dog d = new Dog();

3 构造方法的作用

  a.创建对象.

  b.初始化值(属性值)

4构造方法和普通方法的区别:

  a.构造方法没有返回值类型(return....)

  b.构造方法的方法名就是类名,普通方法可以任意取.

  c.构造方法的调用:new 构造方法名(参数)

  普通方法的调用:对象名.方法名(参数)

注意:当你没有写构造函数时,java会提供默认的无参构造函数.

例:

  public Dog{

  }

方法重载

1.方法重载

  方法名一样,参数列表不一样.

注意:重载与返回值类型和访问修饰符无关.

2.static和final

  static:静态的

    用static修饰的属性,直接可以类名.方法名访问

  final:最终的

    用final修饰的属性,它的值初始化后,不能再改变

注意:static不能再方法中修饰局部变量

补充:

  后++,先把本身的值作为表达式的值,然后本身+1;

  例:i++

  前++,先本身加1,然后再把值作为表达式的值;

  例:++i

  后-- 先把本身的值作为表达式的值,然后本身-1;

  例:i--

  前-- 先本身-1,然后再把值作为表达式的值;

  例:--i

封装

1.封装:隐藏类内部细节

2.封装 步骤

  第一步:将属性私有化.(private)

  第二步:提供getter/setter方法(getXxxx(),setXxxx()).

  第三步:在getter/setter中加入控制语句.

3. this关键词

  this:表示当前对象.

  调用属性:this.属性名

  调用方法:this.方法名();

  this():表示调用构造函数.

注意:this(),必需写在构造函数的第一行.

继承(extends)

1. 继承:遗传

2. 语法

  public class 子类 extends 父类{

    //代码块

  }

例:public class Dog extends Pet {

    //代码块

}

3. 继承的特点

  a.子类可以继承父类的非私有的属性和方法

  b.不能继承构造方法

  c.继承默认权限修饰符的方法和属性,子类和父类必需在同一包中

4. super(父类)

  super.属性名; //表示访问父类的属性

  super.方法名(参数); //表示访问父类的方法

  super(参数);//表示访问父类的构造函数;

注意:super()访问父类构造函数时,必需写在第一行;

抽象类(abstract)

1. 抽象类

  语法:public abstract class 类名(){};

2. 抽象方法

  语法:public abstract 返回值类型 方法名(参数列表);

  例:public abstract void print();

注意:抽象方法有abstract修饰,并且抽象方法没有方法体.

3. 抽象类和抽象方法的特点

  a.都用abstract修饰

  b.抽象方法没有方法体

  c.抽象类不能实例化,并且继承必需重写抽象类中的所有抽象方法

注意

  1.抽象类中不一定有抽象方法

  2.含有抽象类方法的类,一定是抽象类(接口)

重写

1. 重写就是子类重写定义父类的方法

2. 重写规则

  a.方法名和参数列表相同.

  b.修饰符访问权限子类和父类相同或者比父类大.

  c.返回值类型子类和父类相同或者是父类的返回值类型的子类

  d.异常跟父类相同或者范围更小

重写时

  子类的东西都要与父类保持一致

方法重写

  位置相同,方法名相同,参数列表相同,返回值相同或是其子类,访问修饰符不能比父类严格

方法重载:位置同类,方法名相同,参数列表不相同,返回值无关,访问修饰符无关

final

  final修饰的类不能被继承

  final修饰的方法不能重写

  final修饰的属性不能被修改

多态

1. 多态含义:一个事物的多种形态

2. 多态的表现

  行为(方法)多态:重写和重载.

  引用多态(动态绑定):编译时的类型和运行时不一致的这种现象叫做动态绑定.

  例:父类 = 子类.

    pet p = new Dog();

3.向上转型和向下转型

  向上转型:父类 = 子类;

  向下转型:子类 = (子类)父类;

  例:Dog d = Dog()p;

注意java.lang.ClassCastException:类型转换异常.

    父类的运行时类型跟要转成的子类的类型不一致

注意:引用多态存在继承关系

instanceof

  语法:对象A instanceof 类型B;

  判断对象A的类型是否是类型B,如果是就返回true,否则返回false.

  例:d instanceof Dog

实现多态的两种形式

  a.使用父类作为方法形参实现多态

    public void play(Pet p){}

  b.使用父类作为方法返回值实现多态

    public Pet getPet(int type){}

接口

1. 语法

  public interface 接口名 extends 接口1,接口2..{

      //1.常量

      //2.抽象方法

  }

2.特点

  a.用interface修饰

  b.接口可以继承接口,多继承

  c.接口内只能定义常量和抽象方法

  d.接口不能实例化,但是可以作为子类的引用

  e.实现接口的子类都必需实现它的所有抽象方法

foreach循环和...

  ... :形参里面出现,表示的是可变参数

  foreach循环:

    语法:for(int 下标 = 0;i < 数组的长度;i++){ 数组元素值 数组[i]}

    语法:for(数组元素类型 数组的元素值:数组){}

异常

1.异常:程序执行过程中出现的影响程序正常运行的现象.

2.异常语法

  try{

    //代码块

  }catch(异常类型 e){

    //代码块

  }catch(异常类型 2 e2){

    //代码块

  }...{

    //代码块

  }finally{

    //代码块

  }

注意

  try:表示可能出现异常的代码块.

  catch:抓取异常,并进行处理,可以抓取多个异常,

      异常的范围要从小到大抓取,并且只会执行第一个匹配的异常类型.

  finally:最终的,不管是否出现异常,finally中的代码块始终会执行.

      除虚拟机停止(System.exit(1))这种情况外.

注意

  finally 和 return的执行顺序:

      先执行return,把返回结果保存在返回结果区域,并没有返回,再执行finally,

      最后,把保存在结果区域的结果返回给调用者.  

3.throws声明异常

  a.就是当前方法,不能解决这个异常的时候,必须把这个异常交给上一个调用者去处理.

  b.语法

    访问修饰符 返回值类型 方法名(参数列表)[throws 异常]{}

java异常体系

Throwable

   error: (出现不能通过的程序处理的错误)

  Exception:可以同程序抓取或者抛出的错误.

  检查异常(非运行时异常):编译阶段会出现的异常

    SqlException,

    IOException,

    ClassNotFoundException

  非检查异常(运行时异常RunTimeE)

    NullPointerException,

    ArrayIndexOfBoundsException,

    ClassCastException,

注意

  checked异常,是必需处理的

  运行时异常,可以不处理

导入第三方jar包

  第一步:右击工程名,新建一个文件夹(Fold),名字为lib.

  第二步:把第三方jar包复制到lib目录下.

  第三步:右击工程名---->properties

      ---->java build path

      ---->libraries

      ---->add jar

      ---->再从项目的lib目录下选中你要的jar包

      ---->确定.

使用log4j

  第一步:导入log4j jar包

  第二步:写配置文件

注意

  文件名和文件路径

  (开发)(生成)

  log4j.rootLogger=debug | info

  第三步:使用log4j

  a.导入log4j类

    import org.apache.log4j.Logger;

  b.在指定类中,写属性

  private static Logger logger = Logger.getLogger(指定类名.class);

  c.在指定行写日志

  logger.debug("日志信息");

  logger.info("信息");

集合框架

  Collection Map

  List Set HashMap

  ArrayList LinkedList HashSet

1. List的方法

  List<元素类型> list = new LinkedList<元素类型>();

  list.add(元素);  //增加元素

  list.add(index,元素);  //向指定位置插入元素

  list.remove(下标);  //删除指定下标的元素

  list.remove(元素);  //删除指定元素

  list.get(index);  //获取指定下标元素

  list.contains(元素);  //集合中是否包含指定元素

2. Collection,List,Set的区别

  Collection:不唯一,无序

  List:不唯一,有序

  Set:唯一,无序

3 .ArrayList和LinkedList的区别

  a.都实现了List

  b.ArrayList是可边长数组方式实现,查询效率高.

    LinkedList是链表方式实现,增加和删除效率高.

4. List常用方法

  List <Object> list = new ArrayList<Object>();

  list.add(Obj);  //增加元素

  list.get(下标);  //获取指定下标元素

  list.size();    //长度

  list.remove(Obj);  //删除指定元素

  list.contains(Obj);  //是否包含指定元素

5 .Map 常用方法(键值对方式存储数据)

  Map<Object,Object> maps = new HashMap<Object,Object>();

  maps.put(key,value);  //增加元素

  maps.get(key);  //获取指定key的值

  maps.size();  //长度

  maps.remove(key);  //删除指定元素

  maps.containsKey(key);  //是否包含指定key

注意

  key是唯一的,如果重复那么后面的会覆盖前面的.

  value是可以重复的.

6. Vector和ArrayList的异同

  实现原理、功能相同、可以互用

  Vector线程安全,ArrayList重速度轻安全,线程非安全

  长度需增长时,Vector默认增长一倍,ArrayList增长50%

  Hashtable和HashMap的异同

  Hashtable继承Dictionary类,HashMap实现Map接口

  Hashtable线程安全,HashMap线程非安全

  Hashtable不允许null值,HashMap允许null值

一.什么是JDBC?

      java中连接数据库的一种技术

  是java各种应用程序和数据库之间的桥梁

  由一组使用java语言编写的类和接口组成

二、JDBC中常用的API?

  DriverManager类:管理不同数据库的jdbc驱动

  Connection接口:负责连接数据库并担任传递数据的任务

  Statement接口:由Connection产生,负责执行sql语句

    PreparedStatement是Statement的子接口

  除了具备父接口Statement的能力外,还具有4高(安全性、性能、可读性、可维护性)功能

  ResultSet接口:负责保存和处理Statement返回的查询结果

三、使用JDBC如何连接sqlserver数据库?

         1、加载驱动

                            编码前的准备工作

            1.将sqljdbc2008.jar文件复制粘贴到项目的文件夹中

            2.将项目和jdbc驱动关联编码,加载驱动

              Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");  //处理异常try…catch

   2、编写数据库连接字符串、设置登录名、密码

                   2.1 final String url=”jdbc:sqlserver://localhost:1433;databasename=存在的数据库名”;

                   2.2 final String name = ”sqlserver身份验证的登录名”;

                   2.3 final String pwd = ”登录名对应的密码”;

   3、使用DriverManger类的getConnection()方法,

      关联url、name、pwd,返回一个Connection接口

              Connection conn=DriverManger. getConnection(url ,name , pwd);

四、使用Statement接口对表的数据执行[增、删、改]操作

  1、加载驱动连接数据库

  2、  在try…catch外面,声明Statement变量并赋初值null

    (或用PreparedStatement代替Statement

                             Connection con=null;

                             Statement stm=null;

                             PreparedStatement pst=null;

  3、  定义变量,保存sql语句(insert、delete、update语句)

    使用PreparedStatement接口,sql语句中values()中的值,使用?

  4、  DriverManager.getConnection()的下一行编写代码

    Statement变量=Connection变量.createStatement();

      PreparedStatement变量= Connection变量. prepareStatement(sql);

  5、调用Statement变量的executeUpdate(sql)执行sql语句

            int rows=executeUpdate(sql);  //返回受影响的行数

    为sql语句中的?赋值

         PreparedStatement变量.set数据类型(数字,值);

    调用PreparedStatement变量的executeUpdate()执行sql语句

             int rows=executeUpdate();//返回受影响的行数

  6、根据受影响的行数,判断sql语句执行是否成功---if(rows>0)

  7、释放相关的资源

    finally{

                    try{

                            if(Statement变量或PreparedStatement变量!=null)

                                     Statement变量(或PreparedStatement变量).close();

                            if(Connection变量!=null)

                                     Connection变量.close ();

                    } catch (SQLException e){

                            e.printStackTrace ();

                    }

    }

五、使用JDBC查询表中的数据(ResultSet接口)

  1、  加载sql2008 jdbc驱动包

    (自动添加try…catch,手动添加finally语句块用于释放资源)

  2、  在try…catch…finally语句块的外面,

    a.声明3个接口(Connection、Statement或PreparedStatement、ResultSet的变量且赋值null)       

    b.在finally块中,调用这3个接口的close()释放资源

      (有顺序:1.rs.close() 2.pstm.close() 3.con.close() )

  3、  编写数据库连接字符串url

    (jdbc:sqlserver://localhost:1433;databasename=存在的数据库名)

  4、  使用DriverManager.getConnection(url,”登录名”,”登录密码”);

      获取Connection接口的对象

  5、  编写sql查询语句,保存到字符串的变量中

  6、  获取发送并执行sql查询语句的接口对象

    a) 父接口Statement对象

      Connection接口变量.createStatement ();

    b)子接口PreparedStatement对象

      Connection接口变量. prepareStatement (sql);

  7、  调用Statement或PreparedStatement接口的方法,执行sql查询语句,返回ResultSet

    a) 父接口Statement对象

      ResultSet变量=Statement接口变量.executeQuery(sql);

    b) 子接口PreparedStatement对象

      ResultSet变量=Statement接口变量.executeQuery();

  8、 使用while循环,调用ResultSet接口变量的get数据类型(数字或列名)方法,来获取表中列的值

      while(ResultSet接口变量.next()){

                 ResultSet接口变量.get数据类型(数字或列名);

                      get数据类型(数字);       //数字从1开始

                        get数据类型(“列名”);

      }

  

// 增、删、改操作

public int getExecute(String sql, ArrayList<?> list) {

    con = getDB();// 调用打开数据库的连接的方法

    int rows =0;

    try {

        pst = con.prepareStatement(sql);

         //list集合为null,说明sql语句中没有?

        if (list != null) {

            for (int i = 0; i < list.size(); i++) {

                pst.setObject(i + 1, list.get(i));

            }

            rows=pst.executeUpdate();

        }

    } catch (SQLException e) {

        e.printStackTrace();

    }

    return rows;

}

 

 

//

public ResultSet getExecuteQuery(String sql ,ArrayList<?> list) {

    con = getDB();// 调用打开数据库的连接的方法

    try {

        pst = con.prepareStatement(sql);

        //list集合为null,说明sql语句中没有?

        if (list != null) {

            for (int i = 0; i <list.size(); i++) {

                pst.setObject(i + 1, list.get(i));

            }

        }

        rs = pst.executeQuery();

    } catch (SQLException e) {

        e.printStackTrace();

    }

    return rs;

}

数据持久化

  持久化:将程序中的数据在瞬间状态下和持久状态间转换的机制(JDBC)

  主要持久化操作:保存、删除、读取、和查找。

  采用面向接口编程,可以降低代码间的耦合性,提高代码的可扩展性和可维护性。

DAO模式

  1. DAO ( DataAccessObjects ,数据存取对象) :

               位于业务逻辑和持久化数据之间实现对持久化数据的访问

  2.组成部分:

           DAO接口:把对数据库的所有的操作定义成抽象方法,可以提供多种实现。

           DAO实现类:针对不同数据库给出DAO接口定义方法的具体实现。

           实体类:用于存放于传输对象数据。

           数据库连接和关闭工具类:避免数据库连接和关闭代码的重复使用,方便修改

  3.DAO模式提供了访问关系型数据库系统所需操作的接口,将数据访问和业务逻辑分 离,对上层提供面向对象的数据访问接口

  4.优势:① 隔离了数据访问代码和业务逻辑代码;② 隔离了不同数据库实现。

分层开发

    优势:

  1. 每一层专注于自己功能的实现,便于提高质量
  2. 便于分工协作,提高效率
  3. 便于代码复用
  4. 便于程序扩展

 特点:

  1. 每一层都有自己的职责
  2. 上层不关心下层的实现细节,上层通过下层提供的对外接口来实现其功能
  3. 上层调用下层的功能,下层不能调用上层的功能;下层为上层提供服务,而不使用上层提供的功能

 原则:

  ①  封装性原则:每个层次向外提供公开的统一接口,隐藏内部的功能实现细节,其他层次不能也没有必要了解其内部细节。

  ②  顺序访问原则:下一层为上一层提供服务,而不使用上一层提供的服务

    (业务逻辑层  ---->     数据访问层       业务逻辑层  <---- 数据访问层)

实体类

        特征:1.属性一般用private修饰(getter/setter方法—---用public修饰);

                2.最好实现java.io.Serializable接口支持序列化机制,可以将该对象转换成字节序列而保存在磁盘上或在网络上传输;

                3.对实体类提供无参构造方法,根据业务需要提供相应的有参构造方法;

                4.定义属性serialVersionUID,解决不同版本之间的序列化问题

                     (private static final long serialVersionUID=2070056025956126480L)

方法调用时:

           表示层——>业务逻辑层——>数据访问层

写代码时:

           数据访问层——>业务逻辑层——>表示层

            实体类(表在面向对象中的实现):

        表名——类名、字段——属性     编写一个实体类,将一个表用类实现;包名——entity或models存放实体类

            测试类、网页、界面UI(表示层)——main方法所在的类

            业务逻辑层(桥梁作用):

                   表示层的数据,传递到数据访问层

            BaseDAO类:

        对表进行操作的类(包存放)——数据访问层    对数据库的访问和操作(辅助类)

原文地址:https://www.cnblogs.com/liumeilin/p/6821931.html