注解
定义:是用来为程序元素(类、方法、成员变量)设置说明和解释的一种元数据。
注解标记是可以在编译、类加载、运行的时候读取。
注解表现形式
Java注解采用“@”标记形式,后面跟上注解类型名称。
注解类型和注解的区别:
注解类型是某一类型注解的定义,类似于类,注解是某一注解类型的一个具体实例,类似于该类的实例。
Java中预定的注解
- Override是一个限定重写方法的注解类型,这个注解只能用于方法。我们读知道在Java中继承,必须重写父类的方法,如果我们在重写的时候,不小心将方法搞错了,这时编译是不会提醒我们的,所以容易出现错误,但是我们在上述继承中,如果我们在子类重写的方法上加上这个注解,那么在出现上述名字错误的时候,编译时就会报错。
- Deprecated这个注解是用来标识已过时的成员的注解类型,不建议使用。
- 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的值,可以不显示写出来
对注解进行注解
上面我们只是讨论自定义注解类型,下面四种专门用在注解上的注解类型。
- Target
- Retention
- Documented
- 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。
数据库常用的类
- DriverManger,是JDBC的管理层。
- Connection接口,是特定的数据库的连接。通过DriverManager类的静态方法的getConnection()方法来获取。
- Statement对象勇敢与将sql语句发送到数据库中,执行对数据库的数据的检索或者更新,有两个子接口:CallableStatement和PreparedStatement。
- PreparedStatement接口:Statement主要用来执行静态的SQL语句,如果有些操作只是与SQL语句中某些参数有所不同,其余的SQL子句相同,则使用PrepareStatement来提高效率。使用PrepareStatement方法建立好一个预先编译的SQL语句:其中参数会变动的部分会先用“?”作为占位符,等到需要真正指定参数执行时,在是哟个相对的setXXX指定值的时候,?才有真正的参数值。
- 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);
}
}
//增删改查是最起初也是最重要的,任何负责的项目也是从它开始,看到这里还是希望读者,谨记:千里之行始于足下,共勉。