JDBC(Java DataBase Connectivity):一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序.
访问MySQL数据库需要用到第三方的类,这些第三方的类,都被压缩在一个.Jar的文件里。mysql-connector-java-5.0.8-bin.jar包可以在网上下载,或者在MySQL的安装目录下找到。通常下载到该jar包之后将其放到在项目的lib目录下。
这里简要说明一下IDEA和eclipse的导包方法:
IDEA: Ctrl/Command + Shift + S打开 project structure->选择modules->选择dependence->点击右边的加号打开文件管理器->找到mysql-connector-java-5.0.8-bin.jar包的位置点击添加。
eclipse: eclipse: 右键project->property->java build path->libaries->add external jars
然后通过初始化驱动类com.mysql.jdbc.Driver,该类就在 mysql-connector-java-5.0.8-bin.jar中。如果你使用的是别的数据库那么该驱动类将不同。
Class.forName(DRIVER_NAME); //DRIVE_NAME=“com.mysql.jdbc.Driver”
数据库所处于的ip (如果是本机可以换为localhost,如果连接其他电脑上的数据库,请用本机ip)
数据库的端口号: 3306 (mysql专用端口号)
数据库名称 exam(数据库名称)
编码方式 UTF-8
账号 root
密码 admin(如果你在创建数据库的时候没有使用默认的账号和密码, 请填写自己设置的账号和密码)
//mysql驱动包名
private static final String DRIVER_NAME = "com.mysql.jdbc.Driver";
//数据库连接地址
private static final String URL = "jdbc:mysql://localhost:3306/user";
//用户名
private static final String USER_NAME = "root";
//密码
private static final String PASSWORD = "root";
private static Connection getConn(){
Connection conn=null;
try{
Class.forName(DRIVER_NAME);
conn=DriverManager.getConnection(URL,USER_NAME,PASSWORD);
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch (SQLException e){
e.printStackTrace();
}
return conn;
}
小技巧:因为在进行数据库的增删改查的时候都需要与数据库建立连接,所以可以在项目中将建立连接写成一个方法,用的时候直接调用即可。
String sql = “insert into tbuser values(null,”+"‘李四’)";
可以使用两种接口:Statement接口或者PreparedStatement接口
Statement s = conn.createStatement();
// SQL语句
// 注意: 字符串要用单引号'
String sql = "insert into tbuser values(null,"+"'李四')";
s.execute(sql);
System.out.println("执行插入语句成功");
String sql="SELECT * FROM tbuser WHERE ID=? AND PASSWORD=?";
ptmt=(PreparedStatement) conn.prepareStatement(sql);
ptmt.setString(1,id);// 第一个参数在查询语句中问号的次序,第二个是传递的值
ptmt.setString(2,password);
“?”在这里就起到占位符的作用。这种方式除了避免了Statement拼接字符串的繁琐之外,还能够提高性能。每次SQL语句都是一样的,数据库就不会再次编译,这样能够显著提高性能。
除此之外,PrepareStatement还有批量添加操作
for(int i=1;i<100;i++){
pstmt.setInt(1,i);
pstmt.setString(2,"赵_"+i);
pstmt.addBatch();
if(i%10==0){
pstmt.executeBatch();
}
}
execute可以执行查询语句,然后通过getResult把结果取出来。executeUpdate不能执行查询语句。
execute返回Boolean类型,true表示执行的是查询语句,false表示执行的insert、delete、update等。executeUpdate的返回值是int,表示有多少条数据受到了影响。
执行查询语句,并把结果集返回给集合ResultSet
ResultSet rs = s.executeQuery(sql);
利用While(ResultSet.next()){…}循环将集合ResultSet中的结果遍历出来。
ResultSet.getXX(); 这里的get方法的括号里面可以填属性值(大小写敏感的),如下图代码中的course_id,还可以填该属性在数据表中的列号,从1开始编码,例如:course_id在我的t-courses数据表中位于第一列,所以执行get方法的时候,我除了代码段中写法外,还可以这样写int courseId = rs.getInt(1);但是不推荐使用列号的这种方式,因为一段数据表中个属性值得顺序发生变化,就会导致这里出错,而使用属性名则不会出现这样的问题。
while (rs.next()){
int userId = rs.getInt("ID);
String userName = rs.getString("NAME");
}
在JDBC编码的过程中我们创建了PrepareStatement、Connection、ResultSet等资源,这些资源在使用完毕之后是一定要进行关闭的。关闭的过程中遵循从里到外的原则。因为在增删改查的操作中都要用到这样的关闭操作,为了使代码简单,增加其复用性,这里我将这些关闭的操作写成一个方法和建立连接的方法一起放到一份工具类中。
public static void close(PreparedStatement pstmt){
if(pstmt != null){ //避免出现空指针异常
try{
pstmt.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
public static void close(Connection conn){
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
public static void close(ResultSet rs){
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}