《Java基础与案例开发详解》(六)

注解

定义:是用来为程序元素(类、方法、成员变量)设置说明和解释的一种元数据。

注解标记是可以在编译、类加载、运行的时候读取。

注解表现形式

Java注解采用“@”标记形式,后面跟上注解类型名称。

注解类型和注解的区别:

注解类型是某一类型注解的定义,类似于类,注解是某一注解类型的一个具体实例,类似于该类的实例。

Java中预定的注解
  1. Override是一个限定重写方法的注解类型,这个注解只能用于方法。我们读知道在Java中继承,必须重写父类的方法,如果我们在重写的时候,不小心将方法搞错了,这时编译是不会提醒我们的,所以容易出现错误,但是我们在上述继承中,如果我们在子类重写的方法上加上这个注解,那么在出现上述名字错误的时候,编译时就会报错。
  2. Deprecated这个注解是用来标识已过时的成员的注解类型,不建议使用。
  3. SupperWarnings是抑制编译器警告的注解类型,常常会出现在使用List的集合添加元素,没有规定泛型时,就会有警告。这是如果添加SupperWarnings(“nochecked”),就会消除警告。他有个属性value值,用来指定印制的警告类型名。
自定义注解
public @interface MyAnnotation {//就是在interface前面加了一个@
    String value();//定义一个属性
    //在这里有一个不成文的约定,如果在使用注解时没有显式指定属性名,缺指定了属性值,而这个注解类型又有一个名叫value的属性,就直接赋值,如果没有,就编译出错。
}

使用如下:

@MyAnnotation("ada")
注解默认值
    public @interface MyAnnotation {
    enum Status{one,two,three}//定义了一个枚举类型
    String value();//定义一个属性
    Status status() default Status.one;//给这个属性值赋了默认值
}

使用:

    @MyAnnotation("adasd")//这里默认是有status的值,可以不显示写出来
对注解进行注解

上面我们只是讨论自定义注解类型,下面四种专门用在注解上的注解类型。

  1. Target
  2. Retention
  3. Documented
  4. Inherited
Target

target的意思是目标,这个目标就是Java的程序元素,如类、接口、成员方法,如果规定了一个注解的程序元素,那么这个注解只能作用于这些程序元素上。

程序元素类型

这里写图片描述

@Target({ElementType.METHOD,ElementType.TYPE})//说明这个注解只能注解在方法和类、接口、枚举上,
//在其他地方编译会报错
public @interface MyAnnotation {
    enum Status{one,two,three}//定义了一个枚举类型
    String value();//定义一个属性
    Status status() default Status.one;//给这个属性值赋了默认值
}
Retention

主要是用来设置注解是否保存在class文件中,Java编译器中处理Java类中的注解,有以下三种方式:

  • 编译器处理完后,不保留注解到编译后的类文件中。
  • 将注解保留在编译后的类文件中,但是在运行时忽略它。
  • 将注解保留在编译后的类文件中,并在第一次加载类的时候读取它。

这里写图片描述

需要注意的是,如果采用是class,那么这个注解类会编译成一个独立的class类,但是由于运行时忽略,所以用反射读不出来数据。但是采用runtime是可以的。

Documented

这个注解和文档有关,所以要求我们在定义Documented的注解必须设置Retenttion的值采用的是runtime。

Inherited

继承是Java的特性,那么在注解上,父类的注解,会被子类继承吗,默认是不可以的,但是如果添加Inherited就可以啦,定义在父类的注解,有Inherited这个注解,那么继承的子类,读具备这个特性。

获取注解信息

在前面我们已经学习过了反射,可以通过反射来获取注解的信息,在使用的时候,需要明确一点,反射是在运行时获取信息,因此,要使用必须将注解申明成@Retention(RetentionPolicy.RUNTIME)

测试代码如下:

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation1 {
    String value1() default "laoqiang";

}


获取注解信息

@MyAnnotation1
public class Test26 {
   public static void main(String[] args) {
    //Test26.class是直接获取Test26的class对象
    //getAnnotation是根据如果存在这种类型的注解就返回。   
    //getAnnocations是根据该元素返回所有注解
    Annotation a = Test26.class.getAnnotation(MyAnnotation1.class);
    if(a!=null) {
        MyAnnotation1 m = (MyAnnotation1) a;//将注解强转为自定义注解,
        //就方便下面读取注解的属性的值,如果不强转的话,只可以获取它的注解类型
        System.out.println("注解的类型:"+m.annotationType().getName()+"注解的值:"+m.value1());
    }
    Method m = null;
    try {
        m = Test26.class.getMethod("show");//这里是获取指定方法的实例,所以当你要
        //获取构造函数,字段的注解,就在这里做出变化,获取对应的对象的实例
        Annotation[] annotations = m.getAnnotations();//获取所有的注解
        for(Annotation a1:annotations) {
            MyAnnotation1 m1 = (MyAnnotation1) a1;
            System.out.println("注解类型:"+a.annotationType().getName()+"注解的值:"+m1.value1());
        }
    } catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}
   @MyAnnotation1(value1="method")
   public static void show(){
        System.out.println("asdasda");
    }
}

Jdbc

Jdbc是Java语言用于访问数据库的应用编程接口,可以通过它访问各类数据库。对应的类库主要分布在java.sql和javax.sql。

数据库常用的类
  1. DriverManger,是JDBC的管理层。
  2. Connection接口,是特定的数据库的连接。通过DriverManager类的静态方法的getConnection()方法来获取。
  3. Statement对象勇敢与将sql语句发送到数据库中,执行对数据库的数据的检索或者更新,有两个子接口:CallableStatement和PreparedStatement。
  4. PreparedStatement接口:Statement主要用来执行静态的SQL语句,如果有些操作只是与SQL语句中某些参数有所不同,其余的SQL子句相同,则使用PrepareStatement来提高效率。使用PrepareStatement方法建立好一个预先编译的SQL语句:其中参数会变动的部分会先用“?”作为占位符,等到需要真正指定参数执行时,在是哟个相对的setXXX指定值的时候,?才有真正的参数值。
  5. ResultSet包含符合SQL语句条件中的所有行,并且提供get()方法来获取当前行中的不同列,并且有next方法来移动到ResultSet的下一行,使下一行成为当前行。通过Statement的相关方法来获取ResultSet对象,通常使用比较多的是executeQuery,执行给定的查询SQL语句,该语句返回单个ResultSet对象;executeUpdate执行给定的SQL语句,该语句可能为insert、update、delete,返回执行成功的条数,返回-1是失败。

获取对应查询结果列的方法:

这里写图片描述

数据库的使用
    private  static final String  URL = "jdbc:mysql://localhost:3306/test";
    private static Connection c = null;
    private static PreparedStatement ps = null;
    private static ResultSet rs = null;
    //mysql的url:jdbc:mysql://localhost:3306/test
    //oracle的url:jdbc:oracle:thin:@localhost:1521:sid/test
    //需要注意的是最后的test你你要链接的数据库的数据库的名字

    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //mysql驱动:com.mysql.jdbc.Driver
            //oracle驱动:oracle.jdbc.driver.OracleDriver
             c = (Connection) DriverManager.getConnection(URL, "root", "123456");
             ps = (PreparedStatement) c.prepareStatement("select name from student");
             rs = ps.executeQuery();
            while(rs.next()) {
            String name =   rs.getString(1);//根据列的序号来获取信息需要注意是从1开始。
            System.out.println(name+"\n");
            }


        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            if(rs!=null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(ps!=null) {
                try {
                    ps.cancel();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(c!=null) {
                try {
                    c.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    //注意点
    // 在使用jdbc来连接mysql和oracle数据库的时候要保证它们的服务时打开
    //数据库资源使用完毕要及时的关闭
数据库的封装与增删改查
public class DbUtil {
    private  static final String  URL = "jdbc:mysql://localhost:3306/test";
    private static Connection c = null;
    public static Connection getConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            c = (Connection) DriverManager.getConnection(URL, "root", "123456");

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return c;
   }
   public static void closeConnection() {
       if(c!=null) {
           try {
            c.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       }
   }

   public static void closePrepareStatement(PreparedStatement ps) {
       if(ps!=null) {
           try {
            ps.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       }

   }

   public static void closeResultSet(ResultSet rs) {
       if(rs!=null) {
           try {
            rs.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       }

   }



}

//增删改查

private static Connection c = null;
     public static void main(String[] args) {
        c =  DbUtil.getConnection();
        //insertStudent();
        //selectStudent();
        //updateStudent();
        deleteStudent();


    }

    public static  void insertStudent() {
        PreparedStatement ps = null;
        try {
             ps= (PreparedStatement) c.prepareStatement("insert into student(name,age) value(?,?)");
             ps.setString(1, "laohe");//注意这里设置值的序号是按占位符的顺序,从1开始
             ps.setInt(2, 23);
             int count = ps.executeUpdate();
             if(count!=-1) {
             System.out.println("scuess");
            }else {
                System.out.println("fail");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            DbUtil.closeConnection();
            DbUtil.closePrepareStatement(ps);
        }
    }

    public static  void deleteStudent() {
        PreparedStatement ps = null;
        try {
             ps= (PreparedStatement) c.prepareStatement("delete from student where id=?");
             ps.setInt(1, 2);
            int count = ps.executeUpdate();
            if(count!=-1) {
                System.out.println("scuess");
            }else {
                System.out.println("fail");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            DbUtil.closeConnection();
            DbUtil.closePrepareStatement(ps);
        }

    }

    public static  void updateStudent() {
        PreparedStatement ps = null;
        try {
             ps= (PreparedStatement) c.prepareStatement("update student set name ='laohe' where id=?");;
             ps.setInt(1, 2);
            int count = ps.executeUpdate();
            if(count!=-1) {
                System.out.println("scuess");
            }else {
                System.out.println("fail");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            DbUtil.closeConnection();
            DbUtil.closePrepareStatement(ps);
        }
    }


        public static  void selectStudent() {
            PreparedStatement ps = null;
             ResultSet rs =null;
            try {
                 ps= (PreparedStatement) c.prepareStatement("select name,age from student");
                 rs = ps.executeQuery();
                 while(rs.next()) {
                     String name = rs.getString(1);
                     int age = rs.getInt(2);
                     System.out.println("name:"+name+"\t\t\t"+"age:"+age);

                 }

            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                DbUtil.closeConnection();
                DbUtil.closePrepareStatement(ps);
                DbUtil.closeResultSet(rs);
            }


    }

//增删改查是最起初也是最重要的,任何负责的项目也是从它开始,看到这里还是希望读者,谨记:千里之行始于足下,共勉。
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.1 Java语言发展简史2 1.2 认识Java语言3 1.2.1 Java语言特性3 1.2.2 JavaApplet4 1.2.3 丰富的类库4 1.2.4 Java的竞争对手5 1.2.5 Java在应用领域的优势7 1.3 Java平台的体系结构7 1.3.1 JavaSE标准版8 1.3.2 JavaEE企业版10 1.3.3 JavaME微型版11 1.4 JavaSE环境安装和配置12 1.4.1 什么是JDK12 1.4.2 JDK安装目录和实用命令工具介绍12 1.4.3 设置环境变量13 1.4.4 验证配置的正确性14 1.5 MyEcilpse工具介绍JavaSE环境安装和配置15 1.6 本章练习16 第2章 2.1 什么是程序18 2.2 计算机中的程序18 2.3 Java程序19 2.3.1 Java程序中的类型19 2.3.2 Java程序开发三步曲21 2.3.3 开发Java第一个程序21 2.3.4 Java代码中的注释23 2.3.5 常见错误解析24 2.4 Java类库组织结构和文档27 2.5 Java虚拟机简介28 2.6 Java技术两种核心运行机制29 2.7 上机练习30 第3章 3.1 变量32 3.1.1 什么是变量32 3.1.2 为什么需要变量32 3.1.3 变量的声明和赋值33 3.1.4 变量应用实例33 3.2 数据的分类34 3.2.1 Java中的八种基本数据类型34 3.2.2 普及二进制36 3.2.3 进制间转换37 3.2.4 基本数据类型间转换38 3.2.5 数据类型应用实例38 3.2.6 引用数据类型39 3.3 关键字.标识符.常量39 3.3.1 变量命名规范39 3.3.2 经验之谈-常见错误的分析与处理40 3.3.3 Java标识符命名规则41 3.3.4 关键字42 3.3.5 常量42 3.4 运算符43 3.4.1 算术运算符43 3.4.2 赋值操作符45 3.4.3 关系操作符47 3.4.4 逻辑操作符48 3.4.5 位操作符49 3.4.6 移位运算符49 3.4.7 其他操作符50 3.5 表达式52 3.5.1 表达式简介52 3.5.2 表达式的类型和值52 3.5.3 表达式的运算顺序52 3.5.4 优先级和结合性问题52 3.6 选择结构54 3.6.1 顺序语句54 3.6.2 选择条件语句54 3.6.3 switch结构59 3.6.4 经验之谈-常见错误的分析与处理65 3.6.5 Switch和多重if结构比较66 3.7 循环语句66 3.7.1 While循环67 3.7.2 经验之谈-常见while错误70 3.7.3 do-while循环72 3.7.4 for循环74 3.7.5 经验之谈-for常见错误76 3.7.6 循环语句小结78 3.7.7 break语句79 3.7.8 continue语句82 3.8 JavaDebug技术84 3.9 本章练习85 第4章 4.1 一维数组90 4.1.1 为什么要使用数组90 4.1.2 什么是数组91 4.1.3 如何使用数组92 4.1.4 经验之谈-数组常见错误97 4.2 常用算法98 4.2.1 平均值,最大值,最小值98 4.2.3 数组排序102 4.2.3 数组复制103 4.3 多维数组105 4.3.1 二重循环105 4.3.2 控制流程进阶107 4.3.3 二维数组111 4.4 经典算法113 4.4.1 算法-冒泡排序113 4.4.2 插入排序115 4.5 增强for循环116 4.6 本章练习117 第5章 5.1 面向过程的设计思想120 5.2 面向对象的设计思想120 5.3 抽象121 5.3.1 对象的理解121 5.3.2 Java抽象思想的实现122 5.4 封装124 5.4.1 对象封装的概念理解124 5.4.2 类的理解125 5.4.3 Java类模板创建125 5.4.4 Java中对象的创建和使用127 5.5 属性130 5.5.1 属性的定义130 5.5.2 变量131 5.6 方法132 5.6.1 方法的定义132 5.6.2 构造方法135 5.6.4 方法重载138 5.6.5 自定义方法138 5.6.6 系统提供方法139 5.6.7 方法调用140 5.6.8 方法参数及其传递问题144 5.6.9 理解main方法语法及命令行参数147 5.6.1 0递归算法147 5.7 this关键字148 5.8 JavaBean149 5.9 包150 5.9.1 为什么需要包?150 5.9.2 如何创建包151 5.9.3 编译并生成包:151

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值