JDBC连接Mysql使用及事务

JDBC介绍

JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。

 

第一部分:JDBC连接Mysql使用

 

一、加载驱动

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

注意:Class.forName需要捕获ClassNotFoundException.

二、连接数据库

Connection conn = DriverManager.getConnection("jdbc:mysql://数据库IP:3306/数据库名?useUnicode=true&characterEncoding=UTF-8", "用户名", "密码");

注意:捕捉SQLException异常 

三、创建Statement或者PreparedStatement,执行SQL语句

    3.1 使用Statement接口

    Statement对象常用方法:
        executeQuery(String sql)       用于向数据发送查询语句。
        executeUpdate(String sql)     用于向数据库发送insert、update或delete语句
        execute(String sql)                用于向数据库发送任意sql语句
        addBatch(String sql)             把多条sql语句放到一个批处理中。
        executeBatch()                      向数据库发送一批sql语句执行。

Statement s = conn.createStatement();
// 准备sql语句
// 注意: 字符串要用单引号'
String sql = "select * from tb_name where name = 'name'";
//在statement中使用字符串拼接的方式,存在一定的问题
boolean execute = s.execute(sql);
System.out.println(execute);

    3.2 使用PreparedStatement接口

    PreparedStatement继承自Statement,都是接口

    查询使用:ps.executeQuery();

    增删改使用: ps.executeUpdate();

    执行批处理: ps.addBatch();  ps.executeBatch();

PreperedStatement ps = null;
String sql = "select * from tb_name where name=? and password=?";
// 在此次传入,进行预编译 
ps = conn.preparedStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
// 执行sql,不需要传入sql
ResultSet rs = ps.executeQuery();
// 输出结果集
while (rs.next()){
   System.out.println(rs.getString(1));
}

   两者区别PreparedStatement可以使用占位符;是预编译的,可以避免SQL注入的问题;批处理比Statement效率高    

四、显示结果

ResultSet用于代表Sql语句执行后返回结果集。

PreparedStatement ps = null;

ResultSet rs = ps.executeQuery();
            while (rs.next()){
                System.out.println(rs.getString(1));
            }

利用While(ResultSet.next()){…}循环将集合ResultSet中的结果遍历出来,ResultSet也可用于封装执行结果的,该对象提供的用于获取数据的get方法:     

获取任意类型的数据
getObject(int index)
getObject(string columnName)

获取指定类型的数据,例如:
getString(int index)
getString(String columnName)

五、释放资源

    Jdbc程序运行完后,要记得释放创建的那些与数据库进行交互的对象,比如:ResultSet, Statement和Connection对象。

// 关闭链接,释放资源
	if(rs!=null){
		try{
			rs.close();
		}catch (Exception e) {
			e.printStackTrace();
		}
		rs = null;
	}
	if(st!=null){
		try{
			st.close();
		}catch (Exception e) {
			e.printStackTrace();
		}			
	}	
	if(conn!=null){
		try{
			conn.close();
		}catch (Exception e) {
			e.printStackTrace();
		}
}

 

Demo-Statement

@Test
    public void statementTest(){
        Connection conn = null;
        Statement st = null;

        try {
            // 1. 加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2. 连接数据库
            conn = DriverManager.getConnection("jdbc:mysql://47.106.216.16:3306/db_tour_test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull", "root", "a0Iu2020Gz-W");
            // 3. 获取用于向数据库发送sql语句的statement
            st = conn.createStatement();
            // 4. 执行sql,获得结果
            String sql = "select * from tb_poi";
            boolean execute = st.execute(sql);
            System.out.println(execute);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        finally {
            try {
                if (st != null)
                st.close();
                if (conn != null);
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

 

Demo-PrepareStateMent

@Test
public void PrepareStatementTest(){
    Connection conn = null;
    PrepareStatement ps = null;
    ResultSet rs = null;
    try {
        Class.forName("com.mysql.jdbc.driver");
        conn = DriverManager.getConnection("jdbc:mysql://IP:3306/db_name", "username", "password");
        String sql = "select * from tb_name limit ?, ?"
        ps = conn.prepareStatement(sql);
        ps.setInt(1, 0);
        ps.setInt(2, 3);
        // 不需传入sql
        rs = ps.executeQuery();
        While (rs.hasnext()){
            System.out.print(rs.getCloumn(1))
        }        
    } catch (ClassNotFoundException e){
        e.printStackTrace();
    } catch (SQLExceptione){
        e.printStackTrace();
    } finally {
        try {
            if (rs != null)
            rs.close();
            if (ps != null)
            ps.close();
            if (conn != null){
                conn.close();
            }
        } catch(Exception e){
            e.printStackTrace();
        }
    }  
}

 

第二部分:JDBC事务操作

    数据库事务(Transaction)是由若干个SQL语句构成的一个操作序列。数据库系统保证在一个事务中的所有SQL要么全部执行成功,要么全部不执行。

Connection conn = openConnection();
try {
    // 关闭自动提交,开启手动事务:
    conn.setAutoCommit(false);
    // 执行多条SQL语句:
    insert(); update(); delete();
    // 提交事务:
    conn.commit();
} catch (SQLException e) {
    // 回滚事务:
    conn.rollback();
} finally {
    conn.setAutoCommit(true);
    conn.close();
}

(开启手动事务的关键是con.setAutoCommit(false),JDBC事务默认是开启的,并且是自动提交)

 

 

KC A CO

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值