[note] java与DB

本文详细介绍了如何使用Java访问MySQL数据库,包括加载JDBC驱动、建立连接、执行SQL语句(静态与动态)、处理结果集及连接管理。重点区分了Statement和PreparedStatement的使用场景与区别,同时提供了连接DB时避免乱码的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDBC制定了统一的访问各类关系数据库的标准接口。JDBC API是面向对象的。常用的类和接口均在java.sql.*包中

1. 连接MySQL 

>>>  到http://maven.apache.org/下载包: mysql-connector-java-%version%.jar 并添加到java project中的build path中去即可使用此包

         //把 mysql-connector-java-%version%-sources.jar 包添加到source attachment 中则可查看该包的源码

         //1. 加载JDBC驱动

         Class.forName("com.mysql.jdbc.Driver");

        // 2. 建立连接

        //mysql默认端口为3306,localhost可以换为IP,如果是连接其他数据库就可以改为 jdbc:sqlserver://... 等

        String url="jdbc:mysql://localhost:3307/databaseName";  
String user="username";  //登录该DB的用户名密码
String psw="psw";

        Connection con=DriverManager.getConnection(url,user,psw);

         //3. 执行SQL语句使用Statement接口或者PreparedStatement接口

         String sql="insert into table1 values ('andy','music')";

         Statement statement=con.createStatement();

         statement.executeUpdate(sql);

        //关闭连接

         conn.close;


2. 执行静态SQL语句使用Statement  

>>>  String sql="insert into table1 values ('andy','music')";

         Statement statement=con.createStatement();

         statement.executeUpdate(sql);

3. 执行动态SQL语句使用PreparedStatement  

>>>  String sql="insert into table1 values (?,?')";

         PreparedStatement ps=con.preparedStatement(sql);

         ps.setInt(1,10);//paramIndex, value

         ps.setString(2,'lucas'); 

         ps.executeUpdate();

4. 获得查询结果集使用ResultSet

>>>  String sql="select * from table1";

         Statement statement=con.createStatement();

         ResultSet set= statement.executeQuery(sql);

         while(set.next()){

                      int id=set.get("id");

                      int name=set.get("name");}

PS: set.get(int columnIndex) or set.get(String columnName)都可以取出对应结果集中对应行列的值


5. 使用Statement执行sql语句

>>> insert,delete,update语句都可以用statement.executeUpdate(sql);

        int affectedCount=statement.executeUpdate("update table1 set name='june' where id=1");

        int affectedCount=statement.executeUpdate("delete from table1 where id=1");

        int affectedCount=statement.executeUpdate("insert into table1 values ('3','lucy')");

>>> select语句可以用execute(sql),可以返回多个ResultSet

        ResultSet set=statement.execute("select * from table1");

>>>任意sql语句可以用executeQuery(sql),返回一个ResultSet


6. 使用PreparedStatement执行sql语句

>>>insert,update,delete语句也可以用executeUpdate(); 

eg: String sql="update table1 set name='june' where id=?";

       PareparedStatement ps=conn.preparedStatement(sql);

       ps.setInt(1,1);

       ps.executeUpdate();

 >>> select语句可以用executeQuery(),可以返回ResultSet

>>> 注意sql中的?不能用来指定表名。否则执行ps.execute();会报错

eg: String sql="select * from table1 where name=?";

       PareparedStatement ps=conn.preparedStatement(sql);

       ps.setString(1,"jack");

       ResultSet set= ps.executeQuery();

 >>>任意sql语句可以用execute()


7. 连接DB时避免乱码:

>>> String url="jdbc:mysql://localhost:3306/databaseName?characterEncoding=utf8";

       Connection con=DriveManager.getConnection(url,username,psw);


8. 一般为数据库连接单独做一个类并定义一个连接的静态方法,需要使用时直接调用即可以避免代码重复资源浪费等问题


9. 关于Statement和PreparedStatement的区别

    一般executeUpdate() 函数用来执行insert,delete,update或没有返回的DDL语句,executeQuery()用来执行select语句,并且返回ResultSet类型;

 >>>Statement需要把sql语句放到函数中执行,如 

        Statement statement=con.createStatement();然后执行 execute(sql), executeUpdate(sql), executeQuery(sql);  //需要设参

 >>>PreparedStatement需要一开始就初始化sql,然后执行函数

        PreparedStatement ps=con.preparedStatement(sql);  ps.setInt(1,1); etc.. 然后执行  execute(), executeUpdate(), executeQuery(); // 不需要设参了


10. 获取表结构用ResultSetMetaData

>>> ResultSet set=statement.executeUpdate(sql);

       ResultSetMetaData metadata = set.getMetaData();

>>>metadata.getColumnCount(); //获取表的columns数量

       metadata.getColumnName(int columnIndex); //获取某一个column的名字,index从1开始

       metadata.getColumnTypeName(int columnIndex); //获取某一个column的类型名称,index从1开始















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值