zoukankan      html  css  js  c++  java
  • JDBC学习笔记——简单UerDao

      JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,利用JDBC提供的接口,可以方便得对数据库进行操作。

     

    1、JDBCUtils(产生Connection,关闭资源)

      1 package com.sina.jdbc;
      2 
      3 import java.io.File;
      4 import java.io.FileInputStream;
      5 import java.io.IOException;
      6 import java.io.FileNotFoundException;
      7 import java.util.Properties;
      8 import java.sql.Connection;
      9 import java.sql.DriverManager;
     10 import java.sql.Statement;
     11 import java.sql.ResultSet;
     12 import java.sql.SQLException;
     13 
     14 public class JDBCUtils {
     15     private JDBCUtils(){
     16 
     17     }
     18 
     19     public static JDBCUtils getInstance(){
     20         if(instance == null){
     21             synchronized(JDBCUtils.class){
     22                 if(instance == null){       //二次判空, 防止多线程下多次创建实例对象
     23                     instance = new JDBCUtils();
     24                 }
     25             }
     26         }
     27         return instance;
     28     }
     29 
     30     public Connection getConnection(){
     31         Connection connection = null;
     32         try {
     33             connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
     34         } catch(SQLException e){
     35             e.printStackTrace();
     36         }
     37         return connection;
     38     }
     39 
     40     public void close(Connection connection, Statement stmt, ResultSet rs){
     41         if(rs != null){
     42             try {
     43                 rs.close();
     44             } catch(SQLException e){
     45                 e.printStackTrace();
     46             }
     47         }
     48 
     49         if(stmt != null){
     50             try {
     51                 stmt.close();
     52             } catch(SQLException e){
     53                 e.printStackTrace();
     54             }
     55         }
     56 
     57         if(connection != null){
     58             try {
     59                 connection.close();
     60             } catch(SQLException e){
     61                 e.printStackTrace();
     62             }
     63         }
     64     }
     65 
     66     private static JDBCUtils instance = null;
     67     //加载配置文件, 读取以下信息以建立Connection
     68     private static String DRIVER_NAME;
     69     private static String URL;
     70     private static String USER_NAME;
     71     private static String PASSWORD;
     72     static {
     73         FileInputStream fis = null;
     74         try {
     75             Properties p = new Properties();
     76             File file = new File("./src/config.properties");
     77             fis = new FileInputStream(file);
     78             p.load(fis);
     79             DRIVER_NAME = p.getProperty("DRIVER_NAME");
     80             URL = p.getProperty("URL");
     81             USER_NAME = p.getProperty("USER_NAME");
     82             PASSWORD = p.getProperty("PASSWORD");
     83 
     84             Class.forName(DRIVER_NAME);  //加载驱动
     85         } catch(ClassNotFoundException e) {
     86             System.out.println(DRIVER_NAME + "驱动类找不着.");
     87         } catch(FileNotFoundException e) {
     88             System.out.println("文件 config.properties 找不到.");
     89         } catch(IOException e){
     90             e.printStackTrace();
     91         } finally{
     92             if(fis != null){
     93                 try {
     94                     fis.close();
     95                 } catch(IOException e){
     96                     e.printStackTrace();
     97                 }
     98             }
     99         }
    100     }
    101 }
    View Code

    2、UserDao

     1 package com.sina.jdbc.dao;
     2 
     3 import com.sina.jdbc.orm.User;
     4 
     5 //UserDao(User数据访问对象)利用接口实现,属面向接口编程,方便代码使用和管理,若实现类被修改,使用接口方法的程序不受影响,不需修改
     6 public interface UserDao {
     7     void addUser(User user);
     8     void deleteUser(User user);
     9     void updateUser(User user);
    10     User getUser(Integer id);
    11     User findUser(String name, String gender);
    12 }
    View Code

    3、UserDaoFactory

     1 package com.sina.jdbc.dao;
     2 
     3 import java.util.Properties;
     4 import java.io.InputStream;
     5 import java.io.IOException;
     6 
     7 //使用DAD工厂实现,若要改用其他方式实现的UserDao,则直接修改配置文件即可,程序用到UserDao的地方无需修改
     8 public class UserDaoFactory {
     9     private UserDaoFactory(){
    10 
    11     }
    12 
    13     public static UserDaoFactory getInstance(){
    14         if(instance == null){
    15             synchronized(UserDaoFactory.class){
    16                 if(instance == null){
    17                     instance = new UserDaoFactory();
    18                 }
    19             }
    20         }
    21         return instance;
    22     }
    23 
    24     public UserDao getUserDao(){
    25         UserDao retVal = null;
    26         Properties p = new Properties();
    27         InputStream is = null;
    28         try {
    29            is = UserDaoFactory.class.getClassLoader().getResourceAsStream("config.properties");
    30            p.load(is);
    31            String daoClassName = p.getProperty("daoClassName");
    32            retVal = (UserDao)Class.forName(daoClassName).getConstructor().newInstance();
    33         } catch(Exception e){
    34             throw new ExceptionInInitializerError();
    35         } finally{
    36             if(is != null){
    37                 try {
    38                     is.close();
    39                 } catch(IOException e){
    40                     e.printStackTrace();
    41                 }
    42             }
    43         }
    44         return retVal;
    45     }
    46 
    47     private static UserDaoFactory instance = null;
    48 }
    View Code

    4、UserDao(增删改查)

      1 package com.sina.jdbc.dao.imp;
      2 
      3 import com.sina.jdbc.dao.UserDao;
      4 import com.sina.jdbc.dao.DAOException;
      5 import com.sina.jdbc.orm.User;
      6 import com.sina.jdbc.JDBCUtils;
      7 import java.sql.*;
      8 
      9 public class UserDaoJdbcImp implements UserDao {
     10     @Override
     11     public void addUser(User user) {
     12         Connection connection = null;
     13         PreparedStatement pstmt = null;
     14         try {
     15             connection = JDBCUtils.getInstance().getConnection();
     16             pstmt = connection.prepareStatement("insert into t_user values(?, ?, ?, ?, ?)");
     17             setPstmt(pstmt, user);
     18             pstmt.execute();
     19         } catch(SQLException e){
     20             throw new DAOException(e.getMessage(), e);  //抛出异常给上级调用者, 让得知异常发生
     21         } finally{
     22             JDBCUtils.getInstance().close(connection, pstmt, null);
     23         }
     24     }
     25 
     26     @Override
     27     public void deleteUser(User user){
     28         Connection connection = null;
     29         PreparedStatement pstmt = null;
     30         try {
     31             connection = JDBCUtils.getInstance().getConnection();
     32             pstmt = connection.prepareStatement("delete from t_user where id = ? and name = ?");
     33             pstmt.setInt(1, user.getId());
     34             pstmt.setString(2, user.getName());
     35             pstmt.execute();
     36         } catch(SQLException e){
     37             throw new DAOException(e.getMessage(), e);
     38         } finally{
     39             JDBCUtils.getInstance().close(connection, pstmt, null);
     40         }
     41     }
     42 
     43     @Override
     44     public void updateUser(User user){
     45         Connection connection = null;
     46         PreparedStatement pstmt = null;
     47         try {
     48             connection = JDBCUtils.getInstance().getConnection();
     49             pstmt = connection.prepareStatement("update t_user set id = ?, name = ?, birthday = ?, gender = ?, property = ? where id = ?");
     50             setPstmt(pstmt, user);
     51             pstmt.setInt(6, user.getId());
     52             pstmt.execute();
     53         } catch(SQLException e){
     54             throw new DAOException(e.getMessage(), e);
     55         } finally{
     56             JDBCUtils.getInstance().close(connection, pstmt, null);
     57         }
     58     }
     59 
     60     @Override
     61     public User getUser(Integer id){
     62         Connection connection = null;
     63         PreparedStatement pstmt = null;
     64         ResultSet rs = null;
     65         User user = null;
     66         try {
     67             connection = JDBCUtils.getInstance().getConnection();
     68             pstmt = connection.prepareStatement("select id,name,birthday,gender,property from t_user where id = ?");
     69             pstmt.setInt(1, id);
     70             rs = pstmt.executeQuery();
     71             user = createUser(rs);
     72         } catch(SQLException e){
     73             throw new DAOException(e.getMessage(), e);
     74         } finally{
     75             JDBCUtils.getInstance().close(connection, pstmt, rs);
     76         }
     77         return user;
     78     }
     79 
     80     @Override
     81     public User findUser(String name, String gender){
     82         Connection connection = null;
     83         PreparedStatement pstmt = null;
     84         ResultSet rs = null;
     85         User user = null;
     86         try {
     87             connection = JDBCUtils.getInstance().getConnection();
     88             pstmt = connection.prepareStatement("select id,name,birthday,gender,property from t_user where name = ? and gender = ?");
     89             pstmt.setString(1, name);
     90             pstmt.setString(2, gender);
     91             rs =  pstmt.executeQuery();
     92             user = createUser(rs);
     93         } catch(SQLException e){
     94             throw new DAOException(e.getMessage(), e);
     95         } finally{
     96             JDBCUtils.getInstance().close(connection, pstmt, rs);
     97         }
     98         return user;
     99     }
    100 
    101     private User createUser(ResultSet rs) throws SQLException {
    102         User user = null;
    103         while(rs.next()){
    104             user = new User(rs.getInt("id"), rs.getString("name"), rs.getDate("birthday"), rs.getString("gender"), rs.getFloat("property"));
    105         }
    106         return user;
    107     }
    108 
    109     private static void setPstmt(PreparedStatement pstmt, User user) throws SQLException {
    110         pstmt.setInt(1, user.getId());
    111         pstmt.setString(2, user.getName());
    112         pstmt.setDate(3, new Date(user.getBirthday().getTime()));
    113         pstmt.setString(4, user.getGender());
    114         pstmt.setFloat(5, user.getProperty());
    115     }
    116 }
    View Code

    5、User

     1 package com.sina.jdbc.orm;
     2 
     3 import java.util.Date;
     4 
     5 //ORM(对象关系映射),数据二维表对应Java类,表字段对应类属性
     6 public class User {
     7     public User(){
     8 
     9     }
    10 
    11     public User(Integer id, String name, Date birthday, String gender, Float property){
    12         this.id = id;
    13         this.name = name;
    14         this.birthday = birthday;
    15         this.gender = gender;
    16         this.property = property;
    17     }
    18 
    19     public void setId(Integer id){
    20         this.id = id;
    21     }
    22 
    23     public Integer getId(){
    24         return id;
    25     }
    26 
    27     public void setName(String name){
    28         this.name = name;
    29     }
    30 
    31     public String getName(){
    32         return name;
    33     }
    34 
    35     public void setBirthday(Date birthday){
    36         this.birthday = birthday;
    37     }
    38 
    39     public Date getBirthday(){
    40         return birthday;
    41     }
    42 
    43     public void setGender(String gender) {
    44         this.gender = gender;
    45     }
    46 
    47     public String getGender(){
    48         return gender;
    49     }
    50 
    51     public void setProperty(Float property){
    52         this.property = property;
    53     }
    54 
    55     public Float getProperty(){
    56         return property;
    57     }
    58 
    59     private Integer id;       //采用包装类,如果id为主键并自增长,在插入数据库时可不指定id,
    60     // 若以PreparedStatement返回主键并给相应的User对象赋值,就可以区别哪些个对象已经写到数据库中,因为已经保存过的对象会得到返回的主键并赋值给id,
    61     // 而没被操作的对象id属性将为null,而不是数字0,易于区分
    62     private String name;
    63     private Date birthday;
    64     private String gender;
    65     private Float property;
    66 }
    View Code

    6、DAOException(给上级调用者抛出异常,让其得知异常产生地点)

     1 package com.sina.jdbc.dao;
     2 
     3 public class DAOException extends RuntimeException {
     4     public DAOException() {
     5     }
     6 
     7     public DAOException(String message) {
     8         super(message);
     9     }
    10 
    11     public DAOException(String message, Throwable cause) {
    12         super(message, cause);
    13     }
    14 
    15     public DAOException(Throwable cause) {
    16         super(cause);
    17     }
    18 }
    View Code

    有无DAOException时报告异常对比.

    DAOException:

    SQLException:

    7、Test

     1 package com.sina.jdbc;
     2 
     3 import com.sina.jdbc.dao.UserDao;
     4 import com.sina.jdbc.dao.UserDaoFactory;
     5 import com.sina.jdbc.orm.User;
     6 import java.util.Date;
     7 
     8 public class Test {
     9     public static void main(String[] args){
    10         UserDao userDao = UserDaoFactory.getInstance().getUserDao();
    11         User user = new User(10, "Tom", new Date(), "男", 230f);
    12         userDao.addUser(user);
    13 //        User user = userDao.findUser("Tom", "男");
    14 //        System.out.println(user.getId()+ " " + user.getBirthday());
    15 //        userDao.deleteUser(user);
    16     }
    17 }
    View Code

      以下代码为简单的UserDAO,本人为JAVA新人,发布出来方便以后复习。另外,其中可能存在一些不足的地方,如有建议,请告知。

  • 相关阅读:
    Atitit api标准化法 it法学之 目录 1. 永远的痛点:接口与协议的标准化 1 2. 标准化优点 1 3. 标准化组织 2 3.1. 应当处理标准化委员会 2 3.2. 标准化提案与表决
    Atitit 远程存储与协议 mtp ptp rndis midi nfs smb webdav ftp hdfs v3 Atitit mtp ptp rndis midi协议的不同区别
    Atitit redis使用场合总结 使用场景 目录 1.1. 3. Session 存储 1 1、 配置数据查询 1 2. 排行榜应用,取TOP N操作 1 1.2.     1、查找最
    Atitit Java制作VCARD vcf 以上就是关于vCard的基本介绍,维基百科(英文)https://en.wikipedia.org/wiki/VCard写的比较全,可惜我看不懂。
    Atitit 存储方法大总结 目录 1. 存储方式分类 2 1.1. 按照数据分类为 结构化 半结构化 非结构化 2 1.2. 按照内外部可分类 内部存储和外部存储持久化 2 1.3. 按照本地远
    Atiitt 自我学习法流程 1.预先阶段 1.1.目标搜索 资料搜索 1.2. 1.3.通过关联关键词 抽象 等领域 拓展拓宽体系树 1.4. 2.分析整理阶段 2.1.找出重点 压缩要学会
    Atitit 编程 序列化技术点 概念原理v2 1. 序列化: 1 2. 序列化的目的 1 2.1. 为了传输 或者存储 1 3. 应用场合 1 3.1. Form提交url 1 3.2. For
    Atitit session的概念总结
    atitit 面试问题表 侧重于项目和业务描述方面.v2 良好的标准:: 1.回答问题比较流畅,较少出现停顿现象,较少犹豫 2.回答有条理清晰 不杂乱 3.回答较为丰富内容 4.精神状态紧张
    Atitit hibernste5 注解方式开发总结 目录 1. 映入hb5的jar 建立项目 1 1.1. 建表tab1 ,这里使用了sqlite数据库 1 1.2. 建立映射实体类tab1
  • 原文地址:https://www.cnblogs.com/Hr666/p/10307570.html
Copyright © 2011-2022 走看看