• 宇宙无敌第一帅的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类:

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

  • 相关阅读:
    pro-engineer&UG
    鸡肋
    中国计算机软件设计师考试大纲 2008-10-12 21:51 鹤影314 | 五级
    成为JAVA软件开发工程师要学哪些东西
    爱上一匹野马,可我的家里没有草原,这让我感到绝望。
    理解MySQL——架构与概念
    理解MySQL——索引与优化
    负载均衡与高可用概念(转)
    Nginx Rewrite详解(转)
    Nginx 反向代理配置实例(转)
  • 原文地址:https://www.cnblogs.com/liumeilin/p/6821931.html
Copyright © 2020-2023  润新知