【Java】Java学习笔记总结(三),
【Java】Java学习笔记总结(三),
2013-07-29
1. Socket是什么?如何开发基于C/S结构下的Socket程序,请说出步骤。
答:SOCKET用于在两个基于TCP/IP协议的应用程序之间相互通信。最早出现在UNIX系统中,是UNIX系统主要的信息传递方式。在WINDOWS系统中,SOCKET称为WINSOCK。
两个基本概念:客户方和服务方。当两个应用之间需要采用SOCKET通信时,首先需要在两个应用之间(可能位于同一台机器,也可能位于不同的机器)建立SOCKET连接,发起呼叫连接请求的一方为客户方,接受呼叫连接请求的一方成为服务方。客户方和服务方是相对的,同一个应用可以是客户方,也可以是服务方。
在客户方呼叫连接请求之前,它必须知道服务方在哪里。所以需要知道服务方所在机器的IP地址或机器名称,如果客户方和服务方事前有一个约定就好了,这个约定就是PORT(端口号)。也就是说,客户方可以通过服务方所在机器的IP地址或机器名称和端口号唯一的确定方式来呼叫服务方。在客户方呼叫之前,服务方必须处于侦听状态,侦听是否有客户要求建立连接。一旦接到连接请求,服务方可以根据情况建立或拒绝连接。连接方式有两种,同步方式(Blocking)和(noBlocking).
开发基于C/S结构下的Socket程序的步骤:
1)Server端(创建ServerSocket的实例);Client端(创建Socket);
2)打开连接到socket的输入/输出流;
3)按照一定的协议对socket进行读/写操作;
4)关闭socket。
2. 如何遍历集合类下的ArrayList、Vector、HashSet。如何遍历HashMap。写出核心代码。
答:遍历ArrayList:
//输出集合collection中的所有元素
public static void Shuchu(Collection collection) {
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
遍历ArrayList:
Vector v = new Vector();
for (int index = 0; index < v.size(); index++) {
String str = (String) v.elementAt(index);
}
遍历 HashSet:
Set set = new HashSet();
for (int i = 0; i < 100; i++) {
set.add("123");
}
for (Iterator it = set.iterator(); it.hasNext();) {
System.out.println(it.next());
}
遍历HashMap:
Map<Integer, String> map = new HashMap<Integer, String>();
for(int i=0;i<100;i++)
{
map.put(i, "123");
}
for(Entry<Integer, String> entry:map.entrySet())
{
System.out.println(entry.getKey()+"="+entry.getValue());
}
2013-07-30
SQL的增删改查
#增
INSERT INTO t_userr(username,password,sex) values('jj','11','n');
#删
DELETE FROM t_userr WHERE username = 'jj';
#改
UPDATE t_userr SET ruxueYear='2000',note="水电费" WHERE username='jj';
#查
SELECT id,username FROM t_userr WHERE sex='男';
SELECT username FROM t_userr;
SELECT realName FROM t_userr WHERE sex='男' AND school='中国计量学院';
SELECT * FROM t_userr;#全部信息
SELECT * FROM t_userr WHERE sex='女';
用Java向数据库中增加多条记录
package com.app;
public class GrilFriend {
public static void main(String[] args) {
BaseDAO bDao = new BaseDAO();
String[] secondclassify = {"面部护理","眼唇护理","精油SPA","彩妆","香氛","化妆工具"};
String[][] thirdclassify = new String[secondclassify.length][2];
String[][][] project = new String[secondclassify.length][thirdclassify.length][10];
int ss = 1;
for (int i = 0; i < secondclassify.length; i++) {
for (int j = 0; j < thirdclassify[i].length; j++) {
thirdclassify[i][j]=(j==0)?"分类":"功效";
for (int j2 = 0; j2 < 10; j2++) {
project[i][j][j2] = secondclassify[i] + thirdclassify[i][j] + j2;
Object[] s3 = {ss++,"化妆品",secondclassify[i],thirdclassify[i][j],project[i][j][j2]};
bDao.Update("insert into girlfriend(id,firstclassify,secondclassify,thirdclassify,project) values(?,?,?,?,?)",s3);
}
}
}
}
}
分类别查询最小的生日
SELECT * FROM t_userr WHERE birthdate in(SELECT MAX(birthdate) FROM t_userr GROUP BY sex);
2013-07-31
in和exists区别
in
in可以分为三类:1、形如select * from t1 where f1 in ( &apos;a &apos;, &apos;b &apos;),应该和以下两种比较效率
select * from t1 where f1= &apos;a &apos; or f1= &apos;b &apos;
或者 select * from t1 where f1 = &apos;a &apos; union all select * from t1 f1= &apos;b &apos;
你可能指的不是这一类,这里不做讨论。
2、形如select * from t1 where f1 in (select f1 from t2 where t2.fx= &apos;x &apos;),
其中子查询的where里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成exist语句,也就是效率和exist一样。
3、形如select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx),
其中子查询的where里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情况和数据量多少,一般认为效率不如exists.
除了第一类in语句都是可以转化成exists 语句的,一般编程习惯应该是用exists而不用in.
A,B两个表,
(1)当只显示一个表的数据如A,关系条件只一个如ID时,使用IN更快:
select * from A where id in (select id from B)
(2)当只显示一个表的数据如A,关系条件不只一个如ID,col1时,使用IN就不方便了,可以使用EXISTS:
select * from A
where exists (select 1 from B where id = A.id and col1 = A.col1)
(3)当只显示两个表的数据时,使用IN,EXISTS都不合适,要使用连接:
select * from A left join B on id = A.id
所以使用何种方式,要根据要求来定。
exists
exists是用来判断是否存在的,当exists(查询)中的查询存在结果时则返回真,否则返回假。not exists则相反。exists做为where 条件时,是先对where前的主查询询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断,如果为真则输出当前这一条主查询的结果,否则不输出。
in和exists区别
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。
NOT EXISTS,exists的用法跟in不一样,一般都需要和子表进行关联,而且关联时,需要用索引,这样就可以加快速度。
exists 相当于存在量词:表示集合存在,也就是集合不为空只作用一个集合。
例如 exist P 表示P不空时为真; not exist P表示p为空时为真。
in表示一个标量和一元关系的关系。
例如:s in P表示当s与P中的某个值相等时 为真; s not in P 表示s与P中的每一个值都不相等时为真:
not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;
而not extsts 的子查询依然能用到表上的索引。
所以无论那个表大,用not exists都比not in要快。
2013-08-01
MySQL性能优化
2013-08-02
以Java代码实现自增长并向数据库中一次性增添多条记录
package com.dao;
import java.util.*;
public class Test_Oracle {
static int id = new Oracle_DAO().MaxID("SELECT MAX(id) FROM Oracle_Test")+1;
// static int id = 1;
/** 产生一个随机的字符串,适用于JDK 1.7 */
// public static String random(int length) {
// StringBuilder builder = new StringBuilder(length);
// for (int i = 0; i < length; i++) {
// builder.append((char) (ThreadLocalRandom.current().nextInt(33, 128)));
// }
// return builder.toString();
// }
/** 产生一个随机的字符串*/
public static String RandomString(int length) {
String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuffer buf = new StringBuffer();
for (int i = 0; i < length; i++) {
int num = random.nextInt(62);
buf.append(str.charAt(num));
}
return buf.toString();
}
/** 得到 id 的下标 */
public static int IDNumber() {
return id++;
}
public static void main(String[] args) {
Oracle_DAO bDao = new Oracle_DAO();
String sql = "insert into Oracle_Test(id,username,password) select ?,?,? from dual";
String sqlString = " union select ?,?,? from dual ";
ArrayList<Object> aList= new ArrayList<Object>();
aList.add(IDNumber());
aList.add(RandomString(10));
aList.add(RandomString(6));
for (int i = 0; i < 19; i++) {
sql = sql +sqlString;
aList.add(IDNumber());
aList.add(RandomString(10));
aList.add(RandomString(6));
}
Object[] objects=new Object[aList.size()];
for(int i=0;i<aList.size();i++){
objects[i]=aList.get(i);
}
bDao.Update(sql, objects);
System.out.println(bDao.MaxID("SELECT MAX(id) FROM Oracle_Test"));
}
}
2013-08-03
1. Java连接Oracle有哪几种方式,说出区别,并写出各自的url。
答:第一种方式:通过数据库本身的JDBC Driver连接到数据库
Classs.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.33:1521
:huihoo","scott","tiger");
第二种方式:通过JDBC-ODBC桥连接到数据库
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection("jdbc:odbc:192.168.1.33","scott","tiger");
2. 为tom用户授予表emp的select、insert权限,写出对应的SQL语句。
答:grant select,update,insert ,dellete on scott.emp to tom;
3. 说出SQL注入漏洞的代码,并说出解决办法。
http://blog.csdn.net/jueblog/article/details/97507372013-08-04
1. 找出浙江出生的年纪最小的前5名学生。
答:Oracle代码:
SELECT * FROM (SELECT * FROM T_USER WHERE HOME LIKE '%浙江%' ORDER BY BIRTHDATE desc) WHERE ROWNUM<6;
2. Oracle分页程序的SQL。
答:
(1)采用伪列 rownum范例代码:
SELECT * FROM (SELECT ROWNUM rn,id,realname FROM (SELECT id,realname FROM T_USER)WHERE ROWNUM<=20) t2 WHERE T2.rn >=10;
(2)用分析函数row_number()over(ORDER BY 字段):
按ID排序后,从第10条记录开始,提取10条记录。
SELECT * FROM(SELECT id,realname,row_number()over(ORDER BY id asc) rn FROM T_USER)WHERE rn BETWEEN 10 AND 20;
(3)minus的写法:
按ID排序后,从第10条记录开始,提取10条记录。
(SELECT * FROM (SELECT * FROM T_USER ORDER BY id asc) WHERE ROWNUM<20) MINUS( SELECT * FROM (SELECT * FROM T_USER ORDER BY id asc) WHERE ROWNUM<10);
3. 存储过程和函数的区别,以及在控制台和Java语言中的调用方式。
答:存储过程和函数的区别:
存储过程 |
函数 |
用于在数据库中完成特定的操作或者任务(如插入、删除等) |
用于特定的数据(如选择) |
程序头部声明用procedure |
程序头部声明用function |
程序头部声明时不需要描述返回类型 |
函数头部声明时需要描述返回类型,而且PL/SQL块中至少 要包括一个有效的return语句 |
可以使用in/out/in out 三种模式的参数 |
可以使用in/out/in out 三种模式的参数 |
可以作为一个独立的PL/SQL语句来执行 |
不能独立执行,必须作为表达式的一部分调用 |
可以通过out/in out 返回零个或多个值 |
通过return语句返回一个值,且该值要与声明的部分一致,也可以是通过out类型的参数带出的变量 |
SQL语句(DDL或者select)中不可以调用存储过程 |
SQL语句(DDL或者select)中可以调用函数 |
在控制台中调用存储过程:用 exec 过程名() 执行存储过程。
在控制台中调用函数:直接写 SQL 语句,调用此函数。
Java中调用存储过程模板:
CallableStatement cs = conn.prepareCall(“{call 过程(?, ?, ?)} “);
cs.setXXX(1, 值1);
cs.setXXX(2, 值2);
cs.registerOutParameter(3, Types.NUMERIC);
cs.execute();
System.out.println(cs.getInt(3));
Java中调用函数:通过SQL语句调用。
相关文章
- 暂无相关文章
用户点评