JDBC入门(一)
JDBC介绍
jdbc就是java程序连接数据库的一种方式,就像是学校需要去买菜,那么学校到买菜的地方就需要有一条通道,有了通道之后还需要一辆可以拉菜的车才能买到菜
JDBC操作步骤
这里以java连接mysq为例l
- 导入jar包mysql-connector-java-5.1.32.jar
- 加载驱动
- 创建连接
- 执行sql语句
- 判断是否执行成功或把执行结果存入结果集
我们就查询这张数据库表
- 执行查询语句
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt =null;
ResultSet rs = null;
try {
//导入外部驱动包
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//建立连接 url:全球资源定位
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bankmanager", "root", "123456");
//创建preparedstatement对象 传入sql语句
String sql = "select * from test";
pstmt = conn.prepareStatement(sql);
//执行sql语句 并返回结果集
rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt(1)+"--"+rs.getString(2)+"--"+rs.getDouble(3));
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
try {
//关闭资源
rs.close();
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 执行修改语句
//导入jar包
Connection conn = null;
Statement stmt = null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//创建连接
String url = "jdbc:mysql://localhost:3306/bankmanager;"
String user = "root";
String password = "123456";
conn = DriverManager.getConnection(url, user, password);
//检查是否连接成功
// System.out.println(conn);
//执行sql语句
stmt = conn.createStatement();
String sql = "update user set name = '张无忌'where id = 1";
//执行成功返回false
System.out.println(stmt.execute(sql));
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
如果执行成功返回false
但是这种情况也会出现问题,出现修改后的名字是乱码,这是编码不同导致的
我们需要对代码加以修改
String url = "jdbc:mysql://localhost:3306/bankmanager?useUnicode=true&characterEncoding=utf-8";
在url后面加上 ?useUnicode=true&characterEncoding=utf-8 问题可以解决
- 执行条件查询语句
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");//创建连接
String url = "jdbc:mysql://localhost:3306/bankmanager?useUnicode=true&characterEncoding=utf-8";
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
String sql = "select * from login where name='张无忌' and pwd='1234'";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getString("name")+":"+rs.getString("pwd"));
}
}
使用createStatement()方法还会出现一个严重的问题 就是sql注入
什么是SQL注入
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
密码 后面输入 or 1=1 能够查询出所有数据。
String sql = "select * from login where name='张无忌' and pwd='12345'or 1=1;";
通过上述的语句 可以查到所有数据库中的数据。
所以这里不推荐使用createStatement()方法 为了防止SQL注入我们可以使用prepareStatement()方法。
代码如下:
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/bankmanager?useUnicode=true&characterEncoding=utf-8";//创建连接
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "select * from login where name=? and pwd=?;";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, "张无忌");
stmt.setString(2, "1234 or 1=1");
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("name")+":"+rs.getString("pwd"));
}
}
这种方法就可以防止SQL注入的问题,在pwd后面加上 “1=1” 页无法查询到数据库数据,保证了数据库的安全性
String sql = "select * from login where name=? and pwd=?;";
这段代码中 “?”代表占位符 再用PreparedStatement类型的变量调用 get+数据库数据类型(索引,参数)的方法传值
注意: 方法中索引从1开始。
上一篇: 忙里偷闲,逗你乐每周为你精选
下一篇: 生活中的经典笑话