JDBC

JDBC :java database connection java数据连接

* JDBC是java连接数据库的一个标准,该标准提供了大量接口,这些接口有厂商根据自身数据库的特点做实现,由用户进行接口方法的调用。用户根据接口调方法,可以屏蔽不同数据库的差异,无论连接什么数据库都是一套API
* 每一个实体Bean都具有属性,每一行数据都是一个对象,jdbc就是完成数据库数据和数据对象的转换,磁盘数据和内存数据的转换
* 数据库相关包存放在java.sql包中

Statement和PreparedStatement的区别

* Statement 是PreparedStatement的父接口。采用Statement执行SQL语句时,由于SQL语句的值一般由用户提供,所以只能采用拼接字符串的方式设置。这种随着值的不同,系统会做多次SQL语句的编译操作,所以效率低,而且容易引起SQL注入
* PerparedStatement提供了占位符机制,将需要设置的地方都用占位符表示,这样无论说什么值都是一个SQL语句,不会进行多次编译操作,效率高。而且无论值是什么,都会做字符串处理,不会引起SQL注入

什么是SQL注入
采用拼接字符串方式,拼接SQL语句时,如果值中有SQL语句的关键字或者特殊字符,可能导致预习了结果不正确,或者SQL语句语法错误,这就叫做SQL注入。解决SQL注入的方式就是采用,PreparedStatement 代替Statement

命名规范
dao: data access Object 数据对象通道。是一种架构模式,建立实体类和数据库表做映射。也就是哪个类对应哪个表,哪个属性对应哪个列。所以完成数据库操作的本质就是完成对象数据和关系数据的转换

代码演示
创建Bean类

package com.lovo.bean;
import java.sql.Date;
public class EmployeeBean {
      private int id;
      private String name;
      // 数据库操作,日期到sql包
      private Date birthday;
      private int money;
      private String dept;
      // id 为数据库自行配置数据,可以不做初始化
      public EmployeeBean(String name, Date birthday, int money, String dept) {
            super();
            this.name = name;
            this.birthday = birthday;
            this.money = money;
            this.dept = dept;
      }
      
      public EmployeeBean() {
            super();
            // TODO Auto-generated constructor stub
      }
      public int getId() {
            return id;
      }
      public void setId(int id) {
            this.id = id;
      }
      public String getName() {
            return name;
      }
      public void setName(String name) {
            this.name = name;
      }
      public Date getBirthday() {
            return birthday;
      }
      public void setBirthday(Date birthday) {
            this.birthday = birthday;
      }
      public int getMoney() {
            return money;
      }
      public void setMoney(int money) {
            this.money = money;
      }
      public String getDept() {
            return dept;
      }
      public void setDept(String dept) {
            this.dept = dept;
      }
      @Override
      public String toString() {
            return "EmployeeBean [id=" + id + ", name=" + name + ", birthday=" + birthday + ", money=" + money + ", dept="
                        + dept + "]";
      }
}

创建持久化接口

package com.lovo.dao;

import java.util.List;

import com.lovo.bean.EmployeeBean;

/**
 * 员工的持久化接口
 * @author zhihe
 *
 */
public interface IEmployeeDao {
      /**
       * 添加员工
       * @param emBean
       */
      public void add(EmployeeBean emBean);
      /**
       * 按指定的标号删除员工
       * @param id 员工id
       */
      public void del(int id);
      /**
       * 修改ID指定员工的工资
       *
       * @param id 员工ID
       * @param money 新工资
       */
      public void update(int money,int id);
      /**
       * 查询所有员工
       * @return 返回一个员工集合
       */
      public List<EmployeeBean> findAll();
      /**
       * 按姓名模糊查询员工
       * @param name 员工姓名
       * @return 员工集合
       */
      public List<EmployeeBean> findByName(String name);
      /**
       * 按员工id查询
       * @param id 员工id
       * @return 员工对象
       */
      public EmployeeBean findByID(int id);
}

创建接口实现类

package com.lovo.impl;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.lovo.bean.EmployeeBean;
import com.lovo.dao.IEmployeeDao;

/**
 * 员工的持久化接口实现类
 *
 * @author zhihe
 *
 */
public class EmployeeDaoImpl implements IEmployeeDao {

    @Override
    public void add(EmployeeBean emBean) {
        // 连接对象
        Connection con = null;
        // 预编译SQL语句的执行对象
        PreparedStatement ps = null;
        try {
            // 加载驱动
            Class.forName("org.gjt.mm.mysql.Driver");
            // 建立连接,第一个参数为URL,其中localhost表示连接主机的ip,3306表示连接数据库的端口
            // mydb为连接数据库的库名,root为mysql登录用户名,password为masql的登录密码
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8", "root",
                    "password");

            // 执行SQL语句 问号为占位符,有四个值需要插入,
            ps = con.prepareStatement("insert into t_employee(employeeName,birthday,money,depName) values(?,?,?,?)");
            // 设置占位符,指明哪个占位符需要填充
            // 取出对象的属性,设置占位符,属性是什么需要用什么格式
            ps.setString(1, emBean.getName());
            ps.setDate(2, emBean.getBirthday());
            ps.setInt(3, emBean.getMoney());
            ps.setString(4, emBean.getDept());

            // 更新数据库,将数据真正写入数据库
            ps.executeUpdate();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                // 关闭连接,后建立,先关闭
                ps.close();
                con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }

    @Override
    public void del(int id) {
        //连接对象
        Connection con=null;
        //SQL语句预操作对象
        PreparedStatement ps=null;

        try {
            Class.forName("org.gjt.mm.mysql.Driver");
            //建立连接
            con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?charactorEncoding=utf-8","root","password");
            ps=con.prepareStatement("delete from t_employee where id=?");
            ps.setInt(1, id);
            ps.executeUpdate();


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                ps.close();
                con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }


    }

    @Override
    public void update(int money, int id) {
        Connection con=null;
        PreparedStatement ps=null;
        try {
            Class.forName("org.gjt.mm.mysql.Driver");
            con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?charactorEncoding=utf-8","root","password");
            ps=con.prepareStatement("update t_employee set money=? where id=?");
            ps.setInt(2, id);
            ps.setInt(1, money);

            ps.executeUpdate();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                ps.close();
                con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }


    @Override
    public List<EmployeeBean> findAll() {
        // 查询操作,需读取数据库记录
        List<EmployeeBean> list=new ArrayList<EmployeeBean>();
        Connection con=null;
        PreparedStatement ps=null;
        //结果集对象
        ResultSet rs=null;
        try {
            Class.forName("org.gjt.mm.mysql.Driver");
            con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?charactorEncoding=utf-8","root","password");
            ps=con.prepareStatement("select*from t_employee");
            //得到结果对象
            rs=ps.executeQuery();
            //遍历结果集,将结果集指针不断指向下一条记录,如果没有记录rs.next()返回false ,从而退出循环
            while(rs.next()){
                //每次循环,产生一个新对象,用于封装当前结果集指针指向的记录的数据
                EmployeeBean emBean=new  EmployeeBean();
                //从结果集中取出指定列的值,封装对象的属性值
                emBean.setId(rs.getInt("id"));
                emBean.setName(rs.getString("employeeName"));
                emBean.setBirthday(rs.getDate("birthday"));
                emBean.setMoney(rs.getInt("money"));
                emBean.setDept(rs.getString("depName"));

                //将封装了数据的实体对象加入集合
                list.add(emBean);
            }


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                //最先关闭结果集
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        return list;
    }

    @Override
    public List<EmployeeBean> findByName(String name) {
        List<EmployeeBean>list=new ArrayList<EmployeeBean>();
        Connection con=null;
        PreparedStatement ps=null;
        ResultSet rs=null;

        try {
            Class.forName("org.gjt.mm.mysql.Driver");
            con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?charactorEncoding=utf-8","root","password");
            ps=con.prepareStatement("select*from t_employee where employeeName like ?");
            ps.setString(1, "%"+name+"%");
            rs=ps.executeQuery();
            while(rs.next()){
                EmployeeBean emBean=new EmployeeBean();
                emBean.setId(rs.getInt("id"));
                emBean.setName(rs.getString("employeeName"));
                emBean.setBirthday(rs.getDate("birthday"));
                emBean.setMoney(rs.getInt("money"));
                emBean.setDept(rs.getString("depname"));

                list.add(emBean);
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        return list;
    }

    @Override
    public EmployeeBean findByID(int id) {
        // 返回集合建集合,返回对象建对象
        EmployeeBean emBean=new EmployeeBean();

        Connection con=null;
        PreparedStatement ps=null;
        ResultSet rs=null;

        try {
            Class.forName("org.gjt.mm.mysql.Driver");
            con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?charactorEncoding=utf-8","root","password");
            ps=con.prepareStatement("select*from t_employee where id=?");
            ps.setInt(1, id);
            rs=ps.executeQuery();
            if(rs.next()){
                emBean.setId(rs.getInt("id"));
                emBean.setBirthday(rs.getDate("birthday"));
                emBean.setName(rs.getString("employeeName"));
                emBean.setMoney(rs.getInt("money"));
                emBean.setDept(rs.getString("depName"));

            }


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        return emBean;
    }


    //测试添加是否成功
    public static void main(String[] args) {
        IEmployeeDao dao = new EmployeeDaoImpl();
//        dao.add(new EmployeeBean("aaa", Date.valueOf("1988-02-02"), 2000, "市场部"));
//        dao.del(10);
//        dao.update(4000, 2);
//        List<EmployeeBean>list=dao.findAll();
        //系统有重写List集合的toString 方法,所以可以直接打印
//        List<EmployeeBean>list=dao.findByName("张");
//        System.out.println(list);
        EmployeeBean emBean=dao.findByID(3);
        System.out.println(emBean);
    }
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • 本文内容 1.什么是JDBC以及为什么要使用JDBC 2.JDBC核心API的讲解 3.使用JDBC核心API进行...
    Vincilovfang阅读 1,215评论 0 11
  • JDBC基础知识 一、采用JDBC访问数据库的基本步骤: A.载入JDBC驱动程序 B.定义连接URL ...
    java日记阅读 3,844评论 0 20
  • 事件对象 鼠标事件 event.clientX在可视区中,鼠标点击的x坐标 event.clientY在可视区中,...
    LaBaby_阅读 586评论 0 1
  • 时间:2018年 7月22日 星期天 天气:多云转晴 地点:海口市裕通花园 读经内容:《金刚经》《诗经》《文学启蒙...
    ZZ李梦涵阅读 631评论 1 2
  • 你喜欢月光下的寂静 阴森的 连乌鸦都惊恐 你毫不掩饰自己魔性的美丽 宝石化作雨露 翡翠融于绿叶 七彩迷香 时光也为...
    月空下阅读 382评论 5 11