JDBC介绍
1.JDBC程序编写步骤
2.获取数据库连接
1.1要素一:Driver 接口实现类(驱动类)
java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。 mySql的驱动: com.mysql.cj.jdbc.Driver
将驱动jar 包拷贝到 Java 工程的一个目录中,习惯上新建一个 lib 文件夹。(复制文件,贴贴到bin即可)
在驱动 jar 上 右键–>Build Path–>Add to Build Path
(新建路径后才可以使用此驱动包,否则不可用)
1.2加载与注册JDBC驱动
加载驱动:加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名
Class.forName(“com.mysql.cj.jdbc.Driver”);
注册驱动:DriverManager 类是驱动程序管理器类,负责管理驱动程序
使用 DriverManager.registerDriver ("com.mysql.cj.jdbc.Driver") 来注册驱动
2. 要素二:URL(统一资源定位器,即:网址)
JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。
jdbc:子协议:子名称 协议:JDBC URL中的协议: jdbc 子协议:子协议用于标识一个数据库驱动程序 子名称:一种标识数据库的方法。
MySQL的连接URL编写方式:
jdbc:mysql://主机名称:mysql服务端口号/数据库名称?参数=值&参数=值
jdbc:mysql://localhost:3306/atguigu
jdbc:mysql://127.0.0.1\:3306/librarymanage
3 要素三:用户名和密码
user, password 可以用 “属性名=属性值” 方式告诉数据库 可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接
user=root
password=xxxxxxxxx
连接方式一:基本原理(不常用)
//1.提供java.sql.Driver接口实现类的对象,为了实现驱动连接
? ? Driver driver = new com.mysql.cj.jdbc.Driver();
?
//2.提供url,实现对某个数据库的操作
? ? String url = "jdbc:mysql://localhost:3306/test";
? ?
//3.提供Properties的对象,指明用户名 root 和 密码
? ? Properties info = new Properties();
? ? info.setProperty("user", "root");
? ? info.setProperty("password", "XXXXXX");
? ?
//4.调用driver的connect(),获取连接,以此连接数据库
? ? Connection conn = driver.connect(url, info);
Properties类主要用于读取Java的配置文件,不同的编程语言有自己所支持的配置文件,配置文件中很多变量是经常改变的,为了方便用户的配置,能让用户够脱离程序本身去修改相关的变量设置。就像在Java中,其配置文件常为.properties文件,是以键值对的形式进行参数配置的。
连接方法二:(常用)
//1.数据库连接的4个基本要素:
? String url = "jdbc:mysql://localhost:3306/test";
? String user = "root";
? String password = "XXXXXX";
? String driverName = "com.mysql.jdbc.Driver";
?
//2.加载驱动 (①实例化Driver ②注册驱动)
Class.forName(driverName);
?
//3.注册驱动
DriverManager.registerDriver(driver);
? ? ? ?
//4.获取连接
Connection conn = DriverManager.getConnection(url, user, password);
?
3.实现数据库的增删改查
数据库的增删改查由sql语句来实现,而增删改可归为一类,其操作相同只是sql的不同,而查询为另一类。这些操作由PrepatedStatement来实现。
PreparedStatement 介绍
-
可以通过调用 Connection 对象的 preparedStatement(String sql) 方法获取 PreparedStatement 对象 -
PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句 -
PreparedStatement 对象所代表的 SQL 语句中的参数用问号( ? )来表示,调用 PreparedStatement 对象的 setXxx() 方法来设置这些参数 -
setXxx() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值
//添加
insert into 表名(变量)values(?)
?
//修改
update 表名 set 变量= ? where 用于定位的变量 = ?
?
//删除
delete form 表名 where 用于定位的变量 = ?;
?
//查询
select 变量 from 表名 where 用于定位的变量 = ?
举例说明:
//向数据库添加一个记录
public void testconnction() {
?
Connection conn=null;
PreparedStatement ps=null;
try {
//读取配置文件的三个基本信息
String url="jdbc:mysql://localhost:3306/manage";
String user="root";
String passsword="XXXXX";
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
conn=DriverManager.getConnection(url,user,passsword);
//预编译sql语句,返回ps实例
String sql
? ? ? = "insert into student(id,name,age)values(?,?,?)";
ps = conn.prepareStatement(sql);
//填充占位符
ps.setInt(1,4);(1:为位置)
ps.setString(2,"哪吒");
ps.setInt(3,19);
//执行操作
ps.execute();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//资源的关闭
try {
if(ps!=null)
? ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null)
? conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
运行后:
?
//修改数据库的一条记录
public void testUpate() {
Connection conn=null;
PreparedStatement ps=null;
try {
//1.数据库的连接
//读取配置文件的三个基本信息
String url="jdbc:mysql://localhost:3306/manage";
String user="root";
String passsword="XXXXX";
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
conn=DriverManager.getConnection(url,user,passsword);
//2.预编译sql语句,返回preparedstatement的实例
String sql = "update student set name= ? where id = ?";//修改名字,通过id来查到位置
ps = conn.prepareStatement(sql);
//3.填充占位符
ps.setObject(1, "小帅");
ps.setObject(2, 1);
//4.执行
ps.execute();
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//5.资源的关闭
try {
if(ps!=null)
? ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null)
? conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} }
运行后:
?
//删除一个记录
public void testconnction() {
Connection conn=null;
PreparedStatement ps=null;
try {
//读取配置文件的三个基本信息
String url="jdbc:mysql://localhost:3306/manage
String user="root";
String passsword="XXXXXX";
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
conn = DriverManager.getConnection(url,user,passsword);
// System.out.println(conn);
//预编译sql语句,返回ps实例
String sql = "DELETE FROM student WHERE id = ?";
ps = conn.prepareStatement(sql);
//填充占位符
ps.setInt(1,1);
//执行操作
ps.execute();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//资源的关闭
try {
if(ps!=null)
? ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null)
? conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//通用的增删改操作
public void update(String sql,Object ...args) {//sql中占位符的个数与可变型参args的个数一致
Connection conn=null;
PreparedStatement ps=null;
try {
//1.获取数据库连接
conn = jdbcUtil.getConnection();
//2.预编译sql语句,返回preparestament的实例
ps = conn.prepareStatement(sql);
//3.填充占位符
for(int i=0;i<args.length;i++)
{
ps.setObject(i+1, args[i]);//小心参数声明错误
}
//4.执行
ps.execute();
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//5.资源的关闭
jdbcUtil.closeResource(conn, ps);
}
}
调用通用的代码:
public void testCommonupdate() {
Scanner input = new Scanner(System.in);
System.out.println("请输入书名");
String book_name=input.next();
System.out.println("请输入价格");
double book_price=input.nextDouble();
System.out.println("请输入作者");
String book_writer=input.next();
System.out.println("请输入数量");
int book_num=input.nextInt();
String sql="insert into book(book_name,book_price,book_writer,book_num)values(?,?,?,?)";
update(sql,book_name,book_price,book_writer,book_num);
}
|