jdbc

   jdbc使用分为五个步骤

一:注册驱动
二:建立与数据库的连接,获得连接对象
三:根据连接对象,获得一个对象
四:根据获得的对象执行SQL语句
五:释放资源(关流)

一:注册驱动

DriverManager.registerDriver(new Driver());
//因为驱动是分厂家的
//使用上述方法会有重复性的操作
//所以推荐使用以下方法
Class.forName("com.mysql.jdbc.Driver");
//上述方法会得到com.mysql.jdbc.Driver类的一个类的对象
//首先它会将这个类加载到内存中
//当这个类加载进内存后
//这个类的静态代码块就会跟着执行
//所以在静态代码块中,就已经成功注册了驱动的代码

二:建立与数据库的连接,获得连接对象

//方法一:
 Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/jdbc",
                "root",
                "111111"
        );

 //方法二:
   Connection conn = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/jdbc?   user=root&password=111111");
  //? 起到的作用是连接参数
  //user是参数名,root是参数值(数据库用户名)
  //&是与,在参数与参数之间起到连接作用

 //方法三:
  Connection conn = DriverManager.getConnection(           "jdbc:mysql://localhost:3306/jdbc",properties
        );
//创建一个properties对象
//用来存储参数,用户名密码
Properties properties = new Properties();
//以key-value的方式存储
properties.setProperty("user","root");
properties.setProperty("password","111111");      

三:根据连接对象,获得一个对象

//方法一:
根据连接对象,获得statement对象
Statement statement = conn.createStatement();
//上述方法存在SQL注入漏洞所以并不推荐使用
//推荐方法如下

//方法二:
//查询表stu中张益达的所有信息
//获得预处理对象
PreparedStatement pstmt = conn.prepareStatement
         //?只为一个占位符
         ("select * from stu where name = ?;");
         // 1 为第一个?号的位置
         //假如想往第二个问号里添加参数那么就写2
         //假如要使用增删改功能,那么在values后面括号中
         //是否有null或是否有具体的值无关
         //在sql语句中有几个问号,那么就需要传递多少个参数
         pstmt.setString(1,"张益达");
         //执行语句并把它传入rs中
         //查询使用executeQuery
         //增删改使用executeUpdate
         ResultSet rs = pstmt.executeQuery();
         //遍历循环输出rs中的内容
          while (rs.next()){
            System.out.println(
                    "id:"+rs.getObject(1)+"\n"+
                    "名字:"+rs.getObject(2)+"\n"+
                    "年龄:"+rs.getObject(3)
            );
        }
## 四:根据获得的对象执行SQL语句 ##

//由获取到statement对象,执行sql语句
statement.execute(“你需要执行的sql语句”)
//同理
//查询使用executeQuery
//增删改使用executeUpdate
//在使用executeQuery与executeUpdate他们的返回值为受影响 的行数即为int类型
int a = statement.executeQuery(“你需要执行的sql语句”);
//如果使用execute则是布尔类型
//即执行sql语句后,得到了一个ResultSet对象就会返回true
//如果得到的是受影响的行数,或者没有得到什么结果,那么返回 false;
//得出的结果一般使用xx.next进行while循环遍历输出

## 五:释放资源(关流) ##
释放资源即流即使用try catch finally进行关流

public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//建立集合接收结果并遍历输出
List stus = new ArrayList<>();
try {
Class.forName(“com.mysql.jdbc.Driver”);

         conn = DriverManager.getConnection
                   ("jdbc:mysql://localhost:3306/jdbc?user=root&password=111111");

// jdbc: mysql://localhost: 3306 /jdbc ? 参数
// 协议 子协议 本机地址 端口号 数据库名字

         stmt = conn.createStatement();
        //执行查询语句
         rs = stmt.executeQuery
                ("SELECT * FROM stu;");
        //判断下一行有没有数据
        //如果有数据,会返回true,没有数据的话就返回false
        //true就循环,false就停止
        while (rs.next()){
            //创建stu对象,并将数据set进stu对象中
            Stu stu = new Stu();
            stu.setId(rs.getInt(1));
            stu.setName(rs.getString(2));
            stu.setAge(rs.getInt(3));
            //添加到集合里
            stus.add(stu);
        }
        for (Stu stu:stus){
            //输出一下
            System.out.println(stu.toString());
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
//      释放资源
       if (conn!=null){
           try {
               conn.close();
           } catch (SQLException e) {
               e.printStackTrace();
           }
       }
        if (stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

}

在上述代码中使用了javaBean即建一个类封装一个方法进去
使用javaBean有两个注意事项
1:javaBean中,一定要有一个空参数的构造方法
2:javaBean中的属性,可以不是成员变量,但是属性名一定要与表中的字段名一致

## JdbcUtil ##
使用JdbcUtil会帮助我们更便捷的注册使用Jdbc
先建立一个配置文件Jdbcfg.properties来存储我们的驱动,地址与用户密码,更改只需在配置文件更改即可

//驱动类的路径
private static String driverClass=null;
//连接数据库使用的url
private static String url = null;
//用户名和密码
private static String user = null;
private static String password = null;
private static Connection conn =null;
static {
try {
ClassLoader cl = JdbcUtil.class.getClassLoader();
InputStream stream = cl.getResourceAsStream(“jdbcfg.properties”);
//得到流中的数据
//创建一个Properties对象
Properties prop = new Properties();
//通过Properties对象的load方法,加载流中的数据
prop.load(stream);
//根据key,获得value
driverClass = prop.getProperty(“driverClass”);
url = prop.getProperty(“url”);
user = prop.getProperty(“user”);
password = prop.getProperty(“password”);
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

//写一个静态方法,获取连接对象
public static Connection getConnection() throws SQLException {
    return DriverManager.getConnection(url,user,password);
}
//写一个静态方法,获得stmt对象

public static Statement getStatement() throws SQLException {
conn = getConnection();
return conn.createStatement();
}
public static void release(){
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void release( Statement stmt){
release(stmt,null);

}
//写一个静态方法,来释放资源
//如果想要释放Connection对象,需要调用Connection对象的close方法
//所以需要将Connection对象传入到release方法中
//然后再release方法中调用该对象的close方法
//释放资源
//statement对象与ResultSet对象同理
public static void release( Statement stmt, ResultSet rs){
    release();
    if (stmt!=null){
        try {
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if (rs!=null){
        try {
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
配置文件为:
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/c
user=root
password=111111

使用时只需 Connection conn = JdbcUtil.getConnection();即可

## 批处理 ##
 需要向数据库发送多条sql语句时, 为了提升执行效率, 可以考虑采用JDBC的批处理机制.

Connection conn = JdbcUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement
(“INSERT INTO stu VALUES (?,?,?);”);
pstmt.setInt(1,8);
pstmt.setString(2,”僚机”);
pstmt.setInt(3,20);
//通过这个方法可以实现批处理操作
//调用这个方法后,会将这个sql先存起来,等待执行
pstmt.addBatch();

    pstmt.setInt(1,9);
    pstmt.setString(2,"机长");
    pstmt.setInt(3,25);
    //又存了一条等待执行
    pstmt.addBatch();
    //执行批处理中存着的sql语句
    //批处理中各个sql语句之间执行成功或失败是无联系的
    //即使第一条语句会出现主键重复的错误
    //也不会影响第二条语句将数据插入到数据库中
    //因此推荐使用事物操作
    pstmt.executeBatch();
## 事物 ##
对数据的修改要么全部执行 要么全部不执行
事物的编写需要在try  catch 中进行

Connection conn =null;
try {
conn = JdbcUtil.getConnection();
//设置提交方式为手动提交
//开启事物
conn.setAutoCommit(false);
//创建一个预处理对象
PreparedStatement pstmt = conn.prepareStatement
(“UPDATE 表名 SET m=? WHERE name=?;”);

        pstmt.setInt(1,700);
        pstmt.setString(2,"张大炮");
        pstmt.executeUpdate();

        pstmt.setInt(1,1300);
        pstmt.setString(2,"张益达");
        pstmt.executeUpdate();
        //操作无异常,提交事务
        conn.commit();

    } catch (Exception e) {
        //回滚到事物开始之前状态
        try {
         //操作出现异常,撤销事务:
            conn.rollback();
            System.out.println("回滚了");
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
    }

“`

DbUtils

DbUtils是Apache提供的一个开源的
方便我们操作的jdbc的jar包
QuerRunner类,是该jar包的核心类
所有的操作数据库的方法都被封装在这个类中更新,
查询都是使用QueryRunner类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值