数据库连接JDBC

JDBC:

  • JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的。
  • 其实就是java官方提供的一套规范(接口)。用于帮助开发人员快速实现不同关系型数据库的连接!
jdbc的快速入门程序:

需要先导入JDBC的jar包

public class JdbcDemo {public static void main(String[] args) throws ClassNotFoundException, SQLException {// 注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 获取连接Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "itzhuzhu");// 获取执行者对象Statement statement = connection.createStatement();// 执行sql语句,并接收返回结果String sql = "SELECT * FROM user";ResultSet resultSet = statement.executeQuery(sql);// 处理结果while (resultSet.next()) {System.out.println(resultSet.getInt("id") + "\t" + resultSet.getString("name"));}// 释放资源connection.close();statement.close();resultSet.close();}
}

运行异常:

提示“com.mysql.jdbc.Drive”已经被弃用了,有新的驱动类可以使用,换成这个就可以了“com.mysql.cj.jdbc.Driver”,即使不换也不会影响运行,只是会提示。

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

如果遇到这个异常,可能是你的版本问题,idea和mysql的版本要对应,驱动也是,下载个新的驱动https://dev.mysql.com/downloads/file/?id=500651

Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure   The last packet sent successfully to the server was 0 milliseconds ago. The

JDBC各个功能类详解:

DriverManager:

1. DriverManager:驱动管理对象

注册驱动(告诉程序该使用哪一个数据库驱动)

  • static void registerDriver(Driver driver):注册与给定的驱动程序 DriverManager
  • 写代码使用:Class.forName(“com.mysql.jdbc.Driver”),因为Driver类中已经写了注册驱动
  • 通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
static {try {java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException E) {throw new RuntimeException("Can't register driver!");}
}

注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。在jar包中,存在一个java.sql.Driver配置文件,文件中指定了com.mysql.jdbc.Driver

2. 获取数据库连接(获取到数据库的连接并返回连接对象)

  • static Connection getConnection(String url, String user, String password);
    • 返回值:Connection数据库连接对象
    • 参数
      • url:指定连接的路径。语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
      • user:用户名
      • password:密码
Connection:

Connection:数据库连接对象

  • 获取执行者对象
    • 获取普通执行者对象:Statement createStatement();也就是执行SQL语句的
    • 获取预编译执行者对象:PreparedStatement prepareStatement(String sql);
  • 管理事务
    • 开启事务:setAutoCommit(boolean autoCommit); 参数为false,则开启事务。
    • 提交事务:commit();
    • 回滚事务:rollback();
  • 释放资源
    • 立即将数据库连接对象释放:void close();
Statement:

Statement:执行sql语句的对象

  • 执行DML(增删改)语句:int executeUpdate(String sql);
    • 返回值int:返回影响的行数。
    • 参数sql:可以执行insert、update、delete语句。
  • 执行DQL(查询)语句:ResultSet executeQuery(String sql);
    • 返回值ResultSet:封装查询的结果。
    • 参数sql:可以执行select语句。
  • 释放资源
    • 立即将执行者对象释放:void close();
ResultSet:

ResultSet:结果集对象

  • 判断结果集中是否还有数据:boolean next();
    • 有数据返回true,并将索引向下移动一行
    • 没有数据返回false
  • 获取结果集中的数据:XXX getXxx(“列名”);
    • XXX代表数据类型(要获取某列数据,这一列的数据类型)
    • 例如:String getString(“name”); int getInt(“age”);
  • 释放资源
    • 立即将结果集对象释放:void close();

JDBC练习CRUD:

数据准备:

sql语句:

-- 创建student表
CREATE TABLE student(sid INT PRIMARY KEY AUTO_INCREMENT,	-- 学生idNAME VARCHAR(20),					-- 学生姓名age INT,							-- 学生年龄birthday DATE						-- 学生生日
);-- 添加数据
INSERT INTO student VALUES (NULL,'张三',23,'1999-09-23'),(NULL,'李四',24,'1998-08-10'),(NULL,'王五',25,'1996-06-06'),(NULL,'赵六',26,'1994-10-20');

实体类:

自定义类的功能是为了封装表中每列数据,成员变量和列要保持一致
注意:所有的基本数据类型需要使用包装类,以防null值无法赋值

public class Student {private Integer sid;private String name;private Integer age;private Date birthday;public Student() {}public Student(Integer sid, String name, Integer age, Date birthday) {this.sid = sid;this.name = name;this.age = age;this.birthday = birthday;}public Integer getSid() {return sid;}public void setSid(Integer sid) {this.sid = sid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "Student{" +"sid=" + sid +", name='" + name + '\'' +", age=" + age +", birthday=" + birthday +'}';}
}

StudentDao

public interface StudentDao {/*** 查询所有学生信息** @return 返回一个学生数组*/ArrayList<Student> findAll();/*** 根据id查询学生信息** @param id 根据id查询* @return 返回学生类对象,根据id查询*/Student findById(Integer id);/*** 添加学生** @param stu:学生类* @return 返回int类型的结果,也就是影响行数*/int insert(Student stu);/*** 修改学生** @param stu:学生类* @return 返回int类型的结果,也就是影响行数*/int update(Student stu);/*** 删除学生** @param id:根据指定id删除* @return 返回int类型的结果,也就是影响行数*/int delete(Integer id);
}

StudentDaoImpl

public class StudentDaoImpl implements StudentDao {@Overridepublic ArrayList<Student> findAll() {ArrayList<Student> list = new ArrayList<>();Connection conn = null;PreparedStatement pstm = null;ResultSet rs = null;try {// 获取连接conn = JDBCUtils.getConnection();pstm = conn.prepareStatement("SELECT * FROM student");// 执行sql语句,并接收返回结果rs = pstm.executeQuery();// 处理结果while (rs.next()) {int sid = rs.getInt("sid");String name = rs.getString("name");int age = rs.getInt("age");Date birthday = rs.getDate("birthday");// 封装student对象,把student对象保存到结合中Student stu = new Student(sid, name, age, birthday);list.add(stu);}} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.close(conn, pstm, rs);}return list;}@Overridepublic Student findById(Integer id) {Student stu = new Student();PreparedStatement pstm = null;Connection conn = null;ResultSet rs = null;try {conn = JDBCUtils.getConnection();// 获取执行者对象pstm = conn.prepareStatement("SELECT * FROM student WHERE sid='" + id + "'");// 执行sql语句,并接收返回结果rs = pstm.executeQuery();// 处理结果while (rs.next()) {int sid = rs.getInt("sid");String name = rs.getString("name");int age = rs.getInt("age");Date birthday = rs.getDate("birthday");// 封装student对象,把student对象保存到结合中stu.setSid(sid);stu.setName(name);stu.setAge(age);stu.setBirthday(birthday);}} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.close(conn, pstm, rs);}return stu;}@Overridepublic int insert(Student stu) {Connection conn = null;PreparedStatement pstm = null;int result = 0;try {conn = JDBCUtils.getConnection();// 获取执行者对象// 执行sql语句,并接收返回结果Date d = stu.getBirthday();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String birthday = sdf.format(d);pstm = conn.prepareStatement("INSERT INTO student VALUES ('" + stu.getSid() + "','" + stu.getName() + "','" + stu.getAge() + "','" + birthday + "')");// executeUpdate可以返回影响的行数,赋值给resultresult = pstm.executeUpdate();} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.close(conn, pstm);}return result;}@Overridepublic int update(Student stu) {Connection conn = null;PreparedStatement pstm = null;int result = 0;try {conn = JDBCUtils.getConnection();// 获取执行者对象// 执行sql语句,并接收返回结果Date d = stu.getBirthday();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String birthday = sdf.format(d);pstm = conn.prepareStatement("UPDATE student SET sid='" + stu.getSid() + "',name='" + stu.getName() + "',age='" + stu.getAge() + "',birthday='" + birthday + "' WHERE sid='" + stu.getSid() + "'");result = pstm.executeUpdate();} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.close(conn, pstm);}return result;}@Overridepublic int delete(Integer id) {Connection conn = null;PreparedStatement pstm = null;int result = 0;try {conn = JDBCUtils.getConnection();// 获取执行者对象pstm = conn.prepareStatement("DELETE FROM student WHERE sid='" + id + "'");// 执行sql语句,并接收返回结果 + id + "result = pstm.executeUpdate();} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.close(conn, pstm);}return result;}
}

StudentService

public interface StudentService {/*** 查询所有学生信息** @return 返回一个学生数组*/ArrayList<Student> findAll();/*** 根据id查询学生信息** @param id 根据id查询* @return 返回学生类对象,根据id查询*/Student findById(Integer id);/*** 添加学生** @param stu:学生类* @return 返回int类型的结果,也就是影响行数*/int insert(Student stu);/*** 修改学生** @param stu:学生类* @return 返回int类型的结果,也就是影响行数*/int update(Student stu);/*** 删除学生** @param id:根据指定id删除* @return 返回int类型的结果,也就是影响行数*/int delete(Integer id);
}

StudentServiceImpl

public class StudentServiceImpl implements StudentService {private StudentDao dao = new StudentDaoImpl();@Overridepublic ArrayList<Student> findAll() {return dao.findAll();}@Overridepublic Student findById(Integer id) {return dao.findById(id);}@Overridepublic int insert(Student stu) {return dao.insert(stu);}@Overridepublic int update(Student stu) {return dao.update(stu);}@Overridepublic int delete(Integer id) {return dao.delete(id);}
}

JDBCUtils:工具类

public class JDBCUtils {/*** 1.私有构造方法*/private JDBCUtils() {}// 2.声明配置信息变量private static String driverClass;private static String url;private static String username;private static String password;private static Connection con;// 3.静态代码块中实现加载配置文件和注册驱动static {try {// 通过类加载器返回配置文件的字节流// getClassLoader().getResourceAsStream:通过给定名称查找资源,查询资源的规则由给定的类的class load来实现,这个方法由类的loader来执行;如果这个类由bootstrap加载,那么方法由ClassLoader.getSystemResourceAsStream代理执行。InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("config.properties");// 创建Properties集合,加载流对象的信息Properties prop = new Properties();prop.load(is);// 获取信息为变量赋值driverClass = prop.getProperty("driverClass");url = prop.getProperty("url");username = prop.getProperty("username");password = prop.getProperty("password");// 注册驱动Class.forName(driverClass);} catch (Exception e) {e.printStackTrace();}}//4.获取数据库连接的方法public static Connection getConnection() {try {con = DriverManager.getConnection(url, username, password);} catch (SQLException e) {e.printStackTrace();}return con;}//5.释放资源的方法public static void close(Connection con, Statement stat, ResultSet rs) {if (con != null) {try {con.close();} catch (SQLException e) {e.printStackTrace();}}if (stat != null) {try {stat.close();} catch (SQLException e) {e.printStackTrace();}}if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}}public static void close(Connection con, Statement stat) {close(con, stat, null);}
}

config.properties:配置文件

driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/db2
username=root
password=itzhuzhu

Controller

public class StudentControllerTest {StudentService service = new StudentServiceImpl();@Testpublic void findAll() {ArrayList<Student> list = service.findAll();for (Student stu : list) {System.out.println(stu);}}@Testpublic void findById() {Student student = service.findById(3);System.out.println(student);}@Testpublic void insert() {Student stu = new Student(5,"周七",27,new Date());int result = service.insert(stu);if(result != 0) {System.out.println("新增成功");}else {System.out.println("新增失败");}}@Testpublic void update() {Student stu = service.findById(5);stu.setName("周七七");int result = service.update(stu);if(result != 0) {System.out.println("修改成功");}else {System.out.println("修改失败");}}@Testpublic void delete() {int result = service.delete(5);if(result != 0) {System.out.println("删除成功");}else {System.out.println("删除失败");}}
}

SQL注入攻击:

sql注入攻击案例:

在登录界面,输入一个错误的用户名/密码,但是使用任意字符 'or '1' = '1就可以登录成功

sql注入攻击的原理:

  • 按照正常道理来说,我们在密码处输入的所有内容,都应该认为是密码的组成
  • 但是现在Statement对象在执行sql语句时,将一部分内容当做查询条件来执行了,就会出现SQL注入攻击
PreparedStatement:
  • 预编译sql语句的执行者对象。在执行sql语句之前,将sql语句进行提前编译。明确sql语句的格式后,就不会改变了。剩余的内容都会认为是参数!参数使用?作为占位符
  • 为参数赋值的方法:setXxx(参数1,参数2);
    • 参数1:?的位置编号(编号从1开始)
    • 参数2:?的实际参数
  • 执行sql语句的方法
    • 执行insert、update、delete语句:int executeUpdate();
    • 执行select语句:ResultSet executeQuery();
@Override
public User findByLoginNameAndPassword(String loginName, String password) {//定义必要信息Connection conn = null;PreparedStatement pstm = null;ResultSet rs = null;User user = null;try {//1.获取连接conn = JDBCUtils.getConnection();//2.创建操作SQL对象String sql = "SELECT * FROM user WHERE loginname=? AND password=?";pstm = conn.prepareStatement(sql);//3.设置参数pstm.setString(1,loginName);pstm.setString(2,password);System.out.println(sql);//4.执行sql语句,获取结果集rs = pstm.executeQuery();//5.获取结果集if (rs.next()) {//6.封装user = new User();user.setUid(rs.getString("uid"));user.setUcode(rs.getString("ucode"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));user.setGender(rs.getString("gender"));user.setDutydate(rs.getDate("dutydate"));user.setBirthday(rs.getDate("birthday"));user.setLoginname(rs.getString("loginname"));}//7.返回return user;}catch (Exception e){throw new RuntimeException(e);}finally {JDBCUtils.close(conn,pstm,rs);}
}

JDBC事务:

管理事务的功能类:Connection

  • 开启事务:setAutoCommit(boolean autoCommit);参数为false,则开启事务。
  • 提交事务:commit();
  • 回滚事务:rollback();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【bzoj】 1412: [ZJOI2009]狼和羊的故事

Description “狼爱上羊啊爱的疯狂&#xff0c;谁让他们真爱了一场&#xff1b;狼爱上羊啊并不荒唐&#xff0c;他们说有爱就有方向&#xff0e;&#xff0e;&#xff0e;&#xff0e;&#xff0e;&#xff0e;” Orez听到这首歌&#xff0c;心想&#xff1a;狼和羊如此和谐&am…

计算机基础--网络

互联网协议 互联网协议的功能&#xff1a;定义计算机如何接入internet&#xff0c;以及接入internet的计算机通信的标准。 互联网协议按照功能不同分为osi七层或者tcp/ip五层或tcp/ip四层 每层常见物理设备 因为学习python编程只需要了解tcp/ip五层模型&#xff0c;所以我们只需…

万字详解数据库连接池

数据库连接池的概念 数据库连接是一种关键的、有限的、昂贵的资源&#xff0c;这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性&#xff0c;影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连…

Win Linux 双系统安装指南

双系统安装指南 环境说明 硬件&#xff1a;一块240G NVMe&#xff0c;一块240G SSD&#xff0c;一块2T的HDD。 系统&#xff1a;Linux Mint 18.2&#xff0c;Windows 10 Enterprise Version 1703 Update June 2017 分配&#xff1a;由于工作原因&#xff0c;我的主系统为Linux …

JDBC自定义框架

自定义JDBC框架&#xff1a; 定义必要的信息、获取数据库的连接、释放资源都是重复的代码&#xff0c;在操作JDBC时通常都是执行SQL语句就可以了&#xff0c;所以需要抽取出来一个模板类来封装一些方法&#xff08;Update、Query&#xff09;&#xff0c;专门执行增删改查的SQL…

SpingMVC 执行的流程

一&#xff1a;SpringMVC的开发步骤 ①&#xff1a;在web.xml文件中定义前端控制器DispatcherServlet来拦截用户请求。 由于Web应用是基于请求/响应结构的应用&#xff0c;所以不管哪个MVC Web框架&#xff0c;都需要在web.xml中配置该框架的核心Servlet或Filter&#xff0c;这…

UI 07 _ 导航视图控制器 与 属性传值

首先, 先创建三个VC. 完毕点击按钮, 进入下一页, 并可以返回. 要先把导航视图控制器创建出来. 在AppDelegate.m 文件里代码例如以下: #import "AppDelegate.h" #import "MainViewController.h" interface AppDelegate () endimplementation AppDelegate …

el表达式具体解释

引用内容百度百科(http://baike.baidu.com/view/1488964.htm) 參考百度百科&#xff0c;然后自己又加入了一部分自己感觉实用的东西&#xff0c;整理一下希望对大家有所帮助&#xff01;E L&#xff08;Expression Language&#xff09; 目的&#xff1a;为了使JSP写起来更加简…

MyBatis接口代理

MyBatis接口代理&#xff1a; 采用 Mybatis 的代理开发方式实现 DAO 层的开发&#xff0c;这种方式是目前的主流方式。Mapper 接口开发方法只需要程序员编写Mapper 接口&#xff08;相当于Dao 接口&#xff09;&#xff0c;由Mybatis 框架根据接口定义创建接口的动态代理对象&a…

编译OSG的FreeType插件时注意的问题

使用自己编译的freetype.lib&#xff0c;在编译osgdb_freetype插件项目时&#xff0c;报错LINK错误&#xff0c;找不到png的一堆函数 最简单的方式是不要使用PNG编译freetype。记住不要犯贱。 转载于:https://www.cnblogs.com/coolbear/p/7205906.html

openresty总结

协程 1.例如当获取的数据没有前后依赖关系时&#xff0c;可以使用ngx.thread.spawn和ngx.thread.wait同时从数据库不同的库、表或者不同来源&#xff08;mysql&#xff0c;redis等&#xff09;获取数据。https://github.com/openresty/lua-nginx-module#ngxthreadspawnhttps://…

PageHelper分页插件使用

分页插件PageHelper&#xff1a; MyBatis没有分页功能&#xff0c;需要手动编写LIMIT语句&#xff0c;可以使用第三方的插件来对功能进行扩展&#xff0c;分页助手PageHelper是将分页的复杂操作进行封装&#xff0c;使用简单的方式即可获得分页的相关数据 PageInfo&#xff1a;…

jquery插件开发通用框架

2017-07-24 更新&#xff1a;增加单例模式。 jquery插件开发框架代码&#xff1a; /** 插件编写说明&#xff1a;* 1、插件命名&#xff1a;jquery.[插件名].js&#xff0c;如jquery.plugin.js* 2、对象方法添加到jQuery.fn上&#xff0c;全局方法添加到jQuery对象本身上* 3、插…

Mybatis多表模型

多表模型&#xff1a; 多表模型分类 一对一&#xff1a;在任意一方建立外键&#xff0c;关联对方的主键。一对多&#xff1a;在多的一方建立外键&#xff0c;关联一的一方的主键。多对多&#xff1a;借助中间表&#xff0c;中间表至少两个字段&#xff0c;分别关联两张表的主键…

关于zkfc与zkserver频繁断开的问题

详见http://blog.csdn.net/dslztx/article/details/51596951转载于:https://www.cnblogs.com/roger888/p/7211625.html

高动态范围红外图像压缩

BF&DRC 近期看了一篇高动态范围红外图像压缩的文章&#xff0c;《New technique for the visualization of high dynamic range infrared images》.这篇文章主要利用双边滤波器把宽动态红外图像切割为基本图像和细节图像&#xff0c;再分别对基本图像和细节图像进行处理。对…

Mybatis构建sql语法

构建sql&#xff1a; 之前通过注解开发时&#xff0c;相关 SQL 语句都是自己直接拼写的。一些关键字写起来比较麻烦、而且容易出错。MyBatis 给我们提供了 org.apache.ibatis.jdbc.SQL 功能类&#xff0c;专门用于构建 SQL 语句 常用方法&#xff1a; 查询功能的实现&#xf…

Mqtt协议IOS端移植3

ServerMqFramework.h #import "MqttFramework.h"interface ServerMqFramework : MqttFramework/*** brief 得到模块控制器的句柄单例** param [in] N/A* param [out] N/A* return void* note*/(ServerMqFramework*)getMQttServerFrameInstance;- (int)callBusine…

java第三课,流程控制语句

流程控制语句条件语句&#xff1a;if语句&#xff1a;*if&#xff08;条件 boolean类型&#xff09;{ true }*if(boolean表达式){true}else&#xff5b;false结果&#xff5d;*多重 if else if(){}else if(){}else *嵌套ifSwitch语句&#xff1a;*switch(表达式){ case…

在cli命令行上显示当前数据库,以及查询表的行头信息

在$HIVE_HOME/conf/hive-site.xml文件下加入以下配置文件 <property><name>hive.cli.print.header</name><value>true</value><description>Whether to print the names of the columns in query output.</description> </proper…