一个鸡大巴粗JDBC代码案例

一个JDBC案例

一、定义

JDBC全称为:Java DataBase Connectivity(java数据库连接)。是SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库。比如建立数据库连接、执行SQL语句进行数据的存取操作。

二、为什么要使用JDBC?

  1. 数据库产品众多,保守估计有100多种数据,这样造成我们应用程序连接访问数据库缺乏统一的接口
  2. 应用程序与数据库之间兼容性太差

三、使用JDBC的好处

  1. 统一应用平台,实现异构数据库系统信息互访
  2. 减少应用程序与数据库编码工作
  3. 依靠 OOP技术,提高代码的复用性

!!JDBC制定了统一访问各类关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现!!


jdbc交互.png

案例

实体类-User

package com.yeungkim.entity;

import java.io.Serializable;
import java.sql.Timestamp;

//实现序列化接口
public class User implements Serializable {
    private String username ;
    private String password;
    private Integer uid;
    private String phone;
    private String email;
    private Timestamp createDate;
    private Integer isDel;

    public User(String username, String password, int uid, String phone, String email, Timestamp createDate, int isDel) {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Timestamp getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Timestamp createDate) {
        this.createDate = createDate;
    }

    public Integer getIsDel() {
        return isDel;
    }

    public void setIsDel(Integer isDel) {
        this.isDel = isDel;
    }

    public User() {
    }
}

实体类-Detail

package com.yeungkim.entity;

import java.io.Serializable;
//实现序列化接口
public class Detail implements Serializable {
    //使用包装类数据类型
    private Integer detailId;
    private String address;
    private Integer uid;
    private Integer isDel;
//getter setter 封装私有化
    public Integer getDetailId() {
        return detailId;
    }

    public void setDetailId(Integer detailId) {
        this.detailId = detailId;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public Integer getIsDel() {
        return isDel;
    }

    public void setIsDel(Integer isDel) {
        this.isDel = isDel;
    }
//无参构造方法
    public Detail() {
    }
}

Dao-UseDao

package Dao;

import com.yeungkim.entity.User;

import java.util.List;

public interface UserDao {
    //查询所有用户
    List<User> selectAll();

    //根据用户名查询用户信息
    User selectUserByName(String username);

    //添加用户信息

    int insert(User user);

    //根据id修改用户信息,因为id已经在user

    int updateById(User user);


}

Dao-DetailDao

package Dao;

import com.yeungkim.entity.Detail;
import com.yeungkim.entity.User;

public interface DetailsDao {
    int insertDetail(Detail detail, User user);

}

userDaoImpl

package Dao.impl;

import Dao.UserDao;
import com.yeungkim.entity.User;
import com.yeungkim.utils.Dbutils;
import jdk.nashorn.internal.ir.CallNode;

import javax.jws.soap.SOAPBinding;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class UserDaoImpl implements UserDao {
    @Override
    public List<User> selectAll() {
        List<User>users=null;
        // uid, username, password, phone, email, create_date, is_del
        String sql="select * from user where is_del=0";

        //配置文件,变量
        try {
            Connection connection = Dbutils.getConnection();
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            ResultSet resultSet = preparedStatement.executeQuery();
            if(resultSet!=null){
                users=new ArrayList<>();
                while (resultSet.next()){
                    //一次for循环就是一个对象
                    int uid =resultSet.getInt("uid");
                    String username=resultSet.getString("username");
                    String password=resultSet.getString("password");
                    String phone=resultSet.getString("phone");
                    String email=resultSet.getString("email");
                    Timestamp createDate=resultSet.getTimestamp("create_date");
                    int isDel=resultSet.getInt("is_del");
                    //将数据库封装到对象,添加到集合中
                    users.add(new User(username,password,uid,phone,email,createDate,isDel));

                }

            }
            Dbutils.close(connection,preparedStatement,resultSet);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //sql注入的问题
        //


        return users;
    }

    @Override
    public User selectUserByName(String username) {
        Connection connection=null;
        ResultSet resultSet=null;
        PreparedStatement preparedStatement=null;
        User user=null;

            //建立链接
        try {
            connection = Dbutils.getConnection();
            //sql语句
            String sql="select uid, username, password, phone, email,is_del from user where username=?";
            //创建ps对象
            preparedStatement = connection.prepareStatement(sql);
            //设置参数
            preparedStatement.setString(1,username);
            //执行查询返回result 对象
             resultSet = preparedStatement.executeQuery();
             //判断是否有数据
            if(resultSet!=null&&resultSet.next()){
                user=new User();
                user.setUid(resultSet.getInt(1));
                user.setUsername(resultSet.getString(2));
                user.setPassword(resultSet.getString(3));
                user.setPhone(resultSet.getString(4));
                user.setEmail(resultSet.getString(5));
                user.setIsDel(resultSet.getInt(6));



            }


        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            Dbutils.close(connection,preparedStatement,resultSet);
        }


        return user;
    }

    @Override
    public int insert(User user) {
        //定义变量
        int count=0;
        //建立链接
        Connection connection=null;
        PreparedStatement preparedStatement=null;

        try {
            connection = Dbutils.getConnection();
            String sql="insert into user(username, password, phone, email)values(?,?,?,?) ";
            //创建ps对象
            preparedStatement = connection.prepareStatement(sql);
            //设置占位符参数
            preparedStatement.setString(1,user.getUsername());
            preparedStatement.setString(2,user.getPassword());
            preparedStatement.setString(3,user.getPhone());
            preparedStatement.setString(4,user.getEmail());
            count=preparedStatement.executeUpdate();


        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            Dbutils.close(connection,preparedStatement);
        }
        return count;
    }

    @Override
    public int updateById(User user) {
        int count = 0;
        Connection connection = null;
        PreparedStatement ps = null;
        try {
            connection = Dbutils.getConnection();
            String sql = "UPDATE  user SET  password=? WHERE uid=?";
            ps = connection.prepareStatement(sql);
            ps.setString(1, user.getPassword());
            ps.setInt(2, user.getUid());
            count = ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            Dbutils.close(connection, ps);
        }
        return count;
    }
}

DetailDaoImpl

package Dao.impl;

import Dao.DetailsDao;
import com.yeungkim.entity.Detail;
import com.yeungkim.entity.User;
import com.yeungkim.utils.Dbutils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DetailDaoImpl implements DetailsDao {
    /**
     * 保存用户信息以及地址详细信息
     *
     * @param detail
     * @param user
     * @return
     */
    @Override
    public int insertDetail(Detail detail, User user) {
        int count = 0;
        Connection connection = null;
        PreparedStatement ps = null;
        PreparedStatement ps1 = null;
        PreparedStatement ps2 = null;
        ResultSet resultSet = null;

        String userSql = "INSERT  INTO  t_user(username, password, phone, email) VALUES (?,?,?,?)";
        String userSelectSql = "SELECT uid FROM t_user WHERE username=?";
        String sql = "INSERT  INTO  detail(address, uid) VALUES (?,?)";

        try {
            connection = Dbutils.getConnection();
            //开启事务
            connection.setAutoCommit(false);

            // 保存用户信息
            ps1 = connection.prepareStatement(userSql);
            ps1.setString(1, user.getUsername());
            ps1.setString(2, user.getPassword());
            ps1.setString(3, user.getPhone());
            ps1.setString(4, user.getEmail());

            ps1.executeUpdate();

            // 通过用户信息查询用户ID
            ps2 = connection.prepareStatement(userSelectSql);
            ps2.setString(1, user.getUsername());
            resultSet = ps2.executeQuery();
            if (resultSet != null && resultSet.next()) {
                int uid = resultSet.getInt("uid");
                // 保存地址信息
                Integer.parseInt("adbc1");

                ps = connection.prepareStatement(sql);
                ps.setString(1, detail.getAddress());
                ps.setInt(2, uid);
                count = ps.executeUpdate();

                connection.commit();
            }
        } catch (Exception e) {
            try {
                connection.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        } finally {
            try {
                ps1.close();
                ps2.close();
                Dbutils.close(connection, ps, resultSet);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


        return count;
    }
}

Dbutils-工具类

package com.yeungkim.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class Dbutils {
    //步骤:
    //1初始化数据库连接池
    //2获取数据库连接对象
    //3释放资源并关闭对象
    public static final String DB_CONFIG="db.properties";
    public static DataSource dataSource;

    static {
        Properties properties = new Properties();
        InputStream inputStream = Dbutils.class.getClassLoader().getResourceAsStream(DB_CONFIG);

        try {
            properties.load(inputStream);
            dataSource = DruidDataSourceFactory.createDataSource(properties);

        } catch (Exception e) {
            System.out.println("初始化数据库连接池失败,请检查配置信息");
        }
    }
    public static Connection getConnection() throws Exception{
        return dataSource.getConnection();

    }

    //释放资源关闭连接
    public static void close(Connection connection, Statement statement){
        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                System.out.println("关闭statement对象失败");
            }
        }
        if(connection !=null){
            try {
                connection.close();
            } catch (SQLException e) {
                System.out.println("关闭connetion失败");
            }
        }
    }


    //Dao data access Object
    //connection
    //statement
    //resultSet
    public static void close(Connection connection, Statement statement, ResultSet resultSet){
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        close(connection,statement);
    }

}

主函数

package com.yeungkim;

import Dao.DetailsDao;
import Dao.UserDao;
import Dao.impl.DetailDaoImpl;
import Dao.impl.UserDaoImpl;
import com.yeungkim.entity.Detail;
import com.yeungkim.entity.User;

import java.util.List;

public class Main {

public static void main(String[] args) {
    users();
    register();
    updatePassword();
    login();
    save();
    

}

public static void users(){
    //创建userdao对象
    UserDao userDao=new UserDaoImpl();
    //调用dao方法
    List<User> users=userDao.selectAll();
    System.out.println(users);


}

public static void register(){
    //创建userdao
    UserDao userDao=new UserDaoImpl();
    //创建user对象
    User user=new User();
    user.setUsername("admin");
    user.setPassword("admin");
    user.setPhone("123456");
    user.setEmail("1234@163.com");
    int count=userDao.insert(user);
    if(count>0){
        System.out.println("注册成功");
    }else{
        System.out.println("注册失败");
    }

}
//已知用户id
public static void updatePassword(){
    UserDao userDao=new UserDaoImpl();
    User user=new User();
    user.setUid(1);
    user.setPassword("123456");
    int count= userDao.updateById(user);
    System.out.println(count);

}

//登录功能
public static void login(String username,String pwd){
    UserDao userDao=new UserDaoImpl();
    User user=userDao.selectUserByName(username);
    //
    if(user!=null){
        System.out.println("存在用户");
        if(user.getIsDel()==0){
            if(user.getPassword().equals(pwd)){
                System.out.println("登录成功");
            }else {
                System.out.println("登录失败,账户或密码错误");
            }
        }else{
            System.out.println("账户被冻结,请与管理员联系");
        }

    }else{
        System.out.println("用户名不存在");
    }
}

//保存用户信息及详细内容

public static void save(){
    DetailsDao detailsDao=new DetailDaoImpl();
    User user=new User();
    user.setUsername("damin");
    user.setPassword("1244");
    user.setPhone("1234");
    user.setEmail("123@13.com");
    Detail detail=new Detail();
    detail.setAddress("四季酒店");
    detailsDao.insertDetail(detail,user);
}

}

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