JDBC [Java DataBase Connectivity] JAVA数据库连接

/**
* JDBC [Java DataBase Connectivity] JAVA数据库连接
* JDBC是SUN提供的一套API接口,使用JAVA连接数据库的一套标准接口。
* 各个数据库提供上都提供了一套JDBC的实现类用于连接自家的DBMS。而提供的这一套
* 实现类也称为连接该DBMS的驱动(Driver)
*
* 1:要加载需要操作的DBMS厂商提供的驱动(MAVEN直接加载依赖)
* 2:基于标准的JDBC操作流程操作该数据库
*/

//1 JDBC中Driver接口的实现类不同数据库厂商提供的的包名与类名不相同
Class.forName("com.mysql.cj.jdbc.Driver");//mysql固定就是这个

Connection connection = DriverManager.getConnection(
//                                      数据库名,相当于USE tedu
//                                              ||||
//                                              VVVV
                "jdbc:mysql://localhost:3306/user?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true",
                "root",
                "root");
Statement state = connection.createStatement();
String sql = "";
state.execute(sql);
/**
 * 数据库工具类,维护数据库驱动加载,连接的创建
 */
public class DBUtil {
    static {
        try {
            //DBUtil第一次被加载时,加载数据库驱动类
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException {
      return DriverManager.getConnection(
             "jdbc:mysql://localhost:3306/user?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true",
             "root",
             "root");
    }
}
/**
 * 执行预编译SQL语句
 * 优点:
 * 1:避免了繁琐的拼接SQL语文
 * 2:避免了被SQL注入的问题
 * 3:大批量执行相同语义的SQL(语义相同,值不同)时性能好
 *
 * 实际开发中我们的CRUD都建议使用预编译SQL来执行
 */
public class JDBCDemo5 {
    public static void main(String[] args) {
        try (
                Connection conn = DBUtil.getConnection();
        ){
            //向userinfo表中插入数据
            String sql = "INSERT INTO userinfo " +
                         "(username,password,nickname,age) " +
                         "VALUES " +
                         "(?,?,?,?)";//预编译SQL中可以先用"?"代替值
            /*
                此时Connection会现将该SQL发送给数据库,使其生成该SQL的
                执行计划,表明该SQL的语义.
                数据库理解了,要向userinfo表插入数据,并且对4个字段插入内容
                只不过该SQL不能真正执行,因为还没有数据.
             */
            PreparedStatement ps = conn.prepareStatement(sql);
            //使用PreparedStatement为四个预留的"?"设置应有的值
            ps.setString(1,"张三");//第1个?的值为字符串类型的"王克晶"
            ps.setString(2,"123456");
            ps.setString(3,"克晶");
            ps.setInt(4,18);//第4个?的值为int类型的数字18
            //此时执行时仅将4个?对应的值传递给数据库
            int count = ps.executeUpdate();
            if(count>0){
                System.out.println("插入成功");
            }

            
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
/**
 * SELECT语句
 */
public class JDBCDemo6 {
    public static void main(String[] args) {
        try (
           Connection conn = DBUtil.getConnection();
        ){
           String sql = "SELECT id,username,password,nickname,age " +
                        "FROM userinfo " +
                        "WHERE username=? AND password=?";
           PreparedStatement ps = conn.prepareStatement(sql);
           ps.setString(1,"张三");
//           ps.setString(2,"666666");
            ps.setString(2,"' OR '1'='1");
           ResultSet rs = ps.executeQuery();
           if(rs.next()){
               System.out.println("登录成功");
           }else{
               System.out.println("登录失败");
           }


        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值