前期准备工作 :
这里默认你已经把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");
}
}