-
概念:
JDBC是Sun公司制定的一套操作数据库的标准规范
-
核心
DriverManager : 驱动管理类,用于注册驱动
Connection: 与数据库创建的连接
Statement:用于承载Sql语句的,并返回结果集
ResultSet: 结果集,或者说是一张虚拟表
- 导入Mysql驱动jar包
-
实现JDBC操作
1.注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
一般不用上面这个注册驱动方法,原因是对jar包依懒性太强,并且注册了2次。应该使用反射机制:
Class.forName("com.mysql.jdbc.Driver");
2.获取连接的Connection对象
1)第一种方式:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb3", 账号,密码);
第二种方式:`
Properties properties = new Properties();
properties.setProperty("user", 账号);
properties.setProperty("password", 密码);
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb3", properties);`
第三种方式:
` Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb3?user=账号&password=密码");`
3.得到执行sql语句的对象Statements
`Statement statement = connection.createStatement();`
注意:createStatement()一般也不用,安全性问题,Sql注入问题,下面会讲到!
-
执行sql并返回结果集ResultSet
ResultSet set = statement.executeQuery("select * from stu");
返回结果
`
while(set.next()){
System.out.println(set.getObject(1));
System.out.println(set.getObject(2));
System.out.println(set.getObject(3));
System.out.println("------------------");
}`
6.关闭资源
`set.close();
statement.close();
connection.close();`
上面只是基本操作,下面再来简单补充:
ResultSet executeQuery(String sql) 根据查询语句返回结果集。只能执行select语句。
int executeUpdate(String sql) 根据执行的DML(insert update delete)语句,返回受影响的行数。
boolean execute(String sql) 此方法可以执行任意sql语句。返回boolean值,表示是否返回ResultSet结果集。仅当执行select语句,且有返回结果时返回true, 其它语句都返回false;
2.ResultSet
提供一个游标,默认游标指向结果集第一行之前。
调用一次next(),游标向下移动一行。
提供一些get方法。
封装数据的方法
Object getObject(int columnIndex); 根据序号取值,索引从1开始
Object getObject(String ColomnName); 根据列名取值。
将结果集中的数据封装到javaBean中
java的数据类型与数据库中的类型的关系
byte tityint
short smallint
int int
long bigint
float float
double double
String char varchar
Date date
boolean next() 将光标从当前位置向下移动一行
int getInt(int colIndex) 以int形式获取ResultSet结果集当前行指定列号值
int getInt(String colLabel) 以int形式获取ResultSet结果集当前行指定列名值
float getFloat(int colIndex) 以float形式获取ResultSet结果集当前行指定列号值
float getFloat(String colLabel) 以float形式获取ResultSet结果集当前行指定列名值
String getString(int colIndex) 以String 形式获取ResultSet结果集当前行指定列号值
String getString(String colLabel) 以String形式获取ResultSet结果集当前行指定列名值
Date getDate(int columnIndex);
Date getDate(String columnName);
void close() 关闭ResultSet 对象
可移动游标的方法:
boolean next() 将光标从当前位置向前移一行。
boolean previous() 将光标移动到此 ResultSet 对象的上一行。
boolean absolute(int row) 参数是当前行的索引,从1开始 根据行的索引定位移动的指定索引行。
void afterLast() 将光标移动到末尾,正好位于最后一行之后。
void beforeFirst() 将光标移动到开头,正好位于第一行之前。
实现一个登陆功能
客户端:
`public class Login {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入用户名:");
String user = input.nextLine();
System.out.println("请输入密码:");
String password = input.nextLine();
Server server = new Server();
try {
JavaBean bean=server.getBean(user, password);
if(bean!=null){
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}`
服务端:
`
public class Server {
Connection connection = null;
PreparedStatement sm = null;
ResultSet rs = null;
JavaBean bean = null;
public JavaBean getBean(String name,String password) throws Exception {
connection = DBUtils.getConnection();
String sql= "SELECT * FROM stu WHERE NAME = ? AND id = ?";
sm = connection.prepareStatement(sql);//先编译sql语句,之后添加or等关键字将会过滤掉
sm.setString(1, name);
sm.setString(2, password);
rs = sm.executeQuery();
if(rs.next()){
bean = new JavaBean();
return bean;
}
return null; }}
`
可以看到,我这里使用了?,表示一个占位符,使用了prepareStatement并不是createStatement()原因是先编译sql语句,那么如果用户输入 or 关键字的话会被过滤掉。保证了防止sql注入。