之前的项目中当然用到过Java连接数据库,不过当时并没有刨根问底,直接使用现成的连接数据库的javabean来用;
但是现在,很有必要重新自己动手写一写代码,当然,收获是很多的。现在我们再来复习一下:
Java连接MySQL数据库:
定义所需变量:
1.定义divername=”com.mysql.jdbc.Driver“
2.定义url="jdbc:mysql://localhost:3306/dbname" //dbname指数据库的名称(区分某个连接中的多个数据库)
中文乱码问题:可能出现Java文件中的中文查询到数据库执行时变成乱码
解决方法:要在url字符串追加本句:"?useUnicode=true&characterEncoding=utf-8"
并且在前端jsp页面中业最好是用UTF-8的编码方式,以预防乱码问题
3.定义连接的username(="root")
4.定义密码password(="yourpswd")
以上四要素定义完成后需要定义一个Connection类对象;
开始连接:
1.加载驱动:Class.forName(drivername).newInstance();
2.使用DriverManager.getConnection方法返回一个Connection对象,getConnection(url,username,password);该方法有三个参数,即刚才已经定义的三个参数;
上述完成后即与数据库建立了连接
开始数据库操作:
构造字符串注意事项:直接字符串拼接法+Statement对象执行(直接执行sql命令)
此种方法的弊端:拼接的字符串包括前端提交的数据,如是拼接容易遭受sql注入攻击
占位符构造字符串+PreparedStatement对象执行(先预编译成sql命令)
与直接执行sql命令相比:此种方法效率更高,而且使用站位符来实现字符串的构造,对于sql的文本结构有更好的阅读性,且可以防止sql注入攻击
插入(insert)、删除(delete)、修改(update)、查询(select)
其中插入+删除+修改都没有涉及数据的读出,即只需执行sql命令完成相关操作即可;
但是查询操作:要有ResultSet对象来接受一个查询返回的结果集,然后再通过其对象的get方法获得相应属性的结果(此时通常是一个同类型元素构成的数组)
1.insert操作
//使用占位符防止sql注入
// int cid = 1;
// String clsname = "";
// String sql1 = "insert into classinfo (cid,clsname)values(?,?)";
// //sql语句预编译
// PreparedStatement pstm1 = conn.prepareStatement(sql1);
// clsname = "计算机2班";
// //设置参数:注意第一个参数表示的是第几个问号,是从1开始的
// pstm1.setInt(1, cid);
// pstm1.setString(2, clsname);
// //插入了几条数据,返回的就是几
// int count1 = pstm1.executeUpdate();
// System.out.println(count1 + "条数据被插入");
2.delete操作
// int id = 1;
// String sql2 = "delete from classinfo where id = ?";
// PreparedStatement pstm2 = conn.prepareStatement(sql2);
// pstm2.setInt(1, id);
// int count2 = pstm2.executeUpdate();
// System.out.println("删除了" + count2 + "条数据");
3.update操作
// int cid = 3;
// String clsname = "测试班级";
// int id = 3;
// String sql3 = "update classinfo set cid = ?,clsname = ? where id = ?";
// PreparedStatement pstm3 = conn.prepareStatement(sql3);
// pstm3.setInt(1, cid);
// pstm3.setString(2, clsname);
// pstm3.setInt(3, id);
// int count3 = pstm3.executeUpdate();
// System.out.println("修改了" + count3 + "条数据");
4.select操作
int sclass = 3;
String sql4 = "select * from stuinfo where sclass = ?";
PreparedStatement pstm4 = conn.prepareStatement(sql4);
pstm4.setInt(1, sclass);
ResultSet rs = pstm4.executeQuery();
while(rs.next()) {
int id = rs.getInt("id");
String snum = rs.getString("snum");
String sname = rs.getString("sname");
int sclass1 = rs.getInt("sclass");
System.out.println(snum + ":" + sname);
}
使用占位符+PreparedStatement:
定义含有占位符(?)的字符串;
获得一个连接对于上述字符串的预编译对象;
通过此对象的set方法设置不同站位符对应的不同变量值:String类型用setString(index,"string")、int类型用set(index,integer);index指的是占位符的序号,注意序号从1开始,有几个占位符就要就要写几个set函数,不要漏写对站位符的置值操作;
取结果集使用ResultSet对象,用while(rs.next())String str = rs.getString("username");来获取结果集的内容并存到string变量中,注意getString()方法每次只取出结果集的一个,即指向数据集的指针每次只往下移动一行。
另外,上述所说的数据库操作应该放在try{...}catch(Exception e){e.printStackTrace();}块中,否则执行时直接抛出异常,非常不建议这样操作;
可执行的完整JAVA代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//数据库的驱动名,不同的数据库驱动名是不相同的
String drivername = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/etc?useUnicode=true&characterEncoding=utf-8";
String username = "root";
String password = "1";
Connection conn = null;
//加载mysql数据库驱动,让java程序可以访问mysql数据库
try {
Class.forName(drivername).newInstance();//类加载函数
conn = DriverManager
.getConnection(url,username,password);新建连接,使用getConnection
System.out.println(conn);
//查询
int sclass = 3;
String sql4 = "select * from stuinfo where sclass = ?";
PreparedStatement pstm4 = conn.prepareStatement(sql4);
pstm4.setInt(1, sclass);
ResultSet rs = pstm4.executeQuery();
while(rs.next()) {
int id = rs.getInt("id");
String snum = rs.getString("snum");
String sname = rs.getString("sname");
int sclass1 = rs.getInt("sclass");
System.out.println(snum + ":" + sname);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}