叩丁狼Java学习第二天-JDBC

发布于 2021-03-04  1009 次阅读


第一天是教的安装环境。由于我已经安装好了,就没有做笔记了,而且环境更新很快。现在教的以后不一定实用。以后需要可以直接搜索教程安装。

第一天:Idea,Mysql,Navicat

JDBC

操作步骤

1.准备步骤

  1. 拷贝 MySQL 的 JDBC 驱动,到 Java 项目中: mysql-connector-java-xxxx-bin.jar
    注意: 是 jar 包,不是 zip 包.
  2. 选择 jar,把 jar 引用到 classpath 路径.
    idea 项目中创建一个目录 lib
    File -> Project Structure -> Modules ->Dependencies-> + -> jar or directories -> 选择jar
    包路劲
    JDBC 操作数据库需要和数据库建立关系,所以第一步需 获取 JDBC 和数据库的连接对象 /
    Connection对象.

2.贾琏(加载驱动,链接数据库)

Class.forName("com.mysql.jdbc.Driver");
1. 把 com.mysql.jdbc.Driver 这一份字节码加载进 JVM.
2. 字节码被加载进JVM,就会执行其静态代码块.而其底层的静态代码块在完成注册驱动工作,将驱动注
册到DriverManger 中.
  1. 加载注册驱动.
    上述代码是如何完成注册驱动的?
  2. 获取连接对象.
    使用 DriverManager 的 getConnection 方法创建 Connection 对象
    Class.forName("com.mysql.jdbc.Driver");
  3. 把 com.mysql.jdbc.Driver 这一份字节码加载进 JVM.
  4. 字节码被加载进JVM,就会执行其静态代码块.而其底层的静态代码块在完成注册驱动工作,将驱动注
    册到DriverManger 中.
    注意: Java6 开始,JDBC4.0有一个新特性-无需加载注册驱动.
    规范要求: JDBC 4.0 的驱动必须包括 META-INF/services/java.sql.Driver 文件。此文件已经包含驱动名
    称。
    程序会自动从 META-INF/services/java.sql.Driver 去读取当前的驱动类的全限定名,所有目前写不写加载
    注册驱动都没问题,但是web项目必须写上加载注册驱动代码,否则无法连接数据库。
Connection conn = DriverManager.getConnection(url,username,password);
// url=jdbc:mysql://localhost:3306/jdbcdemo
// 如果连接的是本机的 MySQL,并且端口是默认的 3306 ,则可以简写:
url=jdbc:mysql:///jdbcdemo
// username:当前访问数据库的用户名
// password:当前访问数据库的密码

3.操作数据库

Connection接口: JDBC 的连接对象.

//常用方法:
Statement createStatement(): // 创建一个静态的语句对象.写死的SQL语句
PreparedStatement prepareStatement(String sql); //创建一个预编译语句对象.动态SQL,使
用带有占位符(?)的SQL语句的模板.
close(); //释放资源
//prepareStatement预编译
String sql = "select * from users where  username=? and userpwd=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, userpwd);
rs = pstmt.executeQuery()


Statement 接口: 执行静态 SQL 语句并返回它所生成结果.

// 常用方法:
int executeUpdate(String sql); //执行 DDL 或 DML语句.
// 若当前SQL是DDL语句,则返回0.
// 若当前SQL是DML语句,则返回受影响的行数.
ResultSet executeQuery(String sql); //执行DQL语句,返回结果集.
close(); //释放资源


插入实现

@Test
public void testInsert() throws Exception {
String sql = "INSERT INTO t_student(name,email,age)
VALUES('xiaoming2','xiao2@',18)";
// 贾琏欲执事
// 1 加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2 获取连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo",
"root", "admin");
// 3 获取语句对象
Statement st = conn.createStatement();
// 4 执行语句
st.executeUpdate(sql);
// 5 释放资源
st.close();
conn.close();
}

4.DAO

DAO(Data Access Object) 数据访问对象是一个面向对象的数据库接口. 顾名思义就是与数据库打交
道,夹在业务逻辑与数据库资源中间,将所有对数据源的访问操作抽象封装在一个公共 API 中。程序书
写就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。
DAO 中的主要操作: 增删改查(CRUD). 引入 DAO 之后,此时设计如下图
通过以上图,DAO 作为组件,那其主要的是方法的设计,方法设计需要注意什么呢?

  1. 在保存功能中,调用者需要传递多个参数进来,然后把这些数据保存到数据库中
  2. 在查询功能中,结果集的每行数据有多个列的值,然后把这些数据返回给调用者 意识: 在开发过程中,如果遇到需要传递的数据有多个的时候,通常需要使用 JavaBean 对其进行封装
//调用者将需要保存的数据封装到Student对象中,然后传递进来
void save(Student stu);
//在查询之后,将每行数据封装到Student对象中,再返回给调用者
Student selectOne(long id);

5.分包规范

分包规范:
域名倒写.项目模块名.组件;

vip.maosi.www

vip.maosi.www.util 工具

vip.maosi.www.domain 模型对象

vip.maosi.www.dao dao接口

vip.maosi.www.dao.impl dao实现

vip.maosi.www.test 测试

===========================================================


cn.wolfcode.pss.util; // 存放工具类
cn.wolfcode.pss.domain; //装pss模块的domain类,模型对象.(Student)
cn.wolfcode.pss.dao; //装pss模块的dao接口.

//调用者将需要保存的数据封装到Student对象中,然后传递进来
void save(Student stu);
//在查询之后,将每行数据封装到Student对象中,再返回给调用者
Student selectOne(long id);
cn.wolfcode.pss.dao.impl; //装pss模块的dao接口的实现类.
cn.wolfcode.pss.test; //暂时存储DAO的测试类,以后的测试类不应该放这里.

命名规范

命名规范:
以下的 Xxx 表示一个模型对象,比如 Employee,Department,Student
DAO 接口 : 表示对某个模型的 CRUD 操作做规范,以 I 开头,interface
标准:IXxxDAO
例: IEmployeeDAO/IStudentDAO
DAO 实现类: 表示对某个 DAO 接口的实现
标准:XxxDAOImpl
例:EmployeeDAOImpl/StudentDAOImpl
DAO 测试类: 测试 DAO 组件中的所有方法
标准:XxxDAOTest: XxxDAO 组件的测试类,
例:EmployeeDAOTest,StudentDAOTest

开发建议: 面向接口编程,声明 DAO 对象
传统的做法 : EmployeeDAOImpl dao = new EmployeeDAOImpl();
面向接口编程 : IEmployeeDAO dao = new EmployeeDAOImpl();
把实现类赋给接口类型,体现多态的特性:可以屏蔽不同子类之间实现的差异

Driud

@Test
public void testDruidDataSource() throws Exception {
// 创建一个连接池对象
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/jdbcdemo");
ds.setUsername("root");
ds.setPassword("admin");
ds.setInitialSize(5);//初始化创建连接的个数
Connection conn = ds.getConnection();
System.out.println(conn.getClass());
}
public class DruidDemo1 {
    public static void main(String[] args) {
        String sql = "select * from student where id = ?";
        Scanner sc = new Scanner(System.in);
        int id = sc.nextInt();
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            //创建Properties对象,用于加载配置文件
            Properties pro = new Properties();
            //加载配置文件
            pro.load(DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties"));
            //获取数据库连接池对象
            DataSource ds = DruidDataSourceFactory.createDataSource(pro);
            //获取数据库连接对象
            conn = ds.getConnection();
            //获取statement,使用prepareStatement,防止sql注入
            pstmt = conn.prepareStatement(sql);
            //注入sql参数(sql中?将被替换)
            pstmt.setInt(1,id);
            //执行sql,返回数据集
            ResultSet rs = pstmt.executeQuery();
            //数据处理
            while(rs.next()){
                int id1 = rs.getInt("id");
                String name = rs.getString("name");
                System.out.println(id+" "+ name);
            };
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //释放stmt
            if(pstmt != null){
                try {
                    pstmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            //conn归还连接池
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

欢迎欢迎~热烈欢迎~