JavaWeb28天之JDBC

我的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值