JDBC编程学习

JDBC

JDBC简介

DBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。
在这里插入图片描述

JDBC编程步骤

1)装载相应数据的JDBC驱动并初始化

1.下载mysql-connector.jar包

https://dev.mysql.com/downloads/connector/j/5.1.html

解压后就能在文件夹中找到mysql-connector-java-5.1.48-bin.jar包
在这里插入图片描述

2.IDEA导入jar包

File -> Project Structure -> Modules -> 添加mysql-connector-java-5.1.48-bin.jar包
在这里插入图片描述

3.初始化驱动

通过初始化驱动类com.mysql.jdbc.Driver,该类就在 mysql-connector-java-5.1.48-bin.jar中。

public class DbUtil {
    public static void main(String[] args) {
        try{
            Class.forName("com.mysql.jdbc.Driver");
        } catch(ClassNotFoundException e){
            e.printStackTrace();
        }
    }
}

(Class.forName需要捕获ClassNotFoundException)

Class.forName是把这个类加载到JVM中,加载的时候,就会执行其中的静态初始化块,完成驱动的初始化的相关工作。

2)建立JDBC和数据库之间的connection连接

创建连接需要数据库的url、user、password等信息。

我们在DbUtil类中创建以一个工具方法getConnection(),同时创建close()方法用于释放资源。

package com.jdbctest.util;

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

public class DbUtil {
    public static final String URL = "jdbc:mysql://localhost:3306/timeline?characterEncoding=UTF-8";
    public static final String USER = "root";
    public static final String PASSWORD ="123456";

    /**
     * 获取数据库连接
     * @return 一个数据库连接
     */
    public static Connection getConnection(){
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(URL,USER,PASSWORD);
        } catch (ClassNotFoundException e){
            e.printStackTrace();
        } catch (SQLException e){
            e.printStackTrace();
        }
        return conn;
    }
  
  	/**
     * 释放资源
     */
 	 	public static void close(ResultSet rs){
        if(rs != null)
            try {
                rs.close();
            } catch (SQLException e){
                e.printStackTrace();
            }
    }

    public static void close(PreparedStatement pstmt){
        if(pstmt != null)
        try {
            pstmt.close();
        } catch (SQLException e){
            e.printStackTrace();
        }
    }

    public static void close(Connection conn){
        if(conn != null)
        try {
            conn.close();
        } catch (SQLException e){
            e.printStackTrace();
        }
    }

url中需要根据自己选择的数据库更改参数:
在这里插入图片描述

3)创建preparedstatement执行SQL语句

增删改的代码基本类似,查询稍微复杂一点。

增删改
  1. 写好sql语句(“?”是占位符)
  2. 建立连接
  3. 创建preparedstatement并为set方法给占位符赋值
  4. 执行语句
  5. 释放资源(关闭接口和连接等)
查询
  1. 创建用于储存集合元素的list
  2. 建立连接、创建preparestatement对象执行sql
  3. 将sql执行结果赋值给resultset对象
  4. 依次取出结果并创建元素对象,并将元素对象加入列表
  5. 返回列表
  6. 释放资源
实例

1.我们根据数据库中user表,创建实体类User类
在这里插入图片描述

package com.jdbctest.utity;

public class User {
    private int id;
    private String username;
    private String password;

    public User(int id, String username, String password){
        this.id = id;
        this.username = username;
        this.password = password;
    }
    
    public void setId(int id){
        this.id = id;
    }
    public int getId(){
        return id;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getUsername() {
        return username;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getPassword() {
        return password;
    }
}

2.新建dao层,创建UserDao接口

package com.jdbctest.dao;

import com.jdbctest.utity.User;

import java.util.List;

public interface UserDao {

    /**
     *
     * @param user
     * @return int
     */
    public int insertUser(User user);

    /**
     *
     * @param id
     * @return int
     */
    public int deleteUser(int id);

    /**
     *
     * @param user
     * @return int
     */
    public int updateUser(User user);

    /**
     * 
     * @param index
     * @param pageSize
     * @return userlist
     */
    public List<User> listUserByPage(int index, int pageSize);

    /**
     *
     * @param username
     * @param pwd
     * @return user
     */
    public User findUserByNamePwd(String username, String pwd);

    /**
     *
     * @param id
     * @return user
     */
    public User findUserById(int id);
}

3.新建DaoImp层,创建UserDaoImp类,实现UserDao接口方法

package com.jdbctest.daoimp;

import com.jdbctest.dao.UserDao;
import com.jdbctest.util.JDBCUtil;
import com.jdbctest.utity.User;
import jdk.nashorn.internal.scripts.JD;

import javax.sql.rowset.JdbcRowSet;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserDaoImp implements UserDao {

    @Override
    public int insertUser(User user) {

        Connection conn = null;
        PreparedStatement pstmt = null;

        try {
            String sql = "insert into user values(?,?,?)";
            //建立连接
            conn = JDBCUtil.getConnnection();
            pstmt = conn.prepareStatement(sql);

            //利用set方法给占位符赋值
            pstmt.setInt(1,user.getId());
            pstmt.setString(2,user.getUsername());
            pstmt.setString(3,user.getPassword());

            //执行sql
            int num = pstmt.executeUpdate();
            return num;
        } catch (SQLException e){
            e.printStackTrace();
        } finally {
            JDBCUtil.close(pstmt);
            JDBCUtil.close(conn);
        }

        return 0;
    }

    @Override
    public int deleteUser(int id) {

        Connection conn = null;
        PreparedStatement pstmt = null;

        try {
            String sql = "delete from user where id=?";
            conn = JDBCUtil.getConnnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1,id);

            int num = pstmt.executeUpdate();
            return num;
        } catch (SQLException e){
            e.printStackTrace();
        } finally {
            JDBCUtil.close(pstmt);
            JDBCUtil.close(conn);
        }

        return 0;
    }

    @Override
    public int updateUser(User user) {

        Connection conn = null;
        PreparedStatement pstmt = null;

        try {
            String sql = "update user set username=?,password=? where id=?";
            conn = JDBCUtil.getConnnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,user.getUsername());
            pstmt.setString(2,user.getPassword());
            pstmt.setInt(3,user.getId());

            int num = pstmt.executeUpdate();
            return num;
        } catch (SQLException e){
            e.printStackTrace();
        } finally {
            JDBCUtil.close(pstmt);
            JDBCUtil.close(conn);
        }
        return 0;
    }


    @Override
    public User findUserById(int id) {

        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        User user = null;

        try {
            String sql = "select * from user where id=?";
            conn = JDBCUtil.getConnnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1,id);
            rs = pstmt.executeQuery();
            while (rs.next()){
                user = new User(rs.getInt("id"),rs.getString("username"),rs.getString("password"));

            }
            return user;

        } catch (SQLException e){
            e.printStackTrace();
        } finally {
            JDBCUtil.close(rs);
            JDBCUtil.close(pstmt);
            JDBCUtil.close(conn);
        }

        return null;
    }

    @Override
    public User findUserByNamePwd(String username, String pwd) {

        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        User user = null;
        try {
            String sql = "select * from user where username=? and password=?";
            conn = JDBCUtil.getConnnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,username);
            pstmt.setString(2,pwd);
            rs = pstmt.executeQuery();
            while(rs.next()){
                user = new User(rs.getInt(1),rs.getString(2,rs.getString(3));
            }
            return user;
        } catch (SQLException e){
            e.printStackTrace();
        } finally {
            JDBCUtil.close(rs);
            JDBCUtil.close(pstmt);
            JDBCUtil.close(conn);
        }

        return null;
    }

    @Override
    public List<User> listUserByPage(int index, int pageSize) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        User user = null;
        //用于储存user的list
        List<User> userList = new ArrayList<User>();

        try {
            String sql = "select * from user limit ?,?";
            //建立连接
            conn = JDBCUtil.getConnnection();
            pstmt = conn.prepareStatement(sql);
            //给占位符赋值
            pstmt.setInt(1,pageSize*(index-1));
            pstmt.setInt(2,pageSize);
            //执行sql
            rs = pstmt.executeQuery();
            //遍历rs,取出数据生成user对象,并依次加入userList
            while(rs.next()){
                user = new User(rs.getInt("id"),rs.getString("username"),rs.getString("password"));
                userList.add(user);
            }
            return userList;
        } catch (SQLException e){
            e.printStackTrace();
        } finally {
            JDBCUtil.close(rs);
            JDBCUtil.close(pstmt);
            JDBCUtil.close(conn);
        }
        return null;
    }
}

sql语句中的“?”是占位符,赋值时占位符的索引是从1开始的

ResultSet.getXX()方法的括号里面可以填属性值,还可以填该属性在数据表中的列号,从1开始编码

例如

findUserByNamePwd()中

user = new User(rs.getInt(1),rs.getString(2),rs.getString(3));

和findUserById()中

user = new User(rs.getInt("id"),rs.getString("username"),rs.getString("password"));

两个语句是等价的。

4.简单测试功能

package com.jdbctest;

import com.jdbctest.daoimp.UserDaoImp;
import com.jdbctest.utity.User;

public class Main {
    public static void main(String[] args) {
        User user = new User(1,"tom","123");
        UserDaoImp udl = new UserDaoImp();

        //测试插入
        int num = udl.insertUser(user);
        if(num != 0)
            System.out.println("数据插入成功");
        else
            System.out.println("数据插入失败");

        //测试查询
        System.out.println(udl.findUserById(1).toString());

        //测试更新
        User user1 = new User(1,"tom","123456");
        udl.updateUser(user1);
        System.out.println(udl.findUserById(1).toString());

        //测试删除
        num = udl.deleteUser(1);
        if(num != 0)
            System.out.println("数据删除成功");
        else
            System.out.println("数据删除失败");

    }
}

最后项目结构为:
在这里插入图片描述

参考

https://blog.csdn.net/jungle_rao/article/details/81274720
https://blog.csdn.net/doctor_ly/article/details/81240720

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值