JavaWeb开发之一:Java连接数据库(再认识)

之前的项目中当然用到过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();
}
        
}

}


猜你喜欢

转载自blog.csdn.net/u012935646/article/details/47020891