JDBC的详细讲解和注意事项

打印 上一主题 下一主题

主题 903|帖子 903|积分 2709

 

  • JDBC简单一句话,就是用java代码去控制数据库,对数据库进行增删改查
  • JDBC 的相关API 总结
  • 最常用是阿里巴巴的德鲁伊数据库连接池技术
  • 数据库连接步骤

  • 必须先创建数据库哈
  • 引入德鲁伊的jar包
  • 加入配置文件(properties),要放在src目录下,根据一些提示信息去做相应的配置,如果是web程序,需要用properties
    1. JDBCUtilsByDruid工具类连接数据库
    复制代码
    1. package com.yc.ajax.Utils;
    2. import com.alibaba.druid.pool.DruidDataSourceFactory;
    3. import javax.sql.DataSource;
    4. import java.io.FileInputStream;
    5. import java.sql.Connection;
    6. import java.sql.ResultSet;
    7. import java.sql.SQLException;
    8. import java.sql.Statement;
    9. import java.util.Properties;
    10. /**
    11. * 连接数据库
    12. */
    13. public class JDBCUtilsByDruid {
    14.     private static DataSource ds;
    15.     //在静态代码块完成 ds初始化
    16.     static {
    17.         Properties properties = new Properties();
    18.         try {
    19.             //目前我们是javaweb方式启动,所以要获得src目录下的文件,需要用类加载器
    20.             properties.load(JDBCUtilsByDruid.class.getClassLoader().getResourceAsStream("druid.properties"));
    21.             ds = DruidDataSourceFactory.createDataSource(properties);
    22.         } catch (Exception e) {
    23.             e.printStackTrace();
    24.         }
    25.     }
    26.     //编写getConnection方法
    27.     public static Connection getConnection() throws SQLException {
    28.         return ds.getConnection();
    29.     }
    30.     //关闭连接, 老师再次强调: 在数据库连接池技术中,close 不是真的断掉连接
    31.     //而是把使用的Connection对象放回连接池
    32.     public static void close(ResultSet resultSet, Statement statement, Connection connection) {
    33.         try {
    34.             if (resultSet != null) {
    35.                 resultSet.close();
    36.             }
    37.             if (statement != null) {
    38.                 statement.close();
    39.             }
    40.             if (connection != null) {
    41.                 connection.close();
    42.             }
    43.         } catch (SQLException e) {
    44.             throw new RuntimeException(e);
    45.         }
    46.     }
    47. }
    复制代码
     
    1. BasicDao 根据连接的数据库 用德鲁伊去处理改查
    复制代码
    1. package com.yc.ajax.dao;
    2. import com.yc.ajax.Utils.JDBCUtilsByDruid;
    3. import org.apache.commons.dbutils.QueryRunner;
    4. import org.apache.commons.dbutils.handlers.BeanHandler;
    5. import org.apache.commons.dbutils.handlers.BeanListHandler;
    6. import org.apache.commons.dbutils.handlers.ScalarHandler;
    7. import java.sql.Connection;
    8. import java.sql.SQLException;
    9. import java.util.List;
    10. /**
    11. *  根据连接的数据库 用德鲁伊去处理改查
    12. * @param <T>
    13. */
    14. public class BasicDAO<T> {//泛型指定具体类型 需要创建一个javabean
    15.     private QueryRunner qr = new QueryRunner();
    16.     //开发通用的 dml 针对任意的表
    17.     //改
    18.     public int update(String sql, Object... parameters) {
    19.         Connection connection = null;
    20.         try {
    21.             connection = JDBCUtilsByDruid.getConnection();
    22.             int update = qr.update(connection, sql, parameters);
    23.             return update;
    24.         } catch (SQLException e) {
    25.             throw new RuntimeException();
    26.         } finally {
    27.             JDBCUtilsByDruid.close(null, null, connection);
    28.         }
    29.     }
    30.     //返回多个对象(即查询的结果是多行), 针对任意表
    31.     /**
    32.      * @param sql        sql 语句,可以有 ?
    33.      * @param clazz      传入一个类的 Class 对象 比如 Actor.class
    34.      * @param parameters 传入 ? 的具体的值,可以是多个
    35.      * @return 根据 Actor.class 返回对应的 ArrayList 集合
    36.      */
    37.     public List<T> queryMulti(String sql, Class<T> clazz, Object... parameters) {
    38.         Connection connection = null;
    39.         try {
    40.             connection = JDBCUtilsByDruid.getConnection();
    41.             List<T> query = qr.query(connection, sql, new BeanListHandler<T>(clazz), parameters);
    42.             return query;
    43.         } catch (SQLException e) {
    44.             throw new RuntimeException(e);
    45.         } finally {
    46.             JDBCUtilsByDruid.close(null, null, connection);
    47.         }
    48.     }
    49.     //查询单行结果 的通用方法
    50.     public T querySingle(String sql, Class<T> clazz, Object... parameters) {
    51.         Connection connection = null;
    52.         try {
    53.             connection = JDBCUtilsByDruid.getConnection();
    54.             return qr.query(connection,sql, new BeanHandler<T>(clazz), parameters);
    55.         } catch (SQLException e) {
    56.             throw new RuntimeException(e);
    57.         } finally {
    58.             JDBCUtilsByDruid.close(null, null, connection);
    59.         }
    60.     }
    61.     //查询单行单列的方法,即返回单值的方法
    62.     public Object queryScalar(String sql, Object... parameters) {
    63.         Connection connection = null;
    64.         try {
    65.             connection = JDBCUtilsByDruid.getConnection();
    66.             return qr.query(connection,sql,new ScalarHandler(),parameters);
    67.         } catch (SQLException e) {
    68.             throw new RuntimeException(e);
    69.         }finally {
    70.             JDBCUtilsByDruid.close(null,null,connection);
    71.         }
    72.     }
    73. }
    复制代码
     
  •  UserDao 然后再去继承 BasicDao 范型是一个javabean
    1. package com.yc.ajax.dao;
    2. import com.yc.ajax.entity.User;
    3. public class UserDao extends BasicDAO<User>{
    4. }
    复制代码
     
  • UserServict 去创建 UserDao的实例然后咱根据业务逻辑调用里面改或者查的方法
    1. import com.yc.ajax.dao.UserDao;
    2. import com.yc.ajax.entity.User;
    3. public class UserServlet {
    4.     private UserDao userDao = new UserDao();
    5.     public User getUserByName(String username){
    6.         User user = userDao.querySingle("select * from user1 where name=?", User.class, username);
    7.         return user;
    8.     }
    9. }
    复制代码
  • 最后拿到返回的结果进行判断或者修改数据库
    1. public class CheckUserServlet extends HttpServlet {
    2.     private UserServlet userServlet = new UserServlet();
    3.     @Override
    4.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    5.         System.out.println("CheckUserServlet .. 被调用");
    6.         response.setContentType("text/html;charset=utf-8");
    7.         //接收 ajax 提交的数据
    8.         String username = request.getParameter("username");
    9. //        if ("king".equals(username)){
    10. //            User king = new User(100, "king", "king@qq.com", "12345");
    11. //            String user_king = new Gson().toJson(king);
    12. //            response.getWriter().write(user_king);
    13. //        }else {
    14. //            response.getWriter().write("");
    15. //        }
    16.         User userByName = userServlet.getUserByName(username);
    17.         if (userByName != null){ //说明用户已经存在
    18.             //返回一个json
    19.             Gson gson = new Gson();
    20.             String s = gson.toJson(userByName);
    21.             response.getWriter().write(s);
    22.         }else {
    23.             response.getWriter().write("");
    24.         }
    25.     }
    26.     @Override
    27.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    28.         doGet(request,response);
    29.     }
    30. }
    复制代码
     


 
 

 
 

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表