1.jdbc的定义:java连接数据库进行数据的传递和交互
2.为什么需要jdbc:利用jdbc才可以使服务器端和数据库进行数据的传递和交互
jdbc场景1:客户端==>(本机+应用服务器) jdbc==》数据库
jdbc场景2:本机==》访问==》应用程序==》jdbc==》数据库《==jdbc
3.jdbc的工作原理
java连接数据库的步骤
java应用程序编写代码
调用jbdc api 接口或是类,加载jdbc的驱动(jar包)
调用数据库并测试
jdbc api接口的种类
Drivermanger 类
connerction接口
staterment接口
Resultset接口
4.jdbc api
jdbc api的核心作用:连接数据库,执行sql语句,保存结果
jdbc api执行顺序:
Drivermanager管理驱动
创建连接对象connection
使用statement对象执行sql语句
调用resultset对象保存查询结果(查询才会使用得到resultset)
5.jdbc编程模板
Class. forName("com.mysql.cj.jdbc.Driver")加载驱动。
Connection conn= DriverManager . getConnection("jdbc:mysql://localhost:3306/数据库名","root","123456")与数据库加载连接
PrepareStatement ps= con . prepareStatement("定义sql语句,增删改查")
{增:insert into 表名 (要增加的属性名) value(?[有几个属性就有就几个问号]) 删:delete from 表名 where id=?
改:update 表名set 属性名=?where 属性名=? }
ps.setObject(1,2)代表第一个?是2
ResultSet rs=ps.executeQuery(在查询中使用)
ps.executeUpdate(在增删改中使用,使用后释放资源即完成)
查询对象则需进行定义对象,先循环遍历,
while(rs.next()){
User user =new User();(这里定义对象放在循环内还是循环外都可以。但是集合不行)
user.setId(rs.getInt("id"));
......}
遍历结束后既可以进行输出了
sout(user.getId){这是查询对象}
下面是查询集合
查询集合首先创建一个集合ArrayList<类名>list=new ArrayList<>();
后面到rs=ps.executeQuery();都一样。
进入循环
while(rs.next()){
User user=new User();(集合的定义对象只能在循环中进行)
user.setId(rs.getInt("id"));循环遍历的输入到集合中
list.add(user);
}
释放资源
先开的后关,后开的先关
用增强for循环从集合中取出
for(User u:list){
sout(u.getId())
}
模糊查询与集合查询基本一致。模糊查询的sql语法是(select *from 表名 where 属性名 like concat (‘%‘,?,‘%’))意思是,查询数据库中属性名的属性值中出现?(?占位符)的一行
我们可以用测试用例代替main函数
输入@Test
然后直接写方法。方法中再写上面的增删改语句
jdbc的编程步骤
1.注册JDBC驱动
2.管理连接
3.创建PreparedStatement对象-预编译对象
为什么不用statement对象?因为statement对象有sql注入的问题,sql注入是sql中的安全性问题
4.发送SQL语句,并得到返回结果
5.处理返回结果
6.释放资源
多表查询
当有两个表时。我们可以通过给a表添加能关联b表的属性名。让两个表在逻辑上关联
先将两个表中有的属性名进行封装
在a的封装中添加b的属性名并封装。a的属性名不得与b的属性名重复
package Demo1.Text;
import Demo1.User.User1;
import org.junit.Test;
import java.sql.*;
import java.util.ArrayList;
public class Demo {
@Test测试用例
public void show(){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
ArrayList<User1> list = new ArrayList<>();
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_jdbc", "root", "123456");
ps = conn.prepareStatement("select users.*,book.id as bookid,book.name as bookname,book.author from users,book where users.bookid=book.id ");
(users.*代表所有的属性和属性值)更改属性名。id和name a和b都有。这里要用a的封装最后进行输出,就要把b的属性名改成bookid或者bookname a在封装时用被改过的属性名封装
rs = ps.executeQuery();
while(rs.next()){
User1 user1=new User1();
user1.setId(rs.getInt("id"));
user1.setName(rs.getString("name"));
user1.setPassword(rs.getString("password"));
user1.setAge(rs.getInt("age"));
user1.setSex(rs.getString("sex"));
user1.setNickname(rs.getString("nickname"));
user1.setUsertype(rs.getString("usertype"));
user1.setBookid(rs.getInt("bookid"));
user1.setBookname(rs.getString("bookname"));
user1.setAuthor(rs.getString("author"));
list.add(user1);
}(循环遍历输入到集合中)
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
for (User1 u:list){
System.out.println(u.getId());
System.out.println(u.getName());
System.out.println(u.getNickname());
System.out.println(u.getAge());
System.out.println(u.getPassword());
System.out.println(u.getSex());
System.out.println(u.getUsertype());
System.out.println(u.getBookid());
System.out.println(u.getBookname());
System.out.println(u.getAuthor());
}(循环遍历集合,一个个从集合中拿出来)
}
}
利用jdbc进行登录
package Demo4.demo2;
import Demo4.Demo1.User;
import java.sql.*;
public class Text {
public User show(User u){ 类型为封装类 参数列表是new 一个封装类
User uuuu =null;
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/db_29", "root", "123456");
ps = conn.prepareStatement("SELECT * from user where name=? and pwd=?");在数据库里查找名字和密码
ps.setObject(1,u.getName());这个名字和密码是参数列表里的new User赋予的
ps.setObject(2,u.getPwd());
rs = ps.executeQuery();
while(rs.next()){
uuuu=new User();
uuuu.setId(rs.getInt("id"));
uuuu.setName(rs.getString("name"));
uuuu.setNickname(rs.getString("nickname"));
uuuu.setPwd(rs.getString("pwd"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return uuuu; 返回User user =null
}
}
package Demo4.demo2;
import Demo4.Demo1.User;
import org.junit.Test;
public class Text1 {
@Test
public void show1() {
Text text = new Text();
User user = new User();
user.setName("zs");给封装类赋值
user.setPwd("1234");
user=text.show(user);赋的值在传给参数列表
if (user!=null){
System.out.println("登录成功");
}else{
System.out.println("登陆失败");
}
}
}
jdbc实现注册
public Integer show3(User u){ 目前增删改返回值类型均为Integer
Integer flag=0;
Connection conn=null;
PreparedStatement ps=null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/db_29", "root", "123456");
ps = conn.prepareStatement("insert into user(name,pwd,nickname)value (?,?,?)");
ps.setObject(1,u.getName());
ps.setObject(2,u.getPwd());
ps.setObject(3,u.getNickname());
flag =ps.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return flag;
}
}
public void show2() {
Text text = new Text();
User user = new User();
user.setName("zs");
user.setPwd("1234");
user.setNickname("8888");
Integer flag=text.show3(user);
if (flag>0){
System.out.println("注册成功");
}else{
System.out.println("注册失败");
}
}
}