jdbc和jdbc事务

1.jdbc

1.1 jdbc是什么

什么是JDBC : Java连接数据库!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2nti6xN7-1586566571654)(…/img/1568439601825.png)]

需要jar包的支持:

  • java.sql
  • javax.sql
  • mysql-conneter-java… 连接驱动(必须要导入)

1.2 jdbc连接数据库的两种方式

1.JDBC 固定步骤:

  1. 加载驱动
  2. 连接数据库,代表数据库
  3. 向数据库发送SQL的对象Statement : CRUD
  4. 编写SQL (根据业务,不同的SQL)
  5. 执行SQL
  6. 关闭连接
public class TestJdbc {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //配置信息
        //useUnicode=true&characterEncoding=utf-8 解决中文乱码
        String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String username = "root";
        String password = "123456";

        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.连接数据库,代表数据库
        Connection connection = DriverManager.getConnection(url, username, password);

        //3.向数据库发送SQL的对象Statement,PreparedStatement : CRUD
        Statement statement = connection.createStatement();

        //4.编写SQL
        String sql = "select * from users";

        //5.执行查询SQL,返回一个 ResultSet  : 结果集
        ResultSet rs = statement.executeQuery(sql);

        while (rs.next()){
            System.out.println("id="+rs.getObject("id"));
            System.out.println("name="+rs.getObject("name"));
            System.out.println("password="+rs.getObject("password"));
            System.out.println("email="+rs.getObject("email"));
            System.out.println("birthday="+rs.getObject("birthday"));
        }

        //6.关闭连接,释放资源(一定要做) 先开后关
        rs.close();
        statement.close();
        connection.close();
    }
}

2.预编译sql方式

public class TestJDBC2 {
    public static void main(String[] args) throws Exception {
        //配置信息
        //useUnicode=true&characterEncoding=utf-8 解决中文乱码
        String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String username = "root";
        String password = "123456";

        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.连接数据库,代表数据库
        Connection connection = DriverManager.getConnection(url, username, password);

        //3.编写SQL
        String sql = "insert into  users(id, name, password, email, birthday) values (?,?,?,?,?);";

        //4.预编译
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        preparedStatement.setInt(1,2);//给第一个占位符? 的值赋值为1;
        preparedStatement.setString(2,"狂神说Java");//给第二个占位符? 的值赋值为狂神说Java;
        preparedStatement.setString(3,"123456");//给第三个占位符? 的值赋值为123456;
        preparedStatement.setString(4,"24736743@qq.com");//给第四个占位符? 的值赋值为1;
        preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));//给第五个占位符? 的值赋值为new Date(new java.util.Date().getTime());

        //5.执行SQL
        int i = preparedStatement.executeUpdate();

        if (i>0){
            System.out.println("插入成功@");
        }

        //6.关闭连接,释放资源(一定要做) 先开后关
        preparedStatement.close();
        connection.close();
    }
}

1.3注意事项

  1. 进行操作前,需要先导入相关的依赖

    <!--mysql的驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    
  2. Statement statement = connection.createStatement(); 获取一个对象,用来对数据库进行操作

  3. new Date(new java.util.Date().getTime()) 两个Date是不同的,一个是sql中的date,另一个是java.util下的Date

  4. 两种连接数据库的方式其实差不多,任选一种即可

  5. idea连接数据可遇到的问题

    MySQL报错:Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.
    错误:Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.
        服务器返回无效时区。转到“高级”选项卡并手动设置“serverTimezone”属性。 
    
    mysql -u root -p
    
    mysql>show variables like '%time_zone%';
    
    mysql>set global time_zone='+8:00';
    
    问题:每次重启服务都要重新配置一遍。
    
    解决:mysql>set persist time_zone='+8:00';
    

2.jdbc事务

我的理解

事务的存在就是为了保证数据的安全,事务里面所执行的sql语句,要么都成功,要么都失败

例如在一次转账中,A向B转100元,理论上A的钱会减少100,B的钱会增加100.

这次转账要放到数据库中去执行的话,需要执行两条sql语句,第一条A的钱减少100,第二条B的钱增加100,但是现在遇到问题了,在执行完第一条sql语句后,程序遇到了错误,没有执行第二条sql语句,这样A的钱凭空减少100,B的钱却没有增加。

为了避免上述问题,就有了事务。通过事务把两条sql语句绑定在一起,要么都执行,要么都不执行。

事务常用的语句为一下三个

开启事务,SQL都执行成功,提交事务

开启事务,SQL执行遇到异常,事务回滚,即已经执行的sql语句全部失效,数据库回到开启事务时前的状态

//3.通知数据库开启事务,false 开启
connection.setAutoCommit(false);
//以上两条SQL都执行成功了,就提交事务!
 connection.commit();
 //如果出现异常,就通知数据库回滚事务
 connection.rollback();

使用junit单元测试

导入junit相关依赖

在方法上面加一个@Test就可以不用借用main方法,直接执行自己编写的方法了

遇到的问题

在JDBC连接Mysql数据库的过程中出现了如下的警告信息:

WARN: Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

是Mysql数据库的SSL连接问题,提示警告不建议使用没有带服务器身份验证的SSL连接,是在MYSQL5.5.45+, 5.6.26+ and 5.7.6+版本中才有的这个问题。解决办法在警告中已经说明了:

下面两个方法都可以,我采用了第一个

?后面跟要求

不同的要求用&连接

String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=false";
1.jdbc:mysql://localhost:3306/test?useSSL=false

2.Properties properties = new Properties();
  properties.setProperty("useSSL", "false");

事务

要么都成功,要么都失败!

ACID原则:保证数据的安全。

开启事务
事务提交  commit()
事务回滚  rollback()
关闭事务

转账:
A:1000
B:1000
    
A(900)   --100-->   B(1100) 

Junit单元测试

依赖

<!--单元测试-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

简单使用

@Test注解只有在方法上有效,只要加了这个注解的方法,就可以直接运行!

@Test
public void test(){
    System.out.println("Hello");
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CNxLGmyh-1586566571657)(…/img/1568442261610.png)]

失败的时候是红色:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9DNcXIgE-1586566571660)(…/img/1568442289597.png)]

搭建一个环境

CREATE TABLE account(
   id INT PRIMARY KEY AUTO_INCREMENT,
   `name` VARCHAR(40),
   money FLOAT
);

INSERT INTO account(`name`,money) VALUES('A',1000);
INSERT INTO account(`name`,money) VALUES('B',1000);
INSERT INTO account(`name`,money) VALUES('C',1000);
    @Test
    public void test() {
        //配置信息
        //useUnicode=true&characterEncoding=utf-8 解决中文乱码
        String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String username = "root";
        String password = "123456";

        Connection connection = null;

        //1.加载驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //2.连接数据库,代表数据库
             connection = DriverManager.getConnection(url, username, password);

            //3.通知数据库开启事务,false 开启
            connection.setAutoCommit(false);

            String sql = "update account set money = money-100 where name = 'A'";
            connection.prepareStatement(sql).executeUpdate();

            //制造错误
            //int i = 1/0;

            String sql2 = "update account set money = money+100 where name = 'B'";
            connection.prepareStatement(sql2).executeUpdate();

            connection.commit();//以上两条SQL都执行成功了,就提交事务!
            System.out.println("success");
        } catch (Exception e) {
            try {
                //如果出现异常,就通知数据库回滚事务
                connection.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

3.参考

听完B站狂神说java的课程,自己参考狂神笔记作的笔记,途中遇到的问题,参考了下面博客

https://www.bilibili.com/video/BV12J411M7Sj?p=28

https://www.cnblogs.com/-StarrySky-/p/11452131.html

 try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}



## 3.参考

听完B站狂神说java的课程,自己参考狂神笔记作的笔记,途中遇到的问题,参考了下面博客

https://www.bilibili.com/video/BV12J411M7Sj?p=28

https://www.cnblogs.com/-StarrySky-/p/11452131.html

https://blog.csdn.net/u010429286/article/details/77750177
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值