《《JAVA基础》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《JAVA基础》PPT课件.ppt(63页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、JAVA基础篇JAVA优点n平台无关性n分布式应用n多线程n纯面向对象n应用范围广(1)Java的桌面应用(2)JavaWeb应用(3)Java企业级应用(4)Java嵌入式应用JAVA编译原理Java编译程序将Java源程序编译成JVM可执行代码Java字节码.JAVA源文件源文件(.java)字节码字节码(.class)运行jvm 字节码的工作是由解释器来完成的。解释执行过程分三步进行:代码的装入、代码的校验、和代码的执行。代码的装入代码的装入:类装载器class loader代码的校验代码的校验:被装入的代码由字节码校验器进行检查代码执行代码执行:1)即时编译方式:解释器先将字节编译成机
2、器码,然后再执行该机器码。2)解释执行方式:解释器通过每次解释并执行一小段代码来完成java字节J2SE的运行环境设置n安装JAVASDK(JavaSoftwareDevelopmentKit)通常,我们需要设置三个环境变量:JAVA_HOME、PATH和CLASSPATH1.JAVA_HOME:SDK的安装目录如:c:java2.PATH:指定一个路径列表,用于搜索可执行文件的。如:d:oracleproduct10.1.0Db_2bin;%JAVA_HOME%bin3.CLASSPATH:也指定一个路径列表,是用于搜索Java编译或者运行时需要用到的类。如:.;%JAVA_HOME%lib
3、tools.jar;%JAVA_HOME%librt.jar;JAVA基本数据类型n进制二进制、八进制、十进制n整型1.byte(1个字节)2.int(4个字节)Integer3.short(2个字节)Short4.long(8个字节)n浮点型1.float(4个字节)2.doubleJAVA基本数据类型n字符型1.charn布尔型1.boolean数制:十进制:10八进制:012十六进制:0 x10String函数n常用函数nindexOf()nsubstring()nlastIndexOf()nreplace()nreplaceAll()nmatches()nsplit()ntoUpper
4、Case()nchardata=a,b,c;Stringstr=newString(data);System.out.println(abc);Stringcde=cde;System.out.println(abc+cde);Stringc=abc.substring(2,3);Stringd=cde.substring(1,2);DatenDate类型DateFormat.format(Date date)Datedate=newDate();/System.out.println(DateFormat.getInstance().format(date);SimpleDateFormat
5、sdf=newSimpleDateFormat(yyyy-MM-ddHH:mm:ss);/MMHHhhSystem.out.println(sdf.format(date);Calendar类型Calendarcal=Calendar.getInstance();cal.set(Calendar.DAY_OF_MONTH,20);GregorianCalendar类型GregorianCalendargc=newGregorianCalendar();gc.setTime(date);数组n一维组n二维数组n三维数组n例子:nintintArr=newint1,3,4;ncharcharArr
6、=newchara,b;n面向对象n类(内部类)访问控制符类:public/protected/n对象n包n重载(多态)n继承依赖聚合继承接口n接口声明n接口实现n接口多重实现n接口继承抽象n抽象类n抽象方法集合框架n映射(map)、集(set)、列表(list)、树(tree)、数组(array)、散列表(hashtable)集合基类nCollection接口是一组允许重复的对象。nSet接口继承Collection,但不允许重复。nList接口继承Collection,允许重复,并引入位置下标。nMap接口既不继承Set也不继承Collection。接口接口实现实现历史集合类历史集合类Se
7、tHashSetTreeSetListArrayListVectorLinkedListStackMapHashMapHashtableTreeMapPropertiesCollection接口n添加、删除元素booleanadd(Objectelement)booleanremove(Objectelement)n查询操作:intsize()booleanisEmpty()booleancontains(Objectelement)Iteratoriterator()Set 接口接口nHashSetnTreeSet(有序)List 接口接口voidadd(intindex,Objectele
8、ment)booleanaddAll(intindex,Collectioncollection)Objectget(intindex)intindexOf(Objectelement)intlastIndexOf(Objectelement)Objectremove(intindex)Objectset(intindex,Objectelement)ListIteratorlistIterator()ListIteratorlistIterator(intstartIndex)ListsubList(intfromIndex,inttoIndex)ArrayList 类和和 LinkedLi
9、st 类Map 接口接口JAVAIOnFile对象canRead()canWrite()delete()deleteOnExist()Exists()getAbsoluteFile()length()list()getName()getParent()getPath()listFiles()mkdir()InputStream抽象类及其子类字节流nAudioInputStreamnByteArrayInputStreamnFileInputStreamnFilterInputStreamnObjectInputStreamnPipedInputStreamnSequenceInputStrea
10、mnStringBufferInputStreamOutputStreamnByteArrayOutputStreamnFileOutputStreamnFilterOutputStreamnObjectOutputStreamnPipedOutputStream以字节为导向的streamnInput和和Output nInputStream1)ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用2)StringBufferInputStream:把一个String对象作为InputStream3)FileInputStream:把一个文件作为Input
11、Stream,实现对文件的读取操作4)PipedInputStream:实现了pipe的概念,主要在线程中使用5)SequenceInputStream:把多个InputStream合并为一个InputStreamOutputStream1)ByteArrayOutputStream:把信息存入内存中的一个缓冲区中2)FileOutputStream:把信息存入文件中3)PipedOutputStream:实现了pipe的概念,主要在线程中使用4)SequenceOutputStream:把多个OutStream合并为一个OutStream以以Unicode字符字符为导向的向的streamIn
12、putStream1)CharArrayReader:与ByteArrayInputStream对应2)StringReader:与StringBufferInputStream对应3)FileReader:与FileInputStream对应4)PipedReader:与PipedInputStream对应OutStream1)CharArrayWriter:与ByteArrayOutputStream对应2)StringWriter:无与之对应的以字节为导向的stream3)FileWriter:与FileOutputStream对应4)PipedWriter:与PipedOutputSt
13、ream对应线程n进程、线程(单CPU,多CPU)n单线程、多线程单线程代码1多线程代码线程n用Thread类创建线程n用Runnable接口创建线程nstart()nrun()njoin()线程合并后台线程与联合线程n如果我们对某个线程对象在启动(调用start方法)之前调用了setDaemon(true)方法,这个线程就变成后台线程。n对于Java程序来说,只要还有一个前台线程在运行,这个进程就不会结束,如果一个进程中只有后台线程在运行,这)个进程就会结束。nPp.join()的作用就是把pp所对于的线程合并到调用pp.join;语句的线程中。使用Runnable接口创建多线程n适合多个相
14、同程序的代码的线程去处理同一资源的情况,把虚拟的CPU(线程)同程序的代码、数据有效分离,较好体现了面向对象的设计思想n可以避免由于JAVA的继承特性带来的局限。假若一个类已经继承了另一类,则我们只能使该类实现Runnablen当线程被构造时,需要的代码和数据通过另一个对象作为构造参数传递时去,这个对象就是实现了Runnable接口。多线程的应用n网络聊天程序n发送键盘的数据,接收别人发送的数据从键盘上读取输入发送键盘的数据给对方接收对方的数据从键盘上读取输入发送键盘的数据给对方接收对方的数据多线程应用2n批量数据copy的问题nWEB服务器的请求及处理多线程同步n例子演示n代码块同步n方法块
15、同步产生者与消费者例子n一个往消息队列中放入消息n一个往消息队列中取出消息n消息内容包括产生的ID号及内容n三个生产者,三个消费者线程间的通讯nwait()/如队列为空,我们可以等待,或队列已经满的时候nnotify()/通知由wait()而等待的线程,如我们往某个列队中放数据时,这时可以通知。nnotifyAll()JAVA反射AWTSwingJDBC编程n应用程序JDBCMySQL DriverDb2 DriverOracle DriverMySQLDb2MySQL连接数据库的步骤n注册驱动(只做一次)n建立连接(Conntection)n创建执行SQL的语句(Statement)n执行语
16、句n处理执行结果n释放资源注册驱动nClass.forName(“com.mysql.jdbc.Driver”);n推荐这种方式,不会对具体的驱动类产生依赖。nDriverManager.registerDriver(com.mysql.jdbc.Driver);n会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。nSystem.setProperty(“jdbc.drivers”,“driver1:driver2”);n虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。n驱动类型(四种类型)建立连接(Connection)nConnectionco
17、nn=DriverManager.getConnection(url,user,password);nurl格式:JDBC:子协议:子名称/主机名:端口/数据库名?属性名=属性值&nUser,password可以用“属性名=属性值”方式告诉数据库;n其他参数如:useUnicode=true&characterEncoding=GBK。创建执行SQL的语句(Statement)nStatementStatementst=conn.createStatement();st.executeQuery(sql);nPreparedStatementStringsql=“select*fromtabl
18、e_namewherecol_name=?”;PreparedStatementps=conn.preparedStatement(sql);ps.setString(1,“col_value”);ps.executeQuery();处理执行结果(ResultSet)ResultSetrs=statement.executeQuery(sql);While(rs.next()rs.getString(“col_name”);rs.getInt(“col_name”);/释放资源n释放ResultSet,Statement,Connection.n数据库连接(Connection)是非常稀有的资
19、源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。基本的基本的CRUD(创建、建、读取、更新、取、更新、删除)除)n模板代码Connectionconn=null;Statementst=null;ResultSetrs=null;try/获得Connection/创建Statement/处理查询结果ResultSetfinally/释放资源ResultSet,Statement,Connection插入记录n增加对应SQL的INSERT,返回增加成功的行(记录)数conn=getConnection()
20、;Statementst=conn.createStatement();Stringsql=“insertintouser(name,age,regist_date)”+“values(name,10,now()”;inti=st.executeUpdate(sql);/i为插入的记录数读取记录n读取(查询)对应SQL的SELECT,返回查询结果conn=getConnection();st=conn.createStatement();Stringsql=selectid,name,age,regist_datefromuser;rs=st.executeQuery(sql);while(r
21、s.next()System.out.print(rs.getInt(id)+tt);System.out.print(rs.getString(name)+tt);System.out.print(rs.getInt(age)+tt);System.out.print(rs.getTimestamp(regist_date)+tt);System.out.println();SQL注入注入,PreparedStatement和和Statementn在SQL中包含特殊字符或SQL的关键字(如:or1or)时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用Prepare
22、dStatement来解决。nPreperedStatement(从Statement扩展而来)相对Statement的优点:1.没有SQL注入的问题。2.Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。3.数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库连接没有关闭的情况下有效)。数据数据类型型n详细信息见n几种特殊且比较常用的类型1.DATA,TIME,TIMESTAMPdate,time,datetime存:ps.setDate(i,d);ps.setTime(i,t);ps.setTimestamp(i,ts);取:rs.getD
23、ate(i);rs.getTime(i);rs.getTimestamp(i);2.CLOBtext存:ps.setCharacterStream(index,reader,length);ps.setString(i,s);取:reader=rs.getCharacterStream(i);reader=rs.getClob(i).getCharacterStream();string=rs.getString(i);3.BLOBblob存:ps.setBinaryStream(i,inputStream,length);取:rs.getBinaryStream(i);rs.getBlob(
24、i).getBinaryStream();一个一个简单用用户相关的数据相关的数据访问层nJ2EE三层架构简介表示层、业务逻辑层、数据访问层,三层之间用接口隔离。n定义domain对象User,定义存取用户的接口n用JDBC实现接口n用配置文件(properties)和反射实现与具体类的耦合事事务(ACID)n原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。n一致性(consistency):在事务处理执行前后,数据库是一致的(数据库数据完整性约束)。n隔离性(isolcation):一个事务处理对另一个事务处理的影响。n持续性(durability)
25、:事务处理的效果能够被永久保存下来。nconnection.setAutoCommit(false);/打开事务。mit();/提交事务。nconnection.rollback();/回滚事务。事事务(SavePoint)n当只想撤销事务中的部分操作时可使用SavePointnSavePointsp=connection.setSavepoint();nconnection.rollerbak(sp);mit();事事务(JTA)n跨越多个数据源的事务,使用JTA容器实现事务。n分成两阶段提交。njavax.transaction.UserTransactiontx=(UserTransac
26、tion)ctx.lookup(“jndiName);tx.begin();/connection1connection2(可能来自不同的数据库)mit();/tx.rollback();隔离隔离级别多线程并发读取数据时的正确性nconnection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);nV:可能出现,X:不会出现隔离级别隔离级别 脏读脏读 不可重复读不可重复读 幻读幻读 读未提交(Read uncommitted)VVV读已提交(Read committed)xVV可重复读(Repeatable rea
27、d)xxV可串行化(Serializable)xxx存储过程n存储过程CallableStatement(从PreperedStatement扩展来)cs=connection.prepareCall(“callpsname(?,?,?)”);cs.registerOutParameter(index,Types.INTEGER);cs.setXXX(i,xxxx);cs.executeUpdate();intid=cs.getInt(index);其他的几个其他的几个APInPreparedStatement.getGeneratedKeys()PreparedStatementps=con
28、nection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);ps.executeUpdate();ResultSetrs=st.getGeneratedKeys();rs.getInt(1);n批处理,可以大幅度提升大量增、删、改的速度。PreparedStatement.addBatch();PreparedStatement.executeBatch();其他的几个其他的几个APIn可滚动的结果集Statementst=connection.createStatement(ResultSet.TYPE_SCROLL_SENSI
29、TIVE,ResultSet.CONCUR_UPDATABLE);ResultSetrs=st.executeQuery(sql);rs.beforeFirst();rs.afterLast();rs.first();rs.isFirst();rs.last();rs.isLast();rs.absolute(9);rs.moveToInsertRow();n可更新的结果集conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);rs.updateString(colname,newvalu
30、e);rs.updateRow();DatabaseMetaData和ParameterMetaDatanDatabaseMetaDatameta=connection.getMetaData();n通过DatabaseMetaData可以获得数据库相关的信息如:数据库版本、数据库名、数据库厂商信息、是否支持事务、是否支持某种事务隔离级别,是否支持滚动结果集等。nParameterMetaDatapmd=preparedStatement.getParameterMetaData();n通过ParameterMetaData可以获得参数信息。ResultSetMetaDatanResultSe
31、tMetaDatameta=rs.getMetaData();n通过ResultSetMetaData可以获得结果有几列、各列名、各列别名、各列类型等。n可以将ResultSet放入Map(key:列名value:列值)。n用反射ResultSetMetaData将查询结果读入对象中(简单的O/RMapping)1)让SQL语句中列别名和要读入的对象属性名一样;2)通过ResultSetMetaData获得结果列数和列别名;3)通过反射将对象的所有setXxx方法找到;4)将3)找到的方法setXxx和2)找到的列别名进行匹配(即方法中的xxx于列别名相等);5)由上一步找到的方法和列别名对应
32、关系进行赋值Method.invoke(obj,rs.getObject(columnAliasName);数据源和数据源和连接池接池nDataSource用来取代DriverManager来获取Connection;n通过DataSource获得Connection速度很快;n通过DataSource获得的Connection都是已经被包裹过的(不是驱动原来的连接),他的close方法已经被修改。n一般DataSource内部会用一个连接池来缓存Connection,这样可以大幅度提高数据库的访问速度;n连接池可以理解成一个能够存放Connection的Collection;n我们的程序只和
33、DataSource打交道,不会直接访问连接池;一个一个简单的数据源的数据源实现n使用装饰模式的Connection(核心代码)classMyConnectionimplementsConnectionprivateConnectionrealConn;privateLinkedListconnPool;MyConnection(ConnectionrConn,LinkedListcPool)this.realConn=rConn;this.connPool=cPool;publicvoidclose()this.connPool.addLast(this);/.一个一个简单的数据源的数据源实
34、现nDataSource(核心代码)classMyDataSourceimplementsDataSourceprivateLinkedListconnPool=newVector();publicConnectiongetConneciton()if(this.connPool.size()0)returnthis.connPool.removeFirst(0);returncreateConnection();privateConnectioncreateConnection()ConnectionrealConn=DriverManager.getConnection();ConnectionmyConn=newMyConnection(realConn,this.connPool);returnmyConn;/.常用的开源实现DBCPn使用DBCP必须用的三个包:。nJavaAPI:BasicDataSourceFactory.createDataSource(properties);