JDBC与MySQL Dao模式操作笔记

前期准备工作 :

这里默认你已经把JavaSe过了一遍 对多态,接口等概念有所了解

然后电脑已经装好了mysql并且可以使用基本的增删改查语句

对JDBC操作数据库有过实际的练习

1 下载安装mysql的jdbc驱动

    1.1 创建一个JAVA项目 在项目根目录下创建一个 lib文件夹(将jdbc驱动文件放入)

    1.2 对jdbc驱动文件 单击右键biuld path 然后选择configuer biuld path 切换到Libraries 选择 AddLibrary

2 创建一个名字叫做user的数据库

    2.1 里面就一张t_user表 有三个字段 id(int)主键选择自动增长,username(varcahr),password(varchar)

    2.2 (自行添加测试数据)

==========================================================================================

项目结构图

==========================================================================================

正式开始 src目录下创建数据库的配置文件 jdbc.properties:(以后如果更换数据库,直接修改配置文件,不用修改源代码)

第一行 :注明驱动的位置 照着抄就好

第二行:最后一个斜杆后面改成自己的数据库名字

第三行:自己数据库用户名(默认就是root)

第四行:自己数据库用户密码(默认就是root)

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/user
name=root
passworld=root

=======================================================================================================

开始制作JDBC的工具类 里面有注册驱动(直接读取上面创建的配置文件)和各种关闭方法:

1 创建一个 com.test.utli的包 里面创建一个工具类JDBCUtil

package com.test.utli;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JDBCUtil {
    static String driverClass = null;
    static String url = null;
    static String name = null;
    static String passworld = null;

//使用静态代码块给变量赋值

    static {
        try {

            // 1 创建一个属性配置对象
            Properties properties = new Properties();
            // 读取配置文件
            InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
            // 导入输入流
            properties.load(is);

            // 读取属性
            driverClass = properties.getProperty("driverClass");

            url = properties.getProperty("url");
            name = properties.getProperty("name");
            passworld = properties.getProperty("passworld");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接对象
     *
     * @return
     */
    public static Connection getConn() {
        Connection conn = null;
        try {
            Class.forName(driverClass);
            conn = DriverManager.getConnection(url, name, passworld);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 释放资源 关闭所有对象
     *
     * @param conn
     * @param st
     * @param rs
     */
    public static void release(Connection conn, Statement st, ResultSet rs) {
        closeRs(rs);
        closeSt(st);
        closeConn(conn);
    }

 /**
     * 释放资源
     *
     * @param conn
     * @param st
     */

    public static void release(Connection conn, Statement st) {
        closeSt(st);
        closeConn(conn);
    }

 /**
     * 关闭ResultSet
     *
     * @param rs
     */

    private static void closeRs(ResultSet rs) {
        try {
            if (rs != null) {
                rs.close();
            }

        } catch (Exception e2) {
            e2.printStackTrace();
        } finally {
            rs = null;
        }
    }

 /**
     * 关闭Statement
     *
     * @param st
     */

    private static void closeSt(Statement st) {
        try {
            if (st != null) {
                st.close();
            }

        } catch (Exception e2) {
            e2.printStackTrace();
        } finally {
            st = null;
        }

    }

 /**
     * 关闭Connection
     *
     * @param conn
     */

    private static void closeConn(Connection conn) {
        try {
            if (conn != null) {
                conn.close();
            }

        } catch (Exception e2) {
            e2.printStackTrace();
        } finally {
            conn = null;
        }

    }

}

=======================================================================================================

DAO模式 面向接口编程 创建com.test.dao包 里面创建一个UserDao接口 里面规定各种等待实现的方法

(这里为了方便理解 方法全部都是没有返回值的)

package com.test.dao;

public interface UserDao {

    /**
     * 添加
     */
    public void insert(String username, String password);

    /**
     * 查询所有
     */
    public void findAll();

    /**
     * 登录方法
     *
     * @param username
     * @param password
     */
    void login(String username, String password);

    /**
     * 删除用户
     *
     * @param userName
     */
    void deleteUser(String userName);

    /**
     * 根据用户姓名更新密码
     *
     * @param userName
     * @param password
     */
    void upUserPassword(String userName, String password);
}

=======================================================================================================

注意 以下代码 使用了PrepareStatement 该对象替换了statement对象。

 相比较以前的statement, 预先处理给定的sql语句,对其执行语法检查。 在sql语句里面使用 ? 占位符来替代后续要传递进来的变量。 后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。(可以防范SQL注入)

=======================================================================================================

实现接口 创建一个com.test.daoInpl包 在里面创建接口的实现类UserDaoImpl 实现接口的方法

package com.test.daoInpl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.test.dao.UserDao;
import com.test.utli.JDBCUtil;

public class UserDaoImpl implements UserDao {
    // 查询所有用户
    @Override
    public void findAll() {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            // 1 创建连接对象 直接调用工具类获取连接对象
            conn = JDBCUtil.getConn();
            // 2 获取操作对象
            st = conn.createStatement();
            // 3 执行sql
            rs = st.executeQuery("select * from t_user");
            while (rs.next()) {
                System.out.println("id:" + rs.getInt("id") + " 姓名:" + rs.getString("username") + " 密码:"
                        + rs.getString("password"));
            }
        } catch (SQLException e) {

            // 直接调用工具类 关闭
            JDBCUtil.release(conn, st, rs);
        }
    }

// 用户登录  

@Override
    public void login(String username, String password) {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            // 1 创建连接对象
            conn = JDBCUtil.getConn();
            String sql = "select * from t_user where username=? and password=?";
            // 2 获取操作对象 预先对sql语句进行检查 ?对应的内容不管传什么进来 都把它看做字符串
            PreparedStatement ps = conn.prepareStatement(sql);
            // ?对应的索引从1开始
            ps.setString(1, username);
            ps.setString(2, password);

            rs = ps.executeQuery();
            if (rs.next()) {
                System.out.println("登录成功");
            } else {
                System.out.println("登录失败");
            }
        } catch (SQLException e) {
            JDBCUtil.release(conn, st, rs);
        }

    }

// 添加用户

    @Override
    public void insert(String username, String password) {
        Connection conn = JDBCUtil.getConn();
        PreparedStatement ps = null;
        try {
            String sql = "insert into t_user values(null,?,?)";
            ps = conn.prepareStatement(sql);
            ps.setString(1, username);
            ps.setString(2, password);
            int rs = ps.executeUpdate();
            if (rs > 0) {
                System.out.println("添加成功");
            } else {
                System.out.println("添加失败");
            }

        } catch (Exception e) {

        } finally {
            JDBCUtil.release(conn, ps);
        }

    }

// 删除用户

    @Override
    public void deleteUser(String userName) {
        Connection conn = JDBCUtil.getConn();
        PreparedStatement ps = null;

        try {
            String sql = "delete from t_user where username= ?";
            ps = conn.prepareStatement(sql);
            ps.setString(1, userName);
            int rs = ps.executeUpdate();
            if (rs > 0) {
                System.out.println("删除成功");
            } else {
                System.out.println("删除失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.release(conn, ps);
        }

    }

//更新用户

    @Override
    public void upUserPassword(String userName, String password) {
        Connection conn = JDBCUtil.getConn();
        PreparedStatement ps = null;

        try {
            String sql = "update t_user set password = ? where username = ?";
            ps = conn.prepareStatement(sql);
            ps.setString(1, password);
            ps.setString(2, userName);
            int num = ps.executeUpdate();
            if (num > 0) {
                System.out.println("更新成功");
            } else {
                System.out.println("更新失败");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.release(conn, ps);
        }

    }

}

=====================================================================================================

使用Juit进行测试

  导入Juit4单元测试 对项目 右键单击biuld path 然后选择 AddLibrary  然后选择Juit4

新建一个com.test.test1的包 存放一个TestUserDao的测试类 在想要测试的方法上面加上 @Test点击运行即可

package com.test.test1;

import org.junit.Test;
import com.test.dao.UserDao;
import com.test.daoInpl.UserDaoImpl;
public class TestUserDao {

    @Test
    public void testLogin() {

//模拟调用刚才实现的方法
        UserDao dao = new UserDaoImpl();
        dao.insert("小白1", "123");
    }    
}

猜你喜欢

转载自blog.csdn.net/a13085/article/details/81843516