JDBC-基本使用
一、初识JDBC
本节目标
- 掌握JDBC的基本概念
- 理解JDBC的本质
- 掌握JAR包制作与JAR包使用
什么是JDBC
Java DateBase Conctivity(JAVA数据库连接),是有SUN制定的一套用于访问关系型数据库的接口。
面向接口编程:
接口调用方 接口的实现方
好处:解耦(解除耦合)
//喂养宠物
Cat{
eat(){eat.....}
}
//调用方
main(){
Cat cat = new Cat();
cat.eat()
}
//弊端:假如某一天你想养一只狗
Dog{
eat(){}
}
//对于调用方需要更改代码
main(){
Dog dog = new Dog()
dog.eat()
}
//耦合--代码的使用方(上层的调用者与底层实现强关联)--代码可拓展性非常差
//解决方案--面向接口编程
interface Pet{
eat();
play()
}
Dog implemts Pet{
eat(){eat的实现}
}
//上层的调用者
main(){
Pet pet = new Dog()
pet.eat();//调用接口其实真实调用实现类
pet.play();
}
总结:为什么需要JDBC
对于上层使用者(程序猿)我们不需要去关心各大数据库的具体实现。我们只面向根据JDBC接口进行编程即可,便于程序的可扩展和可维护性。
JDBC的本质
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6kEb4Eun-1628330229686)(https://raw.githubusercontent.com/li573925122/image/master/img/20210806141849.png)]
public interface DBHanld {
//向数据库中添加数据
void insert();
}
public class DBHanldImp implements DBHanld{
//当前是DB2的产商,insert针对DB2
@Override
public void insert() {
System.out.println("DB2添加数据成功");
}
}
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException {
//使用的MySQL
//DBHanld dbHanld = new DBHanldImp(); //通过反射方式实现字符串创建对象
InputStream resourceAsStream = MainTest.class.getClassLoader().getSystemResourceAsStream("db.properties");
Properties pro = new Properties();
pro.load(resourceAsStream);
String str = pro.getProperty("className");//通过读取配置文件将外部的配置读进来了
DBHanld dbHanld = (DBHanld) Class.forName(str).newInstance();//创建了全类名对象
dbHanld.insert();//真实调用是调用实现类
}
JAR的作用
作用:封装了一些代码
Eclipse制作JAR包:
右键 —>export–>jar—>选择你到处的Java文件–>导出即可
二、JDBC基本使用
本节目标
- 掌握JDBC连接数据库的核心步骤
- 掌握Driver接口的使用
- 掌握DriverManager使用
- 掌握Property类的使用
- 掌握JDBC连接工具类的封装
- 掌握Statement进行数据的
- 理解以面向对象方式编程
- 掌握PrepareStatement进行数据表增删改查
1、导入数据库的JDBC的实现(数据库驱动)
在项目上右键–>new–>folder
把JAR拷贝进去
注意:JAR版本和数据库的版本要一致 mysql-connector-java-5.1.37-bin
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OneqmKLC-1628330229693)(https://raw.githubusercontent.com/li573925122/image/master/img/20210806143751.png)]
2、加载驱动
Class.forName(driver);
3、获取数据库连接
Connection connection = DriverManager.getConnection(url,uname,pass);
编写配置文件:
在src下新建一个db.properties
src–>右键–>new–>others–>搜索file–>点file–>db.properties(注意:后缀必须是properties)
读取外部配置文件:
InputStream is =
//1、将指定文件转为文件输入流
TestConnection02.class.getClassLoader().getResourceAsStream("db.properties");
//2、创建一个Propties对象java.util.Properties
Properties properties = new Properties();
//3、将第一步中文件输入流加载近properties
properties.load(is);
//4.可以通过key形式读取
driver= properties.getProperty("driver"); //通过key获取值
url = properties.getProperty("url");//ctrl+alt+向下
uname = properties.getProperty("uname");
pass = properties.getProperty("pass");
获取数据库连接工具类的封装
注意:1.工具类是放在xxx.util包中
2.方法往往是静态方法(方便调用)
//1.读取配置文件
//将文件转为输入流
InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("db.properties");
//Properties文件需要用java.util.Properties的类进行解析
Properties pro = new Properties();
//通过Properties的load方法进行解析
try {
pro.load(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//通过配置文件中配的key去获取值
String driver = pro.getProperty("driver");
String url = pro.getProperty("url");
String uname = pro.getProperty("uname");
String pass = pro.getProperty("pass");
//2.通过DriverManager的getConnection()方法获取数据库的连接
//加载驱动
Connection connection = null;
try {
Class.forName(driver);
//获取数据库的连接
connection = DriverManager.getConnection(url,uname,pass);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return connection;
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test63_3
uname=root
pass=123456
4、操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KMq9krfy-1628330229695)(https://raw.githubusercontent.com/li573925122/image/master/img/20210806174512.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a31EEGL2-1628330229696)(https://raw.githubusercontent.com/li573925122/image/master/img/20210806174620.png)]
更新操作
-
获取数据库连接
-
获取Statement对象
-
准备一个SQL语句
-
调用对应的方法执行SQL
-
处理结果
-
关闭相关资源(从里往外关闭)
public static void main(String[] args){ //获取数据库连接 Connection conn = DBUtil.getConnection(); //1.获取对象 Statement statement = null; int count = 0; try { statement = conn.createStatement(); //2.调用方法执行SQL excuteUpdate(sql)--执行更新类的操作 insert update delete 返回一个int类型的值,这个值代表受影响的行数 // excuteQuery(sql)--执行查询类的操作 select String sql ="INSERT INTO student VALUES(DEFAULT,'郑爽','赚钱')"; count = statement.executeUpdate(sql); if(count>0) { System.out.println("执行成功"); }else { System.out.println("执行失败"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { //操作完毕后记得关闭数据库的连接 if(statement!=null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
ResultSet结果集
结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等.
结果集读取数据的方法主要是getXXX(),他的参数可以是整型表示第几列(是从1开始的),还可以是列名。返回的是对应的XXX类型的值。如果对应那列 是空值,XXX是对象的话返回XXX型的空值,如果XXX是数字类型,如Float等则返回0,boolean返回false.使用getString()可以返回所有的列的值,不过返回的都是字符串类型的。XXX可以代表的类型有: 基本的数据类型如整型(int),布尔型(Boolean),浮点型(Float,Double)等,比特型(byte),还包括一些特殊的类型,如:日 期类型(java.sql.Date),时间类型(java.sql.Time),时间戳类型(java.sql.Timestamp),大数型 (BigDecimal和BigInteger等)等。还可以使用getArray(intcolindex/String columnname),通过这个方法获得当前行中,colindex所在列的元素组成的对象的数组。使用 getAsciiStream(intcolindex/String colname)可以获得该列对应的当前行的ascii流。也就是说所有的getXXX方法都是对当前行进行操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oGAJcelN-1628330229696)(https://raw.githubusercontent.com/li573925122/image/master/img/20210806175426.png)]
while(resultSet.next())//将指针指向第一行数据 { System.out.println(resultSet.getInt("id")); System.out.println(resultSet.getString("name")); System.out.println(resultSet.getString("desc")); }
public static void main(String[] args) throws SQLException { //获取数据库连接 Connection conn = DBUtil.getConnection(); //获取Statement对象 Statement statement = conn.createStatement(); //准备一个SQL语句 -- 查询所有的学生 String sql = "SELECT * FROM student"; //调用excuteQuery方法进行查询 ResultSet resultSet = statement.executeQuery(sql); //resultSet 2组重要方法 1、next() -- 判断指针后面有没有下一行数据,如果有数据会将指针移向下一行 //2、getXXX(index/columName)来获取数据 while(resultSet.next())//将指针指向第一行数据 { System.out.println(resultSet.getInt("id")); System.out.println(resultSet.getString("name")); System.out.println(resultSet.getString("desc")); } //关闭资源 }
三、作业
1、在MySQL中创建一个student表,向其中添加一条或多条记录,然后在控制台输出目前表中记录的总数。
2、设计一后台管理系统,要求如下:
可以对用户进行管理:用户表如下(id(主键) username password name age sex String )
具体功能:
1、注册 2、登录 3、查询所有 4、修改(只能修改本身) 4、注销
String(“name”));
System.out.println(resultSet.getString(“desc”));
}
//关闭资源
}
### 三、作业
1、在MySQL中创建一个student表,向其中添加一条或多条记录,然后在控制台输出目前表中记录的总数。
2、设计一后台管理系统,要求如下:
可以对用户进行管理:用户表如下(id(主键) username password name age sex String )
具体功能:
1、注册 2、登录 3、查询所有 4、修改(只能修改本身) 4、注销
备注:登录之后才能实现的功能为查询所有 修改 删除 退出