java入门-------JDBC(尚马day22) week5(9)

JDBC

使用java程序将数据持久化保存到DBMS.

问题:
   Mysql oracle  sqlserver.....
   在数据库DBMS(数据库管理系统软件)  操作数据。
   
   用户注册提交的数据-----> 代码----> 持久化保存到数据库中。
  

java database connectivity java连接数据库技术。 客户端操作服务器。

cmd navicat java 客户端操作服务器

java入门-------JDBC(尚马day22) week5(9)_第1张图片

 

1. 获得连接

java程序面向对象 获得连接对象。

cmd:
  mysql -h127.0.0.1 -uroot -proot
  
navicat:
   新建新的连接------> connection----> my.ini   151
   127.0.0.1  localhost  动态ip  
   3306
   root
   root  

1.1 测试版

 public static void main(String[] args) {
        //目的: 获得特定的DBMS的连接对象----> mysql
        //客户端连接服务器
        //用户名
        String username = "root";
        //密码
        String password = "root";
        //服务器程序在哪一台主机上---->服务器的地址
        //String url = "jdbc:mysql://ip地址:端口号/数据库名称?参数名=参数数据";
        String url = "jdbc:mysql://192.168.13.217:3306/bb";
​
        //连接哪一个DBMS  就需要提供这个DBMS的驱动----> 不同的厂商已经实现ok
        //引入第三方的驱动 mysql的驱动----> mysql-driver.jar
        //1.1 下载驱动:  1. 官网   2. maven仓库管理所有的jar  https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.27
        //mysql的服务: mysql5.7  下载驱动 5+ 可以向下兼容
        //1.2 将下载ok的jar  引入项目中  lib   add  as library
​
        //String driver = "com.mysql.jdbc.Driver";
        String driver = "com.mysql.cj.jdbc.Driver";
​
​
        //学习JDBC 调用jdbc提供api
        //java.sql.*   javax.sql.*
        //DriverManager.getConnection()
​
​
        //对于mysql的驱动而言 自己提供了服务发现机制 自己注册驱动服务
        //只能在当前的java项目里面 可以这么使用
        //web项目依然存在问题? web项目后期运行在服务器 部署的是war包  默认自带一个META-INF
        Connection connection = null;
        try {
            //手动注册驱动/服务-----> 在jvm中创建驱动的实例(对象)
            Class.forName(driver);//jvm加载Driver.class
​
            connection = DriverManager.getConnection(url, username, password);//多态了 父接口指向任意一个实现类
            System.out.println("连接对象:" + connection);
            connection.close();
        } catch (SQLException | ClassNotFoundException throwables) {
            throwables.printStackTrace();
        } finally {
            try {
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
​
​
    }

1.2 优雅版

获得连接对象的功能 在工具类里面进行维护。

jdbc.username=root
jdbc.password=root
jdbc.url=jdbc:mysql://127.0.0.1:3306/bb
jdbc.driver=com.mysql.cj.jdbc.Driver

public class DBUtil {
    private DBUtil() {
    }
​
    //1.加载核心资源配置文件  Map---->Properties
    //2.在程序不停 只需要加载一次
​
    private static final Properties properties;
    static {
        properties = new Properties();
        try {
            properties.load(new FileInputStream("src/jdbc.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
​
    //获得连接
    public static Connection getMysqlConn() {
        Connection connection = null;
        try {
            //1.注册驱动
            Class.forName(properties.getProperty("jdbc.driver"));
            //2.获得连接对象
            connection = DriverManager.getConnection(
                    properties.getProperty("jdbc.url"),
                    properties.getProperty("jdbc.username"),
                    properties.getProperty("jdbc.password"));
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
​
    //释放资源
    public static void releaseResource(Connection connection) {
        try {
            if (connection != null) connection.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}
​

2. 常用类/接口

2.1 DriverManager

DriverManager: 用于管理一组JDBC驱动程序的基本服务。
   1. 注册驱动
   2. 获得连接  
   Connection getConnection(String url, String user, String password)    

2.2 Connection

Connection: 代表的任意DBMS连接对象。 需要关闭。
public interface Connection
extends Wrapper, AutoCloseable
  与特定数据库的连接(会话)。
  
java语言是面向对象的  将数据库连接都封装Connection
java也会将每一条sql语句封装成语句对象 Statement 对象
Statement----> PreparedStatement(预编译语句对象)
​
Statement createStatement() 
创建一个 Statement对象,用于将SQL语句发送到数据库。 
​
PreparedStatement prepareStatement(String sql)  "推荐使用"
创建一个 PreparedStatement对象,用于将参数化的SQL语句发送到数据库。  
​
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) 
创建一个默认的 PreparedStatement对象,该对象具有检索自动生成的密钥的能力。  

2.3 PreparedStatement

PreparedStatement: (预编译语句对象)  代表的一条sql语句
​
int executeUpdate() 
执行在该SQL语句PreparedStatement对象,它必须是一个SQL数据操纵语言(DML)语句,如INSERT , UPDATE或DELETE ; 或不返回任何内容的SQL语句,例如DDL语句。  
返回值: 受影响的行记录数  >=1 =0
​
ResultSet executeQuery() 
执行此 PreparedStatement对象中的SQL查询,并返回查询 PreparedStatement的 ResultSet对象。 

2.4 ResultSet

结果集。 只要是查询语句 select查询出来的结果 封装查询出来的结果。

查询的每一行的记录都在结果集对象中。

3. CRUD

以tb_userinfo

create read update delete

3.1 insert

insert into tb_userinfo (name, gender, phone, age, balance, password, birthday) VALUES('李玲玉','女','11111',30,778767,'2828','2002-01-01')

dao: data access object 都是操作数据库数据。

新建新的包 com.javasm.dao 创建很多接口 xxxxDao.java 封装很多行为

新建新的包 com.javasm.dao .impl 创建dao接口的实现类

public interface UserInfoDao {
    /**
     * 1. 新增用户
     * @return 受影响的行记录数
     */
    int addUserInfo();
}

1. 测试版

public class UserInfoDaoImpl implements UserInfoDao {
​
​
    //实现新增用户功能
    @Override
    public int addUserInfo() {
        //1.获得数据库连接(打开数据库)
        Connection connection = DBUtil.getMysqlConn();
        //2.准备sql
        String sql = "insert into tb_userinfo (name, gender, phone, age, balance, password, birthday) VALUES('张三丰','女','11111',30,778767,'2828','2002-01-01')";
        //3.执行sql 将数据持计划到mysql的数据库
        //sql语句都在数据库服务中运行的  java语言没有能力直接执行sql
        //解决: 使用java程序将sql语句发送到dbms的服务中  Connection  DDL  DML DQL DCL
        PreparedStatement statement = null;
        int result = 0;
        try {
            //3.1 将sql语句发送到数据库
            statement = connection.prepareStatement(sql);//sql语句被封装到statement
            //3.2 执行sql语句
            result = statement.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            DBUtil.releaseResource(connection, statement);
        }
        return result;
    }
}

​
    public static void main(String[] args) {
        //调用UserInfoDaoImpl.addUserInfo()
        UserInfoDao userInfoDao = new UserInfoDaoImpl();
        int result = userInfoDao.addUserInfo();
        System.out.println(result);//1
        if(result>=1){
            System.out.println("新增成功");
        }else{
            System.out.println("新增用户失败");
        }
    }

2. 正常版

//数据: 使用多个形参可以解决的 但是数量太多 不易维护
//映射:  操作数据库表===>操作类  一张表一个类
//表里面有很多字段====>类里面的属性
//表里字段数据类型====>类里面属性的数据类型
//表里面的一行记录====>类的一个对象
​
@Override
public int addUserInfo1(UserInfo userInfo) {
    //1.获得连接
    Connection connection = DBUtil.getMysqlConn();
    int result = 0;
    PreparedStatement ps = null;
    //2.sql 使用JDBC提供的占位符进行占位  ?  一个?就是代表要赋值一个数据
    //sql语句中有? 称他是一个“参数化的sql语句”
    String sql = "insert into tb_userinfo (name, gender, phone, age, balance,password, birthday) VALUES (?,?,?,?,?,?,?)";
    try {
        //3.将sql语句发送到数据库
        ps = connection.prepareStatement(sql);//参数化的sql语句在ps对象
        //判断sql语句里面是否有?
        //有  对占位符赋值  1
        ps.setString(1, userInfo.getName());
        ps.setString(2, userInfo.getGender());
        ps.setString(3, userInfo.getPhone());
        ps.setInt(4, userInfo.getAge());
        ps.setBigDecimal(5, userInfo.getBalance());
        ps.setString(6, userInfo.getPassword());
        //需要将util.Date转sql.Date  在jdbc里面 禁止使用sql包下的任意一个日期相关的类
        //ps.setDate(7, new Date(userInfo.getBirthday().getTime()));
        ps.setObject(7, userInfo.getBirthday());
        //4.执行sql
        result = ps.executeUpdate();
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    } finally {
        DBUtil.releaseResource(connection, ps);
    }
    return result;
}

public static void addTest() {
        Scanner input = new Scanner(System.in);
        UserInfo userInfo = new UserInfo();
​
        System.out.println("请录入用户名:");
        userInfo.setName(input.nextLine());
​
        System.out.println("请录入性别:");
        userInfo.setGender(input.nextLine());
​
        System.out.println("请录入密码:");
        userInfo.setPassword(input.nextLine());
        System.out.println("请录入age:");
        userInfo.setAge(Integer.parseInt(input.nextLine()));
​
        System.out.println("请录入balance:");
        userInfo.setBalance(new BigDecimal(input.nextLine()));
​
        userInfo.setBirthday(new Date());
​
        UserInfoDao userInfoDao = new UserInfoDaoImpl();
        System.out.println(userInfoDao.addUserInfo1(userInfo));
    }

3.2 delete

1. deleteOne

delete from tb_userinfo where id=?

@Override
public int deleteUserInfoById(int uid) {
    connection = DBUtil.getMysqlConn();
    sql = "DELETE FROM tb_userinfo WHERE id=?";
    try {
        ps = connection.prepareStatement(sql);
        ps.setObject(1, uid);
        result = ps.executeUpdate();
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    } finally {
        DBUtil.releaseResource(connection, ps);
    }
    return result;
}

2.deleteMany

/**
     * 3. 批量删除
     * @param idList ids
     * @return 受影响的行记录数
     */
int deleteUserInfoByIds(List idList);

@Override
public int deleteUserInfoByIds(List idList) {
    connection = DBUtil.getMysqlConn();
    //不知道要是有几个? 动态拼接sql
    StringBuilder builder = new StringBuilder("DELETE FROM tb_userinfo WHERE id IN (");
    //动态拼接?
    int size = idList.size();
    for (int i = 1; i <= size; i++) {
        builder.append("?");
        if (i == size) {
            builder.append(")");
            break;
        }
        builder.append(",");
    }
    try {
        ps = connection.prepareStatement(builder.toString());
        for (int i = 1; i <= size; i++) {
            ps.setObject(i, idList.get(i - 1));
        }
        result = ps.executeUpdate();
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    } finally {
        DBUtil.releaseResource(connection, ps);
    }
    return result;
}

3.3 update

由于我们不清楚用户到底修改几个列 指定所有的列全部都要修改

sql: UPDATE tb_userinfo SET name=?, gender=?, phone=?, age=?, balance=?, password=?, birthday=? WHERE id =?

private static void updateTest() {
    UserInfoDao userInfoDao = new UserInfoDaoImpl();
    Scanner input = new Scanner(System.in);
    System.out.println("请录入要修改的用户id:");
    int id = input.nextInt();
    UserInfo userInfo = userInfoDao.findUserInfoById(id);
    System.out.println("要修改的用户信息如下:" + userInfo);
    System.out.println("请录入要修改的列(1,2): 1.name 2.phone 3.age 4. password  ");
    String choiceStr = input.next();
    String[] array = choiceStr.split(",");
    for (String s : array) {
        int choice = Integer.parseInt(s);
        switch (choice) {
            case 1:
                System.out.println("请录入新的name:");
                String newName = input.next();
                userInfo.setName(newName);
                break;
            case 2:
                System.out.println("请录入新的phone:");
                String newPhone = input.next();
                userInfo.setPhone(newPhone);
                break;
            case 3:
                System.out.println("请录入新的age:");
                int newAge = input.nextInt();
                userInfo.setAge(newAge);
                break;
            case 4:
                System.out.println("请录入新的password:");
                String newPass = input.next();
                userInfo.setPassword(newPass);
                break;
        }
    }
    System.out.println(userInfoDao.updateUserInfoById(userInfo));
}

 @Override
    public int updateUserInfoById(UserInfo userInfo) {
​
        connection = DBUtil.getMysqlConn();
        sql = " UPDATE tb_userinfo SET  name=?, gender=?, phone=?, age=?, balance=?, password=?, birthday=? WHERE id  =?";
        try {
            ps = connection.prepareStatement(sql);
            ps.setString(1, userInfo.getName());
            ps.setString(2, userInfo.getGender());
            ps.setString(3, userInfo.getPhone());
            ps.setInt(4, userInfo.getAge());
            ps.setBigDecimal(5, userInfo.getBalance());
            ps.setString(6, userInfo.getPassword());
            ps.setObject(7, userInfo.getBirthday());
            ps.setObject(8, userInfo.getId());
            result = ps.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            DBUtil.releaseResource(connection, ps);
        }
        return result;
    }

3.4 select

1. selectOne

SELECT id,name, gender, phone, age, balance, password, birthday, create_time, update_time, last_login_time from tb_userinfo where id = ?

@Override
public UserInfo findUserInfoById(int uid) {
    connection = DBUtil.getMysqlConn();
    sql = "SELECT id,name, gender, phone, age, balance, password, birthday, create_time, update_time, last_login_time FROM tb_userinfo WHERE id = ?";
    UserInfo userInfo = null;
    try {
        ps = connection.prepareStatement(sql);
        ps.setInt(1, uid);
        //执行sql----> dql
        rs = ps.executeQuery();//查询的结果(数据)在rs对象中
​
        //判断: rs里面是否有记录? 有  获得数据转换成一个对象
        //类似于学过的Iterator  遍历集合数据
​
        //String getString(int columnIndex) 获得指定列的数据 2  查询结果有且只有1列的时候
        // String getString(String columnLabel) 根据列名获得列对应的数据
​
        if (rs.next()) {//判断光标之后是否有更多的行记录需要迭代
            userInfo = new UserInfo();
            userInfo.setId(uid);
            userInfo.setName(rs.getString("name"));
            userInfo.setPassword(rs.getString("password"));
            userInfo.setGender(rs.getString("gender"));
            userInfo.setBalance(rs.getBigDecimal("balance"));
            userInfo.setBirthday(rs.getDate("birthday"));
            userInfo.setAge(rs.getInt("age"));
            userInfo.setPhone(rs.getString("phone"));
​
        }
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    } finally {
        DBUtil.releaseResource(connection, ps, rs);
    }
    return userInfo;
}

2. findAll

SELECT * FROM TB_USERINFO;

@Override
public List findAllUserInfo() {
    connection = DBUtil.getMysqlConn();
    sql = "SELECT * FROM tb_userinfo";
    List userInfoList = new ArrayList<>(10);
    try {
        ps = connection.prepareStatement(sql);
        rs = ps.executeQuery();
        while (rs.next()) {
            userInfoList.add(userInfoInstance(rs));
        }
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    } finally {
        DBUtil.releaseResource(connection, ps, rs);
    }
    return userInfoList;
}

private UserInfo userInfoInstance(ResultSet rs) throws SQLException {
    UserInfo userInfo = new UserInfo();
    userInfo.setId(rs.getInt("id"));
    userInfo.setName(rs.getString("name"));
    userInfo.setPassword(rs.getString("password"));
    userInfo.setGender(rs.getString("gender"));
    userInfo.setBalance(rs.getBigDecimal("balance"));
    userInfo.setBirthday(rs.getDate("birthday"));
    userInfo.setAge(rs.getInt("age"));
    userInfo.setPhone(rs.getString("phone"));
    return userInfo;
}

3. 分页查询

4.条件查询

java入门-------JDBC(尚马day22) week5(9)_第2张图片

你可能感兴趣的:(尚马java课堂笔记,java,数据库,mysql)