JDBC及MVC模式的介绍和使用

JDBC

JDBC简介

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。

JDBC的使用步骤

  1. 加载驱动
    通过初始化驱动类com.mysql.jdbc.Driver,该类在mysql-connector-java的jar包中,故需要在工程中导入相应的jar包。
Class.forName("com.mysql.jdbc.Driver");
  1. 创建连接
    创建连接需要的信息有:
    a. 数据库所在的ip,本机为127.0.0.1或localhost,如果连接其他电脑上的数据库,则为那台电脑的相应ip;
    b. 数据库的端口号, MySQL默认为3306,根据自己的设置来填;
    c. 数据库名称,根据需要连接的数据库的名称填写,此处例子数据库名称为library;
    d. 编码方式UTF-8;
    e. 账号 root;
    f. 密码,如果创建数据库的时候没有使用默认的账号和密码,需填写自己设置的账号和密码。
String url = "jdbc:mysql://localhost:3306/library";    //JDBC的URL
conn = DriverManager.getConnection(url, "root", "123456");
  1. 写SQL语句
    根据需求写SQL语句。
String sql = "select * from book";
  1. 得到statement对象
    此处分Statement和PrepareStatement两种。
    选择PreparedStatement还是Statement取决于你要怎么使用它们。对于只执行一次的SQL语句最好选择Statement,而如果SQL语句被多次执行则选用PreparedStatement是最好的。

PreparedStatement的第一次执行消耗是很高的. 它的性能体现在后面的重复执行.

PreparedStatement pst = conn.prepareStatement(sql);
  1. 执行SQL,得到结果集
    查询数据库时,返回的是一个二维的结果集,需要用ResultSet来遍历结果集,获取每一行的数据。
ResultSet rs = pst.executeQuery();
  1. 处理结果集
    Resultset的第一行是空的,要用rs.next()到第一行才能进行读取。
    ResultSet的几个方法:
    next():遍历时,判断是否有下一个结果;
    getString(int columnIndex):以java编程语言中String的形式获取此ResultSet对象的当前行中指定列的值;
    getString(String columnLabel):以java编程语言中String的形式获取此ResultSet对象的当前行中指定列的值。
    (当然此处不一定是getString,可能是getInt,getDouble等等,根据每一列的数据类型而定)
while (rs.next()) {
    System.out.println(rs.getString("id") + "  "
            + rs.getString("name") + "  " 
            + rs.getString("author") + "  "
            + rs.getString("content") + "  "
            + rs.getString("add_date"));
}
  1. 关闭资源
    需要关闭负责执行SQL命令的PrepareStatement或Statement对象及Connection连接对象,如果是查询语句,则还需要关闭存储查询结果的ResultSet对象。
if (rs != null) {
    try {        //关闭存储查询结果的ResultSet对象
        rs.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    rs = null;
}
if (pst != null) {
    try {        //关闭负责执行SQL命令的PrepareStatement对象
        pst.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
if (conn != null) {
    try {        //将Connection连接对象关闭
        conn.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

MVC模式

MVC模式简介

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
View(视图) - 视图代表模型包含的数据的可视化。
Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。

MVC模式的实现方法

model层

在一般的程序中就是对应的数据库表的实体类,即将现实对象抽象成类。
例如在数据库中有一张表存储的是用户的信息,包括电话号码、姓名、密码、性别、学校,对应的列如下:

public class User {

    private String UTel;    //电话号码
    private String UName;   //姓名
    private String UPwd;    //密码
    private String USex;    //性别
    private String USchool; //学校

    public User(String UTel, String UPwd, String USex, String USchool) {
        this.UTel = UTel;
        this.UPwd = UPwd;
        this.USex = USex;
        this.USchool = USchool;
    }

    public String getUTel() {
        return UTel;
    }

    public void setUTel(String UTel) {
        this.UTel = UTel;
    }

    public String getUName() {
        return UName;
    }

    public void setUName(String UName) {
        this.UName = UName;
    }

    public String getUPwd() {
        return UPwd;
    }

    public void setUPwd(String UPwd) {
        this.UPwd = UPwd;
    }

    public String getUSex() {
        return USex;
    }

    public void setUSex(String USex) {
        this.USex = USex;
    }

    public String getUSchool() {
        return USchool;
    }

    public void setUSchool(String USchool) {
        this.USchool = USchool;
    }
    
    @Override
    public String toString() {
        return "User{" +
                "UTel='" + UTel + '\'' +
                ", UName='" + UName + '\'' +
                ", UPwd='" + UPwd + '\'' +
                ", USex='" + USex + '\'' +
                ", USchool='" + USchool + '\'' +
                '}';
    }
}

DAO层

dao层(data access object)叫数据访问层,处于比较底层,执行一些比较基础的操作,具体到对于某个表、某个实体的增删改查等。以下是DAO层里查询所有用户的方法的具体实现。

public List<User> selectAllUser() throws SQLException {
    Connection conn = null;
    PreparedStatement pst = null;
    String sql =  "select * from Users";
    ResultSet rs = null;
    List<User> users = new ArrayList<>();	//此处用了model里面的User类来保存结果集
    try {
        conn = JdbcUtils_JNDI.getConnection();
        pst = conn.prepareStatement(sql);
        rs = pst.executeQuery();

        User user = null;
        while (rs.next()) {
            user = new User(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4));
            users.add(user);
        }
        return users;
    } catch (SQLException e) {
        return null;
    } finally {
        JDBC_Util.Release(conn, pst, rs);
    }
}

service层

Service层主要负责业务模块的逻辑应用设计。同样是首先设计接口,再设计其实现的类,接着再Spring的配置文件中配置其实现的关联。这样我们就可以在应用中调用Service接口来进行业务处理。Service层的业务实现,具体要调用到已定义的Dao层的接口,封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性,程序显得非常简洁。
以下是修改个人信息的service大致实现。

public String updateInfo(String UTel, String UName, String UPwd, String USex, String USchool) {
    try {
        UserDao userDao = new UserDao();
        if (userDao.selectUser(UTel) == null) {
            return "用户不存在";
        } else {
            userDao.updateName(UTel, UName);
            userDao.updatePassword(UTel, UPwd);
            userDao.updateUSex(UTel, USex);
            userDao.updateUSchool(UTel, USchool);
            return "修改成功";
        }
    } catch (SQLException e) {
        return "访问数据库失败";
    }
}

service和DAO是否需要设置接口的问题:

Service和DAO是否需要设置接口取决于具体实现是否需要多样化。如果一种DAO或一种Service只有一种实现,那么抽象出接口的意义不大。而一些大型应用或许需要DAO和Service的多种实现(比如帐户的DAO,可能需要一种Hibernate实现、一种CMP实现和一种JDO实现),为了向上一层隐藏具体实现类,需要采用接口。

view层

view即为视图。不难理解,view层就是用户可以看到的东西。view层不关心后台怎么处理,只关心如何向用户展示信息。View层与Controller层接口紧密,需要系统开发。

controller层

负责具体的业务模块流程的控制,在此层里要调用Service层的接口来控制业务流程。
Conroller层和Service层的区别:Controlle层负责具体的业务模块流程的控制;Service层负责业务模块的逻辑应用设计。
具体实现:针对具体的业务流程,会有不同的控制器,在具体的设计过程中可以将流程进行抽象归纳,设计出可以重复利用的子单元流程模块,这样不仅使得成句结构变得清晰,也大大减少了代码量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值