JDBC 是 java 数据库连接标准,是用于 Java 应用程序连接各种数据库的标准方法。
1)对 java 程序员来讲:JDBC 是一套访问数据库的 API,通过这套 API 能够实现 java 代码对数据 库的操作2)对数据库厂商来讲:JDBC 是一套底层的 java 语言接口模型,为各数据库厂商及第三方中间件 厂商实现与数据库的连接提供了标准服务方法
因为 JDBC 服务的标准是统一的,所以各个 数据库厂商依据标准提供了自己数据库的 JDBC 驱动 程序 。以MySQL为例:
JDBC连接数据库的过程:
1:加载驱动:
Class.forName(“com.mysql.jdbc.Driver”);加载驱动是将驱动跟当前的 java 程序建立关联,com.mysql.jdbc.Driver 是 MySql 的驱动类的类名, 目前必须这么写
2:建立连接:
String URL = "jdbc:mysql://localhost:3306/db1";
String USER = "root";
String PWD = "admin";
Connection conn = DriverManager.getConnection(URL, USER, PWD);
连接对象内部其实包含了Socket对象,是一个远程的连接。比较耗时!这是Connection对象管理的一个要点!)
*真正开发中,为了提高效率,都会使用连接池来管理连接对象!
3:创建执行对象
(1) //其中字符和日期数据还需要加上单引号(''),容易发生SQL 注入
String sql = "insert into product(pbrand,ptype,color,store,price) values('"+pbrand+"','"+ptype+"','"+color+"',"+store+","+price+")";()
Statement stmt = conn.createStatement();
(2)String sql = "insert into product(pbrand,ptype,color,store,price) values(?,?,?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "联想"); //sql- char varchar
pstmt.setString(2,"E430");
pstmt.setString(3,"黑色");
pstmt.setInt(4, 10);
pstmt.setBigDecimal(5, new BigDecimal(4100));
(3)<1>String sql = "{call sp_findallproduct()}";//调用存储过程sql语句
CallableStatement cstmt = conn.prepareCall(sql);
<2>String sql = "{call sp_findByCondition(?,?,?)}"
CallableStatement cstmt = conn.prepareCall(sql);
cstmt.setString(1, "联想"); //给参数赋值
cstmt.setString(2, ""); //可以变化参数
cstmt.setString(3, "白色");
4:执行SQL语句
增删改:
(1 int result = stmt.executeUpdate(sql); //对于 Statement,它不会在 java 环境中执行 sql 语句的,本质 上是它通过驱动将要执行的 sql 语句发送到数据库服务器执行,
(2)int result = pstmt.executeUpdate(); //返回的是 int 类型,即前面 提到的影响的行数,根据返回值判断操作是否成功。
查询:
String sql = "select * from product where pid=?";
ResultSet rs = pstmt.executeQuery();
ResultSet rs = cstmt.executeQuery();
if(rs.next()){ //根据主键查询,结果只能是1条,没必要使用while //打印rs
System.out.println(rs.getInt(1)+","+
rs.getString(2)+","+
rs.getString(3)+","+
rs.getString(4)+","+
rs.getInt(5)+","+
rs.getBigDecimal(6)+","+
rs.getString(7)); }
5:关闭资源
stmt.close();
pstmt.close();
cstmt.close();