JDBC——基础编程

一 、JDBC 概述
JDBC(Java DateBase Connectivity):Java数据库连接,它是一种用于数据库访问的应用程序API,由一组用Java语言编写的类和接口组成,有了JDBC就可以用统一的语法对多种数据库进行访问,而不用担心其数据库操作语言的差异。且不必访问MySQL数据库专门写一个程序,为访问Oracle又专门写一个程序等等。
二、JDBC优缺点
优点: 1. JDBC使得编程人员从复杂的驱动器调用命令和函数中解放出来,可以致力于应用程序中的关键地方。
2. 支持不同的数据库的关系型数据库,这使得程序的可移植性大大加强。
3. JDBC API是面向对象的,可以让用户把常用的方法封装为一个类,以备后用。
缺点:1. 使用JDBC访问数据库的速度会受到一定程度的影响。、
2.JDBC包含不同厂家的商品,这就给更改数据源带来了很大的麻烦。
三、JDBC核心接口和类
核心接口:1. Connection: 特定数据库的连接,在连接上下文中执行SQL语句并返回结果。
2. PreparedStatement:预编译SQL语句的对象。
3. Statement:执行SQL语句并返回它所生成的结果的对象。
4.ResultSet:表示数据库结果集的数据表。
5.CallableStatement:用于执行SQL存储过程的接口。
类:1. DriverManger:管理JDBC驱动程序,需先加载并注册才能使用。
2.SQLException:有关数据库操作的异常。
四、创建JDBC应用
1. 创建数据库配置文件 db.properties

#MySql数据库配置信息
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/goodssale?useUnicode=true&characterEncoding=utf-8
username=root
password=123456
#oracle数据库配置信息
#driver=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
#username=scott
#password=scott
  1. 创建dto层 Category.java
package com.edusoft.dto;

//对应数据库中的表
public class Category {
    String  id;
    String text;
    String parent;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public String getParent() {
        return parent;
    }

    public void setParent(String parent) {
        this.parent = parent;
    }

    @Override
    public String toString() {
        return "Category{" +
                "id='" + id + '\'' +
                ", text='" + text + '\'' +
                ", parent='" + parent + '\'' +
                '}';
    }
}

3.创建dao层 IBaseDao.java

package com.edusoft.dao;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

// 持久层通用接口,定义方法,再去impl里实现
public interface IBaseDao<T> {

    boolean add(T t) throws SQLException;//增

    boolean update(T t) throws SQLException;//改

    T findOneById(String id) throws SQLException;//精确查

    List<T> findByProp(Map map) throws SQLException;//模糊查

}
  1. Dao层的实现 CategoryDaoImpl.java
package com.edusoft.dao.impl;

import com.edusoft.dao.Db;
import com.edusoft.dao.IBaseDao;
import com.edusoft.dto.Category;

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

//持久层的实现
public class CategoryDaoImpl implements IBaseDao<Category> {
    //    获取连接
    Connection conn = Db.getConn();
    //    定义类变量
    PreparedStatement ps;//处理类
    ResultSet rs;//记录集类

    @Override
    public boolean add(Category category) throws SQLException {
//        定义要执行的sql语句
        String sql = "insert into category(text,parent) values(?,?)";
//        在连接基础上创建执行
        ps = conn.prepareStatement(sql);
//        植入参数
        ps.setString(1, category.getText());
        ps.setString(2, category.getParent());
//        执行更新操作,并返回受影响的记录数
        int i = ps.executeUpdate();
//        将返回的整型值处理成要返回的逻辑值
        return i > 0 ? true : false;
    }

    public boolean update(Category category) throws SQLException {
//        String sql="UPDATE category SET text='?',parent='?' where id='"+category.getId()+"'";
//        ps=conn.prepareStatement(sql);
//        ps.setString(1,category.getText());
//        ps.setString(2,category.getParent());
//        int i=ps.executeUpdate();
//        return i>0?true:false;
        String sql = "update category set text=?,parent=? where id=?";
        ps = conn.prepareStatement(sql);
        ps.setString(1, category.getText());
        ps.setString(2, category.getParent());
        ps.setString(3, category.getId());
        return ps.executeUpdate() > 0 ? true : false;
    }

    @Override
    public Category findOneById(String id) throws SQLException {
        String sql="SELECT * from category where id='"+id+"'";
        ps=conn.prepareStatement(sql);
        rs=ps.executeQuery();
        Category cate = new Category();
        while (rs.next()) {

            cate.setId(rs.getString("id"));
            cate.setText(rs.getString("text"));
            cate.setParent(rs.getString("parent"));

        }
        return cate;

    }

    @Override
    public List<Category> findByProp(Map map) throws SQLException {
//        定义一个数组列表
        List<Category> list = new ArrayList<Category>();
//        如果不能识别占位符?,则拼接字符串
        String sql = "select * from category where text like '%" + map.get("text") + "%'";
        ps = conn.prepareStatement(sql);
//        执行查询动作,返回记录集
        rs = ps.executeQuery();
//        处理返回的记录集
        while (rs.next()) {
//            生成对象
            Category category = new Category();
//            填充对象
            category.setId(rs.getString("id"));
            category.setText(rs.getString("text"));
            category.setParent(rs.getString("parent"));
//            向列表添加对象
            list.add(category);
        }
        return list;
    }

}

5.创建服务层 IBaseService.java

package com.edusoft.service;

import com.edusoft.dto.Category;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;


/**
 * 服务层通用接口类
 *
 * @param <T>
 */
public interface IBaseService<T> {
    /**
     * 添加
     *
     * @param t
     * @return
     * @throws SQLException
     */
    boolean add(T t) throws SQLException;
    boolean update(T t) throws SQLException;
    Category findOneById(String id) throws SQLException;

    /**
     * 根据参数模糊查询
     *
     * @param map
     * @return
     * @throws SQLException
     */
    List<T> findByProp(Map map) throws SQLException;

    //可以根据项目情况再自行添加
}

6.服务层的实现 CategoryServiceImpl.java

package com.edusoft.service.impl;

import com.edusoft.dao.impl.CategoryDaoImpl;
import com.edusoft.dto.Category;
import com.edusoft.service.IBaseService;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

//服务层实现
public class CategoryServiceImpl implements IBaseService<Category> {
//    持久层对象
    CategoryDaoImpl cdi=new CategoryDaoImpl();

    /**
     *
     * @param category
     * @return
     * @throws SQLException
     */
    @Override
    public boolean add(Category category) throws SQLException {
        return cdi.add(category);
    }

    @Override
    public Category findOneById(String id) throws SQLException {
        return cdi.findOneById(id);
    }

    public boolean update(Category category) throws SQLException {
        return cdi.update(category);
    }
    /**
     *
     * @param map
     * @return
     * @throws SQLException
     */
    @Override
    public List<Category> findByProp(Map map) throws SQLException {
        return cdi.findByProp(map);
    }
}

五、学习理解
JDBC中一般分为三层,dto(数据传输层),dao(数据访问层),service(服务层),dto中进行数据的定义,dao也称持久层,数据库的语句在这里执行,服务层调用持久层的方法。测试代码时测试层调用服务层的方法,服务层调用持久层的方法;产生结果后持久层传递给服务层,服务层再传递给测试层。

向数据库中添加日期型数据的方法:

Date date= Date.valueOf("2018-8-8");
user.setBrithday(date);

猜你喜欢

转载自blog.csdn.net/wu_lie_xin/article/details/81570937