1.数据库驱动html
2.JDBC介绍java
以下图所示:
mysql
java.sql
- 开发JDBC应用须要以上2个包的支持外,还须要导入相应JDBC的数据库实现(即数据库驱动)。 3.DriverManager类讲解 - Jdbc程序中的DriverManager用于加载驱动,并建立与数据库的连接,这个API的经常使用方法:
DriverManager.registerDriver(new Driver())
DriverManager.getConnection(url, user, password),程序员
- 注意:在实际开发中并不推荐采用registerDriver方法注册驱动。缘由有二:
1.查看Driver的源代码能够看到,若是采用此种方式,会致使驱动程序注册两次,也就是在内存中会有两个Driver对象。
2.程序依赖mysql的api,脱离mysql的jar包,程序将没法编译,未来程序切换底层数据库将会很是麻烦。sql
推荐方式:```Class.forName("com.mysql.jdbc.Driver");``` 采用此种方式不会致使驱动对象在内存中重复出现,而且采用此种方式,程序仅仅只须要一个字符串,不须要依赖具体的驱动,使程序的灵活性更高。 4.Connection类讲解 - Jdbc程序中的Connection,它用于表明数据库的连接,Collection是数据库编程中最重要的一个对象,客户端与数据库全部交互都是经过connection对象完成的,这个对象的经常使用方法: ·createStatement():建立向数据库发送sql的statement对象。 ·prepareStatement(sql) :建立向数据库发送预编译sql的PrepareSatement对象。 ·prepareCall(sql):建立执行存储过程的callableStatement对象。 ·setAutoCommit(boolean autoCommit):设置事务是否自动提交。 ·commit() :在连接上提交事务。 ·rollback() :在此连接上回滚事务。 5.ResultSet类卷动、更新数据 - Jdbc程序中的ResultSet用于表明Sql语句的执行结果。Resultset封装执行结果时,采用的相似于表格的方式。ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行以前,调用ResultSet.next() 方法,可使游标指向具体的数据行,进行调用方法获取该行的数据。 ResultSet既然用于封装执行结果的,因此该对象提供的都是用于获取数据的get方法: - 获取任意类型的数据
getObject(int index)
getObject(string columnName)数据库
- 获取指定类型的数据,例如:
getString(int index)
getString(String columnName)编程
- ResultSet还提供了对结果集进行滚动的方法:
next():移动到下一行
Previous():移动到前一行
absolute(int row):移动到指定行
beforeFirst():移动resultSet的最前面。
afterLast() :移动到resultSet的最后面。api
### 2、反射与ClassLoader - 当咱们使用一个类,若是这个类还未加载到内存中,系统会经过加载、链接、初始化对类进行初始化。``` 1.类加载:指的是将类的class文件读入JVM,并为之建立一个Class对象。 2.类链接:指的是把类的二进制数据合并到JRE中,这又分为3个阶段: ·校验:检查载入Class文件数据的正确性。 ·准备:给类的静态变量分配存储空间,并进行默认初始化。 ·解析:将类的二进制数据中的符号引用替换成直接引用。 3.初始化:对类的静态变量、静态初始化块进行初始化。 - 注意:
1.一个final类型的静态属性,若是在编译时已经获得了属性值,那么调用该属性时,不会致使该类初始化,由于这个至关于使用常量;
2.使用ClassLoader()方法,只是加载该类,并未初始化。数组
4.类加载器  - 类加载器就是负责将.class文件加载到内存中,并为之生成对应的java.lang.Class对象,它负责加载全部的类,而一旦一个类被加载入JVM中,就不会被再次载入了。 - 在Java中,一个类用其全限定类名(即包名+类名)做为标识。 - 在JVM中,一个类用其全限定类名和其类加载器做为标识。 - JVM运行时会产生3个ClassLoader,分别为:```BootstrapClassLoader```(根类加载器)、```ExtClassLoader```(扩展类加载器)和```AppClassLoader```(系统类加载器)。 - UML结构以下:  其中,BootstrapClassLoader负责加载JRE的核心类库,它不是ClassLoader的子类,使用C++编写,所以咱们在Java中看不到它,经过其子类的getParent()方法获取时,将返回null。BootstrapClassLoader负责装载JRE目标下的rt.jar、charsets.jar等Java核心类库。 ### 3、自定义泛型、枚举与注释 1.泛型 - 在JDK1.5版本以前,若是在集合中添加了不一样类型的数据,须要在程序的运行期间对类型之间的转换进行检查。 例如:
List arrayList=new arrayList();
- 在arrayList中添加String类型的对象和Integer对象,可是咱们定义以下一个数组
String[] values=new String[arrayList.size()];```
若是想要把arrayList转换成数组的话就会出现错误:安全
arrayList.toArray(values);//运行期间错误
这是由于List中包含了整型封装类型的对象。可是该错误只能在运行期间才能发现,程序可以正常的经过编译,并不会报错。对于程序中出现的错误,应该尽早的通知程序员。泛型可以很好地解决这个问题。
在JDK1.5版本以后Java提供了对泛型的支持。例如对于一个ArrayList列表来讲,若是只想在列表中放入String类型元素,能够用下面的方法来实现:
ArrayList<String> list=new ArrayList<String>();
2.枚举
枚举也是JDK1.5以后的版本之后Java新加入的特性。使用枚举能够表示一组常量数据。枚举的本质是一个类,可使用enum关键字来声明一个枚举类型,其声明方式以下:
[访问控制符] enum 枚举类型名{value1,value2,......}
使用枚举类型须要注意如下几点:
·枚举类型能够定义在类的内部也能够定义在类的外部。若是定义在类的内部,那么其访问控制符能够是public,protected,private或者默认的控制符。若是定义在类的外部,其访·问控制符只能是public和默认控制符;
·枚举类型中定义的value值都默认为public static final的。其值一经定义就不能在被修改了。多个value值之间须要用逗号隔开;
·枚举类型中除了能够声明常量以外还能够声明方法。可是方法须要在常量以后,而且常量和方法之间要用分号区分;
·枚举类型中的值能够经过枚举类型名直接对他们进行访问;
·枚举类型不能声明为abstract或者final类型;
public final String name()//返回枚举常量的名称;
public final int ordinal()//返回枚举常量在枚举类型中的位置,第一个枚举值序号为0,依次类推;
public String toString()//返回枚举常量的名字,能够重写此方法;
public static valueOf(enumType,String name)//返回与name名字相对应的枚举常量;
3.注释
在原始码中使用注释,对编译程序提供额外编译提示,或提供应用程序执行时期可读取的组态信息。注释能够仅用于原始码,编译后留在.class文档仅供编译程序读取或开放执行时期读取。
@Override //就是标准注释,被注释的方法必须是父类或接口中已定义的方法,请编译程序协助是否真的为从新定义方法。
@Deprecated //若是某个方法原先存在与API中,后来不建议再使用,能够在该方法上注释。如有用户后续想调用或从新定义这个方法,编译程序会提出警告。对于支持泛型的API,建议明确指定泛型真正类型,若是没有指定,编译程序会提出警告。
@SuppressWarnings //指定抑制unchecked的警告产生: @SuppressWarnings(value={"unchecked"})
@SafeVarargs //代表开发人员肯定避免了heap pollution问题。heap pollution问题就是编译程序没法检查执行时期的类型错误,没法具体确认自变量类型。
@FunctionalInterface //让编译程序可协助检查interface是否可作为lambda的目标类型
(1)若是注释名称自己没法提供足够信息,设置单值注释 (2)注释属性也能够用数组形式指定。 (3)在定义注释属性时,若是属性名称为value,则能够省略属性名称,直接指定值。 (4)对成员设定默认值,使用default关键字便可。 (5)要设定数组默认值,能够在default以后加上{},必要时{}中可放置元素值。
默认父类设定的注释,不会被继承至子类,在定义注释时,设定java.lang.annotation.Inherited注释,就可让注释被子类继承。
1.ElementType的枚举成员是用来限定哪一个声明位置能够进行标注。在JDK8中,增长了两个枚举成员TYPE _PARAMETER、TYPE _USE。 2.ElementType.TYPE _ USE可用于标注在各式类型,一个标注若是被设定为ElementType.TYPE_USE,只要是类型名称,均可以进行标注。 3.@Repeatable 可让你在同一个位置重复相同标注 4.@Filters 做为收集重复标注信息的容器,而每一个@Filters储存各自指定的字符串值。
1.自定义注释,默认会将注释信息存储于.class文档,可被编译程序或位码分析工具读取,但执行时期没法读取注释信息,在执行时期读取注释信息,可使用java.lang.annotation.Retention搭配java.lang.annotation.RetentionPolicy枚举指定。
2.RetentionPolicy为RUNTIME的时机,在于让注释在执行时期提供应用程序信息,可以使用java.lang.reflect.AnnotatedElement接口操做对象取得注释信息。
3.JDK 8中新增了getDeclaredAnnotation()、getDeclaredAnnotationsByType()、getAnnotationsByType()三个方法。 getDeclaredAnnotation()可让你取回指定的标注,在指定@Repeatable的标注时,会寻找收集重复标注的容器。 getDeclaredAnnotationsByType()、getAnnotationsByType()就不会处理@Repeatable的标记。
try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(ClassNotFoundException e){ System.out.println("找不到驱动程序类 ,加载驱动失败!"); e.printStackTrace() ; }
成功加载后,会将Driver类的实例注册到DriverManager类中。
2.提供JDBC链接的URL
·链接URL定义了链接数据库时的协议、子协议、数据源标识。
·书写形式:协议:子协议:数据源标识
·协议:在JDBC中老是以jdbc开始
·子协议:是桥链接的驱动程序或是数据库管理系统名称。
·数据源标识:标记找到数据库来源的地址与链接端口。
//例如:(MySql的链接URL) jdbc:mysql: //localhost:3306/test?useUnicode=true&characterEncoding=gbk ; useUnicode=true:表示使用Unicode字符集。若是characterEncoding设置为 gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。
3.建立数据库的链接
·要链接数据库,须要向java.sql.DriverManager请求并得到Connection对象, 该对象就表明一个数据库的链接。
·使用DriverManager的getConnectin(String url , String username ,String password )方法传入指定的欲链接的数据库的路径、数据库的用户名和 密码来得到。
//链接MySql数据库,用户名和密码都是root String url = "jdbc:mysql://localhost:3306/test" ; String username = "root" ; String password = "root" ; try{ Connection con = DriverManager.getConnection(url , username , password ) ; }catch(SQLException se){ System.out.println("数据库链接失败!"); se.printStackTrace() ; }
4.建立一个Statement
·要执行SQL语句,必须得到java.sql.Statement实例,Statement实例分为如下3种类型:
一、执行静态SQL语句。一般经过Statement实例实现。 二、执行动态SQL语句。一般经过PreparedStatement实例实现。 三、执行数据库存储过程。一般经过CallableStatement实例实现。
·具体的实现方式:
Statement stmt = con.createStatement() ; PreparedStatement pstmt = con.prepareStatement(sql) ; CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ;
5.执行SQL语句
·Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate和execute
1.ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。 2.int executeUpdate(String sqlString):用于执行INSERT、UPDATE或 DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等 3.execute(sqlString):用于执行返回多个结果集、多个更新计数或两者组合的语句。
·具体实现的代码:
ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ; int rows = stmt.executeUpdate("INSERT INTO ...") ; boolean flag = stmt.execute(String sql) ;
6.处理结果
·两种状况:
1.执行更新返回的是本次操做影响到的记录数。 2.执行查询返回的结果是一个ResultSet对象。
7.关闭JDBC对象
`操做完成之后要把全部使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:
1.关闭记录集 2.关闭声明 3.关闭链接对象
if(rs != null){ // 关闭记录集 try{ rs.close() ; }catch(SQLException e){ e.printStackTrace() ; } } if(stmt != null){ // 关闭声明 try{ stmt.close() ; }catch(SQLException e){ e.printStackTrace() ; } } if(conn != null){ // 关闭链接对象 try{ conn.close() ; }catch(SQLException e){ e.printStackTrace() ; } }
七周的学习,咱们已经基本学完了Java的基础知识。可是我知道本身并无掌握好每个点,若是如今让我独立去编写一个程序,极可能依旧会出现不少错误和漏洞。
在接下来的学习中,我就要多多实践,多编写程序,经过经验的积累让本身对Java的理解逐渐深刻。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 10/10 | |
第二周 | 300/500 | 1/3 | 16/26 | |
第三周 | 300/800 | 1/4 | 18/44 | |
第四周 | 300/1100 | 1/5 | 18/62 | |
第五周 | 250/1350 | 1/6 | 14/76 | |
第六周 | 400/1750 | 2/8 | 14/90 | |
第七周 | 300/2050 | 2/10 | 10/100 | |
第八周 | 300/2350 | 2/12 | 10/110 | |
第九周 | 300/2650 | 3/15 | 10/120 |