我的mysql是8.0.25版本的,网上有很多教程连接数据库不太适用8.0版本 ,这是8.0版本jdbc所需要的jar包,基本8.0的都适用
链接:https://pan.baidu.com/s/1yTXubhTN1u8edWop2zeG5A
提取码:nlko
jdbc对数据库进行增删改查
1)连接数据库的两种方式
连接数据库需要三个参数,yz为我的数据名 数据库名root 数据库密码root
8.0版本的mysql需要填写相对比较完整的参数,否则可能连接不上或者出现乱码
//连接数据库1:单机版
public void test1() throws Exception{
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//连接数据库
Connection con= DriverManager.getConnection("jdbc:mysql://localhost:3306/yz?characterEncoding=utf-8&serverTimezone=UTC","root","root");
System.out.println(con);
}
@Test
//连接数据库2:用druid连接 连接池
public void test2() throws SQLException{
DruidDataSource ds=new DruidDataSource();
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/yz?characterEncoding=utf-8&serverTimezone=UTC");
ds.setUsername("root");
ds.setPassword("root");
//2从连接池中获取连接对象
DruidPooledConnection con=null;
try{
con=ds.getConnection();
}catch (SQLException e){
e.printStackTrace();
}
System.out.println(con);
}
}
2)适用jdbc对数据库的增删改查
数据库我创建了简单的三个属性 did dname dlocaion
//jdbc后续操作,crud操作
@SuppressWarnings("all")
public class ADUE {
private Connection con;
private String sql;
private PreparedStatement psmt=null;
@Before
//执行每一个Test方法前,都会去执行@Before方法
public void init() throws Exception{
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//连接数据库
con= DriverManager.getConnection("jdbc:mysql://localhost:3306/yz?characterEncoding=utf-8&serverTimezone=UTC","root","root");
}
//使用jdbc测试新增
@Test
public void add() throws SQLException{
//1,定义sql
sql="insert into dept values (null,?,?)";
//2,获取执行sql的预编译对象
psmt=con.prepareStatement(sql);
//3,给sql模板中占位符赋值
psmt.setString(1,"工部");
psmt.setString(2,"广州");
//4,执行sql
int i=psmt.executeUpdate();
System.out.println(i+"行数据受影响");
}
//使用jdbc测试删除
@Test
public void delete() throws Exception{
//1,定义sql
sql="delete from dept where dlocation=?";
//2,获取执行sql的预编译对象
psmt=con.prepareStatement(sql);
//3,给sql模板中占位符赋值
psmt.setString(1,"北京");
//4,执行sql
int i=psmt.executeUpdate();
System.out.println(i+"行数据受影响");
}
@Test
//用jdbc测试修改
public void update() throws Exception{
//1,定义sql
sql="update dept set dlocation=? where dname=?";
//2,获取执行sql的预编译对象
psmt=con.prepareStatement(sql);
//3,给sql模板中占位符赋值
psmt.setString(1,"朝阳");
psmt.setString(2,"信息部");
//4,执行sql
int i=psmt.executeUpdate();
System.out.println(i+"行数据受影响");
}
@Test
//用jdbc测试查找
public void query() throws Exception{
//1,定义sql
sql="select * from dept where dlocation=?";
//创建执行sql的对象
psmt=con.prepareStatement(sql);
//对占位符赋值
psmt.setString(1,"大海");
//结果集
ResultSet rs=psmt.executeQuery();
//输出结果集
//单行输出将while换成if即可
while (rs.next()){
int id=rs.getInt(1);
//int id=rs.getInt("did");也可以
String name=rs.getString(2);
String location=rs.getString(3);
System.out.println("id:"+id+"===name"+name+"===location:"+location);
}
}
}
3)封装查询方法 返回集合
将对数据库查询方法封装类为一个工具类,调用的时候传入需要查询的表格和sql语句即可
1)封装的工具类
public class JdbcUtil {
// <T> List<T> ====>类名 list<类名>
public static <T> List<T> queryList(String sql,Class<T> c) {
try{
//获取连接驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//连接数据库
Connection con= DriverManager.getConnection("jdbc:mysql://localhost:3306/yz?characterEncoding=utf-8&serverTimezone=UTC","root","root");
//创建执行sql的对象
PreparedStatement psmt=con.prepareStatement(sql);
//结果集
ResultSet rs=psmt.executeQuery();
//遍历rs 创建一个list结果集
ArrayList<T> list =new ArrayList<>();
//元数据
ResultSetMetaData md=rs.getMetaData();
//总列数
int count =md.getColumnCount();
while(rs.next()){
//实例化对象 不确定是哪一个实体类
//类似于Strudent s=new Student();
T t= c.newInstance();
for(int i=1;i<=count;i++){
//每一个单元格数据 Object是所有类
Object value=rs.getObject(i);
String columnName=md.getColumnName(i);
Field f= c.getDeclaredField(columnName);
f.setAccessible(true);
f.set(t,value);
}
list.add(t);
}
System.out.println("封装后的数据集"+list);
return list;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
2)若查询数据库dept表数据 创建Dept类 写get() ,set() 和toString()方法
public class Dept {
private Integer did;
private String dname;
private String dlocation;
@Override
public String toString() {
return "Dept{" +
"did=" + did +
", dname='" + dname + '\'' +
", dlocation='" + dlocation + '\'' +
'}';
}
public Integer getDid() {
return did;
}
public void setDid(Integer did) {
this.did = did;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getDlocation() {
return dlocation;
}
public void setDlocation(String dlocation) {
this.dlocation = dlocation;
}
}
注意:数据库可能有空数据,在类声明里面声明属性int应该写为Integer ,double写为Double。int不能接受null int a=null;会报错 把int包装类为Integer 就可以使用了
3)传参调用
@Test
public void test(){
//查询did为5的信息
int did=5;
List<Dept> depts=JdbcUtil.queryList("select * from dept where dname="+dname,Dept.class);
//查询名字为信息部的信息
String dname="'信息部'";
List<Dept> depts2=JdbcUtil.queryList("select * from dept where did="+did,Dept.class);
}
4)适用连接池方法(只需两步)
前提:1、已经创建好数据库。 2、导入了druid jar包 注意版本。
1)若查询数据库dept表数据 创建Dept类 写get() ,set() 和toString()方法 (上图有)
yz为我数据库名 数据库用户名root 密码root
@org.junit.Test
public void test2() throws Exception {
//测试dbutils
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/yz?characterEncoding=utf-8&serverTimezone=UTC");
ds.setUsername("root");
ds.setPassword("root");
//1.创建qr对象,传入数据源参数
QueryRunner qr = new QueryRunner(ds);
//2.调用查询方法
List<Dept> depts = qr.query("select * from dept", new BeanListHandler<Dept>(Dept.class));
System.out.println(depts);
}
只需两步就可以完成数据库查询了
结果如下图:
下一篇:JavaWed28天之html和css