(1)导入jar包,因为,要使用SUN公司的这套接口,就必须导入他编写的jar包。
因为我的数据库是8.0的,所以这里JDBC的jar包以mysql8.0为例,如果用的是5.0版本的数据库就下载mysql5.0的jar包。
在模块下面创建一个lib目录,然后将jar包复制进去,再添加依赖到模块下。(创建项目的步骤是File --> New --> Project 然后可以直接创建包和类 )(添加依赖的步骤 File --> Project Structure)
jar包前面有小箭头就代表,依赖导入成功!!!
(2)然后肯定是要创建一个实体类,因为一张表对应java中的一个实体类。(这里以user表为例)
以下是数据表里的数据 和 整个数据表的结构(这里的id 没有自增,一般在项目中是要设置自增的)
以下是User实体类(属性是和数据表中的字段相对应的,一般都要有无参数构造和有参数构造,然后get和set方法,还有toString方法)
package com.atguigu.jdbc.entity;
import java.util.Date;
public class User {
private Integer id;
private String username;//用户名
private String sex;//性别
private Date birthday;//生日
private String address;//住址
public User() {
}
public User(Integer id, String username, String sex, Date birthday, String address) {
this.id = id;
this.username = username;
this.sex = sex;
this.birthday = birthday;
this.address = address;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
", address='" + address + '\'' +
'}';
}
}
(3)接下来就全是JDBC的操作了,请认真阅读
(3.1) 在src目录下,创建一个jdbc.properties文件,名字随便定义,但是后缀名一定要是.properties,这里建议命名为jdbc.properties(创建步骤 右击src目录,new --> File)
(3.2) 在jdbc.properties文件中配置数据库的连接参数,因为我是8.0的数据库所以url地址和5.0有些不一样(截图里面忘记说了,8.0之前的driverClassName是com.mysql.jdbc.Driver !!! 8.0才需要加cj)
(3.3)废话不多说,接下来就是在main方法里面进行连接了。
添加操作:添加了 王五 这条记录
修改操作:将 张三 修改成 张三丰
查询操作:查询user表中所有记录,运行结果如下
删除操作:删除 王五 这条记录
接下来附上测试类的代码
package com.atguigu.jdbc.test;
import com.atguigu.jdbc.entity.User;
import java.io.InputStream;
import java.sql.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
public class JDBCTest {
public static void main(String[] args) throws Exception {
/**
* 1.读取配置文件中的4个基本信息(main方法对应目录是src下,
* 如果是单元测试方法的话好像是对应模块目录)。
* 2.写代码的话,我个人感觉没有太大弄懂每一步什么意思,
* 比如这个ClassLoader.getSystemClassLoader()什么的,我也只知道是用类加载器加载属性资源文件
* 建议新手的话,先不要深究每一行代码是什么意思,只需要记住每一步的步骤和相关的API方法
* 因为连接每次都是一样的步骤,资源文件的路径一般也都是在src下
*
* 这里解释一下 这里是通过 key 获取 键值对的值 括号里面的值要是jdbc.properties文件中存在的
*
* String username = pros.getProperty("username");
* String password = pros.getProperty("password");
* String url = pros.getProperty("url");
* String driverClassName = pros.getProperty("driverClassName");
*/
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties pros = new Properties();
pros.load(is);
String username = pros.getProperty("username");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClassName = pros.getProperty("driverClassName");
// 2.加载驱动
Class.forName(driverClassName);
// 3.获取连接
Connection conn = DriverManager.getConnection(url, username, password);
/**
* 2.预编译sql语句,返回PreparedStatement的实例(这里说一下为什么不用Statement)
* 使用Statement会被恶意的sql注入(关于sql注入,大家可以百度查一下,我这就不细说了)
* PreparedStatement刚好可以避免这种sql注入
*
* PrepareStatement是数据库的操作对象
*/
//添加操作 ? 是占位符
//添加一条王五的记录
// String insertSql = “insert into user values(?,?,?,?,?)”;
// PreparedStatement ps = conn.prepareStatement(insertSql);
// new JDBCTest().insert(ps);
//将张三 改成 张三丰
// String updateSql = “update user set username=? where id=?”; //修改操作
// PreparedStatement ps = conn.prepareStatement(updateSql);
// new JDBCTest().update(ps);
//查询操作
// String selectSql = “select * from user”;
// PreparedStatement ps = conn.prepareStatement(selectSql);
// new JDBCTest().select(ps);
String deleteSql = "delete from user where username = ?"; //删除操作
PreparedStatement ps = conn.prepareStatement(deleteSql);
new JDBCTest().delete(ps);
//关闭连接
ps.close();
conn.close();
}
public void insert(PreparedStatement ps) throws Exception {
//关于为什么要用使用到对象,不用对象明明也可以插入数据,在这里我解释一下,
// 1. java是面向对象的编程
// 2. 而且用对象来存储不同类型的对象是比较方便的,比如从网页上获取用户输入的数据,可以通过对象
//传递到Service层再到dao层
User user = new User(20, "王五", "男", new Date(), "北京市");
//填充占位符 setObject() 第一个参数是占位符的下标 下标从1开始
ps.setObject(1,user.getId());
ps.setObject(2,user.getUsername());
ps.setObject(3,user.getSex());
ps.setObject(4,user.getBirthday());//如果要自己输入日期,则需要进行格式化等操作
ps.setObject(5,user.getAddress());
//执行添加操作
ps.executeUpdate();
}
public void select(PreparedStatement ps) throws Exception {
//查询操作返回结果集
ResultSet resultSet = ps.executeQuery();
//创建一个List集合,里面存放的都是User对象,这里就必须使用到对象的技术,不然这么多不同类型的数据怎么放
List list = new ArrayList();
while(resultSet.next()){
//这里的下标也是从1开始
Integer id = (Integer) resultSet.getObject(1);
String username = (String) resultSet.getObject(2);
String sex = (String) resultSet.getObject(3);
Date birthday = (Date) resultSet.getObject(4);
String address = (String) resultSet.getObject(5);
list.add(new User(id,username,sex,birthday,address));
}
//下面使用的java8新特性 lambda表达式 真的很方便 小伙伴们赶快安排上!!!
list.forEach(System.out::println);
//如果不会使用lambda表达式可以使用 普通的循环
// for (User user:list) {
// System.out.println(user);
// }
}
public void update(PreparedStatement ps) throws Exception {
ps.setObject(1,"张三丰");
ps.setObject(2,12);
//执行修改操作
ps.executeUpdate();
}
public void delete(PreparedStatement ps) throws Exception {
ps.setObject(1,"王五");
ps.executeUpdate();
}
}
下面是项目的目录:
这是我第一次写博客,如果有写的不好的地方请见谅,有错误和不足之处,希望大佬们能之处,最后,希望和大家一起进步,一起成长,谢谢!