106、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
Public String translate (String str) {
String tempStr = "";
try {
tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
tempStr = tempStr.trim();
}
catch (Exception e) {
System.err.println(e.getMessage());
}
return tempStr;
}
107.现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
108. 数据库部分
109、数据库三范式是什么?
第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解
第二范式:2NF是对记录的唯一约束,要求记录有唯一标识,即实体的唯一性
第三范式:3NF是对字段行的约束,即任何字段不能由其他字段派生出来,要求字段没有余,,(是直接相关而不是间接相关)
110、说出一些数据库优化方面的经验?
111、union和union all有什么不同?
Union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复, union:对两个结果集惊醒并集操作,不包括重复行,同时进行默认规则的排序,union all;对两个结果集进行并集操作包括重复行,不进行排序;
112查出比经理薪水还高的员工信息:
Drop table if not exists employees;
create table employees(id int primary key auto_increment,name varchar(50)
,salary int,managerid int references employees(id));
insert into employees values (null,'zxx',10000,null), (null,'lhm',15000,1
),(null,'flx',9000,1),(null,'tg',10000,2),(null,'wzg',10000,3);
Wzg大于flx,lhm大于zxx
select e.* from employees e,employees m where e.managerid=m.id and e.sala
ry>m.salary;
113、oracle关联查询题目1
数据库中有3个表 teacher 表,student表,tea_stu关系表。
teacher 表 teaID name age
student 表 stuID name age
teacher_student表 teaID stuID
要求用一条sql查询出这样的结果
1.显示的字段要有老师name, age 每个老师所带的学生人数
2 只列出老师age为40以下学生age为12以上的记录
预备知识:
1.sql语句是对每一条记录依次处理,条件为真则执行动作(select,insert,delete,update)
2.只要是迪卡尔积,就会产生“垃圾”信息,所以,只要迪卡尔积了,我们首先就要想到清除“垃圾”信息
实验准备:
drop table if exists tea_stu;
drop table if exists teacher;
drop table if exists student;
create table teacher(teaID int primary key,name varchar(50),age int);
create table student(stuID int primary key,name varchar(50),age int);
create table tea_stu(teaID int references teacher(teaID),stuID int references student(stuID));
insert into teacher values(1,'zxx',45), (2,'lhm',25) , (3,'wzg',26) , (4,'tg',27);
insert into student values(1,'wy',11), (2,'dh',25) , (3,'ysq',26) , (4,'mxc',27);
insert into tea_stu values(1,1), (1,2), (1,3);
insert into tea_stu values(2,2), (2,3), (2,4);
insert into tea_stu values(3,3), (3,4), (3,1);
insert into tea_stu values(4,4), (4,1), (4,2) , (4,3);
结果:2à3,3à2,4à3
解题思路:(真实面试答题时,也要写出每个分析步骤,如果纸张不够,就找别人要)
1要会统计分组信息:
select teaid,count(*) from tea_stu group by teaid;
2.要会筛选大于40的老师
先讲给1号学生带课的所有老师的名字,要知道1号学生的老师,要从哪个表获得?从tea_stu里才可以,从这个表里获得的是老师的什么?是老师的teaID,如果要得到老师的名称,则必须拿着teaID去teacher里找。所以,这两个表要进行关联,关联就引出迪卡尔既的问题。假设我们好获得teaID为1的老师的名称,我们要关联的是哪条记录?是1那一条,但是,迪卡尔既的结果有几条啊?4条,显然,我接着要做的就是把其他垃圾的3条去掉。
select * from tea_stu,teacher where tea_stu.teaID=teacher.teaID;
再接着去掉大于40的老师:
select * from tea_stu,teacher where tea_stu.teaID=teacher.teaID and teacher.age<=40;
3.再对上面的结果去掉小于12的学生
select * from
(select tea_stu.* from tea_stu,teacher where tea_stu.teaID=
teacher.teaID and teacher.age<40) as t,
student
where t.stuid=student.stuid and student.age>12;
4.再对上面的结果进行统计,显示的是老师的id和组信息
select t.teaID,count(*) from
(select tea_stu.* from tea_stu,teacher where tea_stu.teaID=
teacher.teaID and teacher.age<40) as t,
student
where t.stuid=student.stuid and student.age>12
group by t.teaID;
5.然后对上面的东西进行改写,改写成显示老师的名字
select teacher.name,t2.c from
(select t.teaID,count(*) c from
(select tea_stu.* from tea_stu,teacher where tea_stu.teaID=
teacher.teaID and teacher.age<40) as t,
student
where t.stuid=student.stuid and student.age>12
group by t.teaID) as t2,
teacher
where teacher.teaID=t2.teaID;
第二种写法:
select teacher.teaID, teacher.name, t1.total from teacher,
(select teaID,count(tea_stu.stuID) total from tea_stu, student
where tea_stu.stuID = student.stuID and student.age>12
group by teaID ) as t1
where teacher.teaID = t1.teaID and teacher.age<40 ;
求出发帖最多的人:
select authorid,count(*) total from articles
group by authorid
having total=
(select max(total2) from (select count(*) total2 from articles group by authorid) as t);
select t.authorid,max(t.total) from
(select authorid,count(*) total from articles )as t
这条语句不行,因为max只有一列,不能与其他列混淆。
select authorid,count(*) total from articles
group by authorid having total=max(total)也不行。
114、什么是存储过程和如何编写
存储过程是一组为了完成特定功能的sql语句集,
create or replace
procedure test
as
begin
过程
end;
--调用
begin
test;
end;
115、注册Jdbc驱动程序的三种方式
1,Class.forName(“com.oracle.jdbc.Driver”);
2,DriverManger.registerDriver(new com.oracle.jdbc.Driver());
3,System.setProperty(“jdbc.drivers”,”com.oracle.jdbc.Driver”);
116、用JDBC如何调用存储过程
{call过程名[(?,?,,,,)]}返回结果参数的过程的语法为
{?=call过程名[(?,?,,,,)]}
不带参的:{call过程名}
117、JDBC中的PreparedStatement相比Statement的好处
1,相对比较安全,可以防止sql注入
2,有裕编译功能,相同的操作批量数据效率较高
118. 写一个用jdbc连接并访问oracle数据的程序代码
private static final String DRIVER = " com.oracle.jdbc.driver.OracleDriver ";
private static final String URL = "jdbc:oracle:thin:@localhost:1521 =orcl";
private static final String UNAME = "sa";
private static final String PASS = "123";
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL,UNAME,PASS);
119、Class.forName的作用?为什么要用?
Class.forName(“”)返回的是以个类,任何Class都要装载虚拟机上才能运行,class.forName();就是装载类用的,(和NEW不一样,)
用:比如说给你以个字符串(代表以类的包名和类名),要你把他的类加载到虚拟机上的时候就要用到了,
答:调用该访问返回一个以字符串指定类名的类的对象。
120、大数据量下的分页解决方法。
121、用 JDBC 查询学生成绩单, 把主要代码写出来.
Connection getConnection()
{
private static final String DRIVER = " com.orcl.jdbc.Driver ";
private static final String URL = "jdbc:orcl ://localhost:1433;databasename=test";
private static final String UNAME = "sa";
private static final String PASS = "123";
Class.forName("com.orcl.jdbc.Driver");
return java.sql.DriverManager.getConnention(dbURL,dbUser,dbPwd);
}
public Employee getEmployee() throws SQLException {
STUDENT employee = null;
String sql = "SELECT * FROM STUDENT";
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
employee = null;
while (rs.next()) {
employee = new STUDENT ();
employee.stuid (rs.getInt("ID"));
}
} finally {
try {
if (rs != null)
rs.close();
} finally {
try {
if (ps != null)
ps.close();
} finally {
if (conn != null)
conn.close();
}
}
}
return employee;
}
122、这段代码有什么不足之处?
try {
Connection conn = ...;
Statement stmt = ...;
ResultSet rs = stmt.executeQuery("select * from table1");
while(rs.next()) {
}
} catch(Exception ex) {
}
需要异常处理
123、说出数据连接池的工作机制是什么?
J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
124、为什么要用 ORM? 和 JDBC 有何不一样?
Orm建立java对象与数据库对象之间的映射关系,程序员不需要编写复杂的sql语句,直接操作java对象即可,从而大大降低了代码量,也是程序员更加专注于业务逻辑的实现,
1. 代码繁琐问题,用jdbc访问数据库代码量大繁琐,容易出错,
2. 数据库连接问题,,关系数据对象之间,存在各种关系,,如果程序员用jdbc编程的话,就必须十分小心的处理这些关系,而这个过程是个很痛苦的过程,
3. Orm建立java对象与数据库对象关系映射,也自动根据数据库对象之间的关系创建java对象的关系,并且提供了维持这些关系的完整有效机制
4. 系统架构问题,现在的应用系统一般由展示层,业务层,数据访问层,数据层,各层次功能划分非常清楚,jdbc属于数据访问层,使用jdbc编程时就必须知道后台使用的是什么数据库,有哪些表,哪些字段,表与表之间有什么关系,索引,等等,,使用orm可以完全的屏蔽数据库,给程序员的只有java对象,程序员只需要根据业务逻辑的需要调用java对象,就可以实现对后台的数据库操作
5. 性能问题,jdbc很多时候存在效率地下的问题,orm框架讲根据具体数据库操作需要,会自动的延迟向后台数据库发送sql请求,尽量减少不必要的数据操作请求操作,