java和sql数据库的使用(入门级)
刚学完java语法,第一个练手项目是一个java和sql的数据库管理程序,项目做了一大半,现在来总结一下在java程序中使用sql数据库以及简单的防sql注入(我用mysql,因为免费!)
以下按照使用sql所需要的顺序依次说明,后面的说明可能会用到前面程序中创建的对象
关于Connection,PreparedStatement和ResultSet
Connection:与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。
这是官方文档的说法,用普通话来说,就是用它保存与数据库连接的“钥匙”。
-
与数据库连接需要知道数据库的user、password和url,程序员设定好以上之后,通过DriverManager.getConnection(url,user,passwd)这个方法,,返回一个Connection对象
(PS:类DriverManager,管理一组 JDBC 驱动程序的基本服务。简单地说是创建Connection这个“钥匙”对象的方法)
-
以下为创建数据库连接(应该叫驱动程序?)的代码段
public static Connection getconn()
{
Connection conn = null;
String user = "";
String passwd = "";
String url = "";
//加载驱动
try
{
Class.forName("com.mysql.jdbc.Driver");//这里需要拿出来讲一讲
conn = DriverManager.getConnection(url,user,passwd);
}
catch (SQLException e)
{
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
return conn;
}
PreparedStatement:表示预编译的 SQL 语句的对象。
-
这个对象一般用来储存sql语句,也就是要在接下去的程序里执行的sql语句
SELECT * FROM TABLES WHERE ID=?;
类似以上的SQL语句(一般都是大写,为了更好地兼容性)
通过前面创建的conn对象中的prepareStatement(String sql)方法,可以返回一个PreparedStatement的对象。
中间之所以用问号,是为了做一个简单的防sql注入,通过PreparedStatement.setX(int parameterIndex, X x)方法,(有setDouble、setString等等)选择类型相对应的方法,将相应的数据放到“?”所在的位置。
-
以下是随便找了一段代码,用来对应PreparedStatement
conn = DbConn.getconn();
String sqlName = "UPDATE SALESMAN SET SNAME=? WHERE SID=?";
pstmt = conn.prepareStatement(sqlName);
pstmt.setString(1, sName.getSName());
pstmt.setInt(2, sName.getSId());此时sql语句中的两个“?”都已放入对应的量,预编译的处理结束
ResultSet:表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
这个用来保存数据库操作之后的结果,由方法PreparedStatement.executeUpdate()或者PreparedStatement.executeQuery()生成。前一个用来实现插入更新删除等操作,后一个专门用来查询数据用。
-
如果是 查询 操作则保存返回的一行行结果,如果是 插入更新删除 则保存
- (1) SQL 数据操作语言 (DML) 语句的行数
- (2) 对于无返回内容的 SQL 语句,返回 0
暂时觉得并没有什么卵用,用到插入更新删除操作的时候只要 返回值 > 0 就表示操作OK。
-
下面分别实现两类操作的代码
//插入更新删除等操作
int rs = pstmt.executeUpdate();
//查询操作
ResultSet rs = pstmt.executeQuery();在方法executeQuery()中,我们返回的是一个ResultSet对象,而在方法executeUpdate(),我们返回的是int类型的数据(行数?)。
到此为止,你已经可以通过java调用相应的SQL语句来获得数据了
然而数据库用完了还要关闭!
关闭数据库
通过前面的使用,我们把数据放在两种对象中:ResultSet和int,这也就意味着关闭数据库的方法不太一样
如果我们使用了Resultset,那我们需要和前面用过的的Connection、PreparedStatement一起关闭。
如果没有创建Resultset对象,那我们只需要关闭Connection和PreparedStatement。
-
代码分别如下图
public static void addClose(PreparedStatement pstmt, Connection conn)
{
try
{
if (pstmt != null)
{
pstmt.close();
}
}catch(SQLException e1)
{
e1.printStackTrace();
}
try
{
if(conn != null)
{
conn.close();
}
}catch(SQLException e)
{
e.printStackTrace();
}
}
public static void queryClose(PreparedStatement pstmt, ResultSet rs, Connection conn)
{
try
{
if (pstmt != null)
{
pstmt.close();
}
}
catch (SQLException e1)
{
e1.printStackTrace();
}
try
{
if(rs != null)
{
rs.close();
}
}
catch (SQLException e2)
{
e2.printStackTrace();
}
try
{
if(conn != null)
{
conn.close();
}
}
catch (SQLException e3)
{
e3.printStackTrace();
}
}
你需要在每一个数据库操作方法结束的时候关闭它们