一、简述创建流程
1.通过Class.forName(“com.mysql.jdbc.Driver”);来创建一个驱动。
2.通过DriverManager.getConnection(“jdbc:mysql://localhost:3306/数据库名称”,用户名,密码); —>其返回值是一个connection对象,用于驱动与mysql数据库的连接。
3.通过 connection.createStatement();来得到一个Statement的对象,主要用于执行 SQL语句。
4.Statement 对象通过执行 statement.executeQuery(sql语句)来操作mysql数据库,返回一个结果的Resultset的对象,里面存放着一张结果的表。
5.Resultset对象 ,通过调用next()方法,将游标往后移一位,就像这样:
最开始时,游标没有指向数据,当执行一次next()后就会指向第一行数据,此时就可以找到第一行数据。
6.通过Resultset.getXXX(下标);来得到数据,注意:下标从①开始。
注意:
1.关于Driver:
Class.forName("com.mysql.jdbc.Driver");
// 等于下边这两句
com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();//创建一个mysql的驱动
DriverManager.registerDriver(driver);//注册驱动
二、具体代码
1.查询
@Test
public void test() throws ClassNotFoundException, SQLException {
/**
* 加载驱动 --->背住:com.mysql.jdbc.Driver --->jdbc的Driver类
*/
Class.forName("com.mysql.jdbc.Driver");
/**
* 通过driverManager.getConnection来得到connection对象
* localhost:本地ip
* 3306:端口号
* day17test:数据库名称
* root:用户名
* xxxx:密码
*
*/
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/day17test", "root", "xxxx");
//编写sql语句
String sql = "SELECT AVG(age) FROM stu where sex = 'male'";
//获得statement对象来执行查询语句
Statement state = con.createStatement();
//执行state.executeQuery(str)语句并得到set结果对象
ResultSet set = state.executeQuery(sql);
//判断set对象是否还有下个元素(下一行)
while (set.next()) {
//输出set的下标为1的列的结果,返回string类型
//注意:返回值要想等
// 下标从1开始
System.out.println(set.getString(1));
}
}
注意:若发现查询不出结果,则在getConnection方法中的第一个参数后加上
?useUnicode=true&characterEncoding=UTF-8即可。
2.增加:
public static void add(String username,String name,int role_id) {
Connection con = null;
Statement state = null;
ResultSet set = null;
con = getConn();
try {
state = con.createStatement();
String sql = "INSERT `user` VALUES ('"+username+"','"+name+"',null,"+role_id+")";
int result = state.executeUpdate(sql);
if(result>0) {
System.out.println("插入成功");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
closeAll(con, state, set);
}
}
3.删除和修改省略;
三、规范化代码
连接对象: Connection
执行语句对象: State
结果表对象:ResultSet
都需要关闭,关闭顺序:
1.ResultSet
2.State
3.Connection
四、PrepareStatement
为了防止SQL语句攻击的。
例子:
public static void login(String userName,String password) throws SQLException {
Connection con = null;
Statement state = null;
ResultSet set = null;
con = getConn();
state = con.createStatement();
String sql = "SELECT * from stu where sname = '"+userName+"' and sid = '"+password+"'";
set = state.executeQuery(sql);
if (set.next()) {
System.out.println("登陆成功,欢迎您"+userName);
}else {
System.out.println("登陆失败!");
}
}
当我们传入参数恶意修改SQL语句时,总是会登陆成功的。
prepareStatement的使用:
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/day18homework", "root", "zxh86356449");
//传入的条件用?来限定
String sql = "Select * from user where id = ?";
//通过connection.prepareStatement(String sql)来得到prepareStatement对象
PreparedStatement pre = con.prepareStatement(sql);
//设置第一个?处的值为3
pre.setInt(1, 3);
//直接执行。
ResultSet set = pre.executeQuery();
set.next();
System.out.println(set.getString(1));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
论什么情况,都去使用PreparedStatement,而不是使用Statement。