JDBC部分的面试题,
1.JDBC操作数据库的步骤 ?
1.注册数据库驱动。
2.建立数据库连接。
3.创建一个Statement。
4.执行SQL语句。
5.处理结果集。
6.关闭数据库连接。
2.JDBC中的Statement 和PreparedStatement的区别?
PreparedStatement是预编译的SQL语句,效率高于Statement。
PreparedStatement支持?操作符,相对于Statement更加灵活。
PreparedStatement可以防止SQL注入,安全性高于Statement。
3.JDBC中大数据量的分页解决方法?
最好的办法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容。
sql语句分页,不同的数据库下的分页方案各不一样,
下面是主流的三种数据库的分页sql:
oracle:
select * from
(select *,rownum as tempid from student ) t
where t.tempid between ” + pageSize*(pageNumber-1) + ” and ” + pageSize*pageNumber
mysql:
select * from students limit ” + pageSize*(pageNumber-1) + “,” + pageSize;
sql server:
select top ” + pageSize + ” * from students where id not in +
(select top ” + pageSize * (pageNumber-1) + id from students order by id) +
“order by id;
4.说说数据库连接池工作原理和实现方案?
工作原理:JAVA EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。
客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。
如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。
当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
实现方案:返回的Connection是原始Connection的代理,代理Connection的close方法,
当调用close方法时,不是真正关连接,而是把它代理的Connection对象放回到连接池中,
等待下一次重复利用。
赋练习题一道:
// JDBC练习实例(实现注册登录等增删改查)
// 问题描述:流程如下,先登录,登录成功后显示操作界面,根据界面的提示,执行注册,修改,删除,查询的功能
// 1、实现用户的注册功能
// 2、实现用户的登陆功能
// 3、实现用户的修改,但要考虑用户是否真实存在
// 4、实现用户的删除功能。
// 5、实现用户的查询功能,查询全部及根据userName名去查询
代码实现方法一:(仅供参考):
package jdbcxiti_1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class text_1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String name,pass;
person ob=new person();
//注册
System.out.println("输入要注册的用户名");
name=sc.nextLine();
System.out.println("输入要注册的密码");
pass=sc.nextLine();
ob.register(name, pass);
//登录
System.out.println("输入登录用户名");
name=sc.nextLine();
System.out.println("输入登录密码");
pass=sc.nextLine();
ob.login(name, pass);
//修改
System.out.println("输入修改用户名");
String a=sc.nextLine();
System.out.println("输入修改密码");
String b=sc.nextLine();
ob.update(a, b);
//显示
ob.show();
}
}
class person{
String name;
String password;
boolean islogin=false;
void register(String name,String password)//用户注册
{ //1、连接
try (Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","数据库用户名","数据库密码");){
//sql语句
String sql="insert into t_user(username,pwd) values (?,?)";
//2、声明(PrepareStatement是Statement类的子类,解决了sql注入问题
PreparedStatement ps=con.prepareStatement(sql);
ps.setString(1, name);
ps.setString(2, password);
//3、执行
ps.execute();
//4、关闭
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
void login(String name,String password)//用户登录
{
try (Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","数据库用户名","数据库密码");){
String sql="select * from t_user where username=? and pwd=?";
PreparedStatement ps=con.prepareStatement(sql);
ps.setString(1, name);
ps.setString(2, password);
ps.execute();
ResultSet re=ps.getResultSet();
if(re.next())
{
this.name=name;
this.password=password;
islogin=true;
System.out.println("登陆成功,欢迎"+name);
}else
{
System.out.println("用户名或密码错误!");
}
re.close();
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
void update(String a,String b)//更改用户名或密码
{ if(islogin)
{
try (Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","数据库用户名","数据库密码");){
String sql="update t_user set username=?,pwd=? where username=? and pwd=?";
PreparedStatement ps=con.prepareStatement(sql);
ps.setString(1, a);
ps.setString(2, b);
ps.setString(3, name);
ps.setString(4, password);
ps.execute();
System.out.println("修改成功");
ps.close();
this.name=a;
this.password=b;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else
{
}
}
void show() //用户名及密码列表显示
{
try (Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","数据库用户名","数据库密码");){
Statement start=con.createStatement();
ResultSet re=start.executeQuery("select * from t_user");
String a,b;
while(re.next()){
a=re.getString(2);
b=re.getString(3);
System.out.println("name:"+a+" password:"+b);
}
re.close();
start.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
void delete() //删除用户
{
if(islogin)
{
try (Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","数据库用户名","数据库密码");){
String sql="delete from t_user where username=? and pwd=?";
PreparedStatement ps=con.prepareStatement(sql);
ps.setString(1, name);
ps.setString(2, password);
ps.execute();
System.out.println("删除成功");
ps.close();
islogin=false;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else
{
}
}
}
方法二:
package cn.itcast.JDBCday02;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
import java.sql.*;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class JDBCTest1 {
public static void main(String[] args) {
//JDBC练习实例(实现注册登录等增删改查)
// 问题描述:流程如下,先登录,登录成功后显示操作界面,根据界面的提示,执行注册,修改,删除,查询的功能
Scanner sc = new Scanner(System.in);
String usm,psw;
// 1、实现用户的注册功能,如果用户被注册了,则需要重新注册新用户;
System.out.println("请先注册账号");
System.out.println("请输入用户名:");
usm = sc.nextLine();
System.out.println("请输入密码:");
psw = sc.nextLine();
register(usm,psw);
// 2、实现用户的登陆功能
System.out.println("请输入用户名");
usm = sc.nextLine();
System.out.println("请输入密码");
psw = sc.nextLine();
login(usm,psw);
System.out.println("输入修改的用户名");
String xgusm = sc.nextLine();
System.out.println("输入修改的密码");
String xgpsw = sc.nextLine();
changeUser(xgusm,xgpsw);
show();
delete();
}
// 注册用户
public static void register(String usm,String psw){
DataSource ds = JDBCUtils.getDataSource();//连接池中获取对象,JDBCUtils是自己写的工具类
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = ds.getConnection();//连接数据库
String sql1 = "select * from t_user where username = ? and password = ?";
pstmt = conn.prepareStatement(sql1);
pstmt.setString(1,usm);
pstmt.setString(2,psw);
System.out.println("恭喜你,注册成功。请输入用户名和密码登录");
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(pstmt,conn);
}
}
// 用户登录
public static void login(String usm,String psw){
DataSource ds = JDBCUtils.getDataSource();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = ds.getConnection();
String sql = "SELECT * FROM t_user WHERE username = ? AND password = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,usm);
pstmt.setString(2,psw);
rs = pstmt.executeQuery();
if (rs.next()){
System.out.println("登录成功");
}else {
System.out.println("登录失败,用户名或者密码错误");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(pstmt, conn, rs);
}
}
// 3、实现用户的修改,但要考虑用户是否真实存在
public static void changeUser(String xgusm,String xgpsw){
DataSource ds = JDBCUtils.getDataSource();
Connection conn = null;
ResultSet rs = null;
PreparedStatement pstmt = null;
try {
conn = ds.getConnection();
String sql2 = "update t_user set username = ?, password = ? where id = ?";
pstmt = conn.prepareStatement(sql2);
pstmt.setString(1,xgusm);
pstmt.setString(2,xgpsw);
pstmt.setInt(3,3);
int count = pstmt.executeUpdate();
if (count > 0){
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(pstmt, conn, rs);
}
}
// 5、实现用户的查询功能,查询全部及根据userName名去查询
public static void show(){
DataSource ds = JDBCUtils.getDataSource();
//这里用更简单的Spring JDBC template 来做
JdbcTemplate template = new JdbcTemplate(ds);
String sql3 = "select * from t_user";
// 查询对象 ,将其封装为list集合
List<Map<String, Object>> maps = template.queryForList(sql3);
for (Map<String, Object> map : maps) {
System.out.println("查询全部:"+map);
}
String sql4 = "select * from t_user where username = ?";
Map<String, Object> som = template.queryForMap(sql4,"jack");
System.out.println("根据username查询:"+som);
}
// 4、实现用户的删除功能。
public static void delete(){
DataSource ds = JDBCUtils.getDataSource();
JdbcTemplate template = new JdbcTemplate(ds);
String sql5 = "delete from t_user where username = ?,password = ?";
int count = template.update(sql5,"grace","grace123");
if (count>0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
}
}
---------------------
|
|