2019_4_30-JDBC学习笔记

1应用程序、JDBC API、数据库驱动、及数据库之间的关系

1-1应用程序

1-2JDBC

	表准库的一部分。

1-3Driver

JDBC核心部分都是接口,是什么也做不了的。Driver就是驱动,是实现了JDBC的接口的类。Driver由数据库生产厂商开发,我们只需要去了解接口就行。你要使用哪个数据库,就去使用相应的接口就行。

2连接数据库

2-1注册驱动

package H02_JDBC;

public class D01_TestJDBC {

	public static void main(String[] args) {
		try {
			/*
			 * 通过Class.forName("com.mysql.jdbc.Driver");
				初始化驱动类com.mysql.jdbc.Driver
				就在 mysql-connector-java-5.0.8-bin.jar中
				如果忘记了第一个步骤的导包,就会抛出ClassNotFoundException
				
				Class.forName是把这个类加载到JVM中,加载的时候,就会执行其中的静态初始化块,完成驱动的初始化的相关工作。
			 */
			Class.forName("com.mysql.jdbc.Driver");
			System.out.println("data has been loaded!");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

2-2建立连接

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
  
public class D02_JDBC {
    public static void main(String[] args) {
  
        try {
			Class.forName("com.mysql.jdbc.Driver");
			 // 建立与数据库的Connection连接
            // 这里需要提供:
            // 数据库所处于的ip:127.0.0.1 (本机)
            // 数据库的端口号: 3306 (mysql专用端口号)
            // 数据库名称 how2java
            // 编码方式 UTF-8
            // 账号 root
            // 密码 admin
			
			Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/testbase1?characterEncoding=UTF-8",
                    "root", "");
			
			Statement s = c.createStatement();
			System.out.println("连接成功,获取对象:" + c);
			System.out.println("连接成功,获取Statement对象:" + s);
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
  
    }
}

2-3完整执行SQL语句

package H02_JDBC;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class D03_TJDBC1 {
	public static void main(String[] args) {
		Connection c = null;
		Statement s = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			
			 c = DriverManager
	                    .getConnection(
	                            "jdbc:mysql://127.0.0.1:3306/testbase1?characterEncoding=UTF-8",
	                            "root", "");
			 s = c.createStatement();
			 String sql = "insert into hero values("相关语句")";
	            s.execute(sql);
	            System.out.println("执行插入语句成功"); 
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            // 数据库的连接时有限资源,相关操作结束后,养成关闭数据库的好习惯
            // 先关闭Statement
            if (s != null)
                try {
                    s.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            // 后关闭Connection
            if (c != null)
                try {
                    c.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }
	}
}

值得一提的是,在完成操作后要记得释放资源。类似于I/O流,要对建立的管道进行释放。

增、删、改都查不多,但是由于查询语句有查询结构,所以用ResultSet接收

ResultSet rs = s.executeQuery(sql);
            while (rs.next()) {
                int id = rs.getInt("id");// 可以使用字段名
                String name = rs.getString(2);// 也可以使用字段的顺序
                float hp = rs.getFloat("hp");
                int damage = rs.getInt(4);
                System.out.printf("%d\t%s\t%f\t%d%n", id, name, hp, damage);
            }
             // 不一定要在这里关闭ReultSet,因为Statement关闭的时候,会自动关闭ResultSet
            // rs.close();

3Statement和PrepareStatement

3-1PrepareStatement

和 Statement一样,PreparedStatement也是用来执行sql语句的与创建Statement不同的是,需要根据sql语句创建PreparedStatement,除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接。

 String sql = "insert into hero values(null,?,?,?)";
        try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/testbase1?characterEncoding=UTF-8","root", "admin");
            // 根据sql语句创建PreparedStatement
            PreparedStatement ps = c.prepareStatement(sql);
        ) {
             
            // 设置参数
            ps.setString(1, "xxx");
            ps.setFloat(2, 500.0f);
            ps.setInt(3, 1000);
            // 执行
            ps.execute();
        }

3-2PrepareStetement的优点

1.PreparedStatement 使用参数设置,可读性好,不易犯错
2.PreparedStatement有预编译机制,性能比Statement更快
3.防止SQL注入式攻击

4事务

4-1

在事务中的多个操作,要么都成功,要么都失败
通过 c.setAutoCommit(false);关闭自动提交
使用 c.commit();进行手动提交
处于同一个事务当中,要么都成功,要么都失败
所以,虽然第一条SQL语句是可以执行的,但是第二条SQL语句有错误,其结果就是两条SQL语句都没有被提交。 除非两条SQL语句都是正确的。

MYSQL 表的类型必须是INNODB才支持事务,不过有个前提,就是当前的MYSQL服务器本身要支持INNODB。

5ORM

ORM=Object Relationship Database Mapping

对象和关系数据库的映射

简单说,一个对象,对应数据库里的一条记录

6DAO

DAO=DataAccess Object

数据访问对象

实际上就是运用了练习-ORM中的思路,把数据库相关的操作都封装在这个类里面,其他地方看不到JDBC的代码.

学习笔记大量内容来源引自:how2j.cn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值