JDBC基础
JDBC的基本步骤
1.导入jar包
2.注册驱动
3.获取数据库连接
4.获取数据库执行对象
5.执行sql语句
6.处理结果
7.释放资源
JDBC功能类详解
DriverManager 驱动管理对象
在com.mysql.jdbc.Driver有静态代码块,直接加载类就可亿创建一个driver对象
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
Connection 数据库连接对象
- 执行者对象
获取普通执行者对象:Statment createStatement();
获取预编译执行者对象:PreparedStatement prepareStatement(string sql); - 管理事务
开启事务:setAutoCommit(boolean autoCommit);参数为false,则开启事务
提交事务:commit();
回滚事务:rollback(); - 释放资源
立即将数据库连接对象释放:void close
Statment 执行sql语句的对象
- 执行DML语句
int executeUpdate(Strig sql);
返回值int:返回影响的行数。
参数sql:可以执行insert、update、delete语句 - 执行DQL语句
返回值ResultSet:封装查询的结果。
参数sql:可以执行select语句 - 释放资源
立即将执行者对象释放:void close();
ResultSet 结果集对象
-
判断结果集中是否还有数据:boolean next();
有数据返回true,并将索引向下移动一行。
没有数据返回false。 -
获取结果集中的数据:XXX getXXX(“列名”);
XXX代表数据类型(要获取某列数据,这一列的数据类型)。
例如:String getString(“name”); int getInt(“age”);
使用JDBC完成对student表的CRUD操作
先连接数据库,创建执行数据库对象,执行sql语句,获取返回结果对象集,解析
1.导入jar包
2.数据准备和创建不同的层级
3.dao层
public interface StudentDao {
public abstract ArrayList<Student> findAll();
public abstract Student findByid(Integer id);
public abstract int insert(Student stu);
public abstract int update(Student stu);
public abstract int delete(Integer id);
}
public class StudentDaoImpl implements StudentDao {
/*
查询所有学生信息
*/
@Override
public ArrayList<Student> findAll() {
ArrayList<Student> stu = new ArrayList<>();
Connection con = null;
Statement stat = null;
ResultSet rs = null;
try {
/*//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取链接
con = DriverManager.getConnection("jdbc:mysql://192.168.93.128:3306/db14", "root", "root");*/
con = JDBCUtils.getConnection();
//3.获取执行者对象
stat = con.createStatement();
//4.执行sql语句,并接受返回结果
rs = stat.executeQuery("SELECT * FROM student");
//5.处理结果集
while (rs.next()){
Integer sid = rs.getInt("sid");
String name = rs.getString("name");
Integer age = rs.getInt("age");
Date birthday = rs.getDate("birthday");
Student student = new Student(sid, name, age, birthday);
//将student添加到集合中
stu.add(student);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.close(con,stat,rs);
}
return stu;
}
/*
条件查询,根据id查询学生信息
*/
@Override
public Student findByid(Integer id) {
Student stu = new Student();
Connection con = null;
Statement stat = null;
ResultSet rs = null;
try{
/*//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取链接
con = DriverManager.getConnection("jdbc:mysql://192.168.93.128:3306/db14", "root", "root");*/
con = JDBCUtils.getConnection();
//3.获取执行者对象
stat = con.createStatement();
//4.执行sql语句,并且接收返回的结果集
String sql = "SELECT * FROM student WHERE sid='"+id+"'";//字符串才需要单引号
rs = stat.executeQuery(sql);
//5.处理结果集
while(rs.next()) {
Integer sid = rs.getInt("sid");
String name = rs.getString("name");
Integer age = rs.getInt("age");
Date birthday = rs.getDate("birthday");
//封装Student对象
stu.setSid(sid);
stu.setName(name);
stu.setAge(age);
stu.setBirthday(birthday);
}
} catch(Exception e) {
e.printStackTrace();
} finally {
//6.释放资源
JDBCUtils.close(con,stat,rs);
}
//将对象返回
return stu;
}
/*
添加学生信息
*/
@Override
public int insert(Student stu) {
Connection con = null;
Statement stat = null;
int result = 0;
try{
con = JDBCUtils.getConnection();
//3.获取执行者对象
stat = con.createStatement();
//4.执行sql语句,并且接收返回的结果集
Date d = stu.getBirthday();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String birthday = sdf.format(d);
String sql = "INSERT INTO student VALUES ('"+stu.getSid()+"','"+stu.getName()+"','"+stu.getAge()+"','"+birthday+"')";
System.out.println(sql);
result = stat.executeUpdate(sql);
} catch(Exception e) {
e.printStackTrace();
} finally {
//6.释放资源
JDBCUtils.close(con,stat);
}
//将结果返回
return result;
}
/*
修改学生信息
*/
@Override
public int update(Student stu) {
Connection con = null;
Statement stat = null;
int result = 0;
try{
con = JDBCUtils.getConnection();
//3.获取执行者对象
stat = con.createStatement();
//4.执行sql语句,并且接收返回的结果集
Date d = stu.getBirthday();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String birthday = sdf.format(d);
String sql = "UPDATE student SET sid='"+stu.getSid()+"',name='"+stu.getName()+"',age='"+stu.getAge()+"',birthday='"+birthday+"' WHERE sid='"+stu.getSid()+"'";
result = stat.executeUpdate(sql);
} catch(Exception e) {
e.printStackTrace();
} finally {
//6.释放资源
JDBCUtils.close(con,stat);
}
//将结果返回
return result;
}
/*
删除学生信息
*/
@Override
public int delete(Integer id) {
Connection con = null;
Statement stat = null;
int result = 0;
try{
con = JDBCUtils.getConnection();
//3.获取执行者对象
stat = con.createStatement();
//4.执行sql语句,并且接收返回的结果集
String sql = "DELETE FROM student WHERE sid="+id;
result = stat.executeUpdate(sql);
} catch(Exception e) {
e.printStackTrace();
} finally {
//6.释放资源
JDBCUtils.close(con,stat);
}
//将结果返回
return result;
}
}
4.service层
public interface StudentService {
public abstract ArrayList<Student> findAll();
public abstract Student findByid(Integer sid);
public abstract int insert(Student stu);
public abstract int update(Student stu);
public abstract int delete(Integer id);
}
public class StudentServiceImpl implements StudentService{
private StudentDao dao=new StudentDaoImpl();
//查询所有学生信息
public ArrayList<Student> findAll(){
return dao.findAll();
}
@Override
public Student findByid(Integer sid) {
return dao.findByid(sid);
}
@Override
public int insert(Student stu) {
return dao.insert(stu);
}
@Override
public int update(Student stu) {
return dao.update(stu);
}
@Override
public int delete(Integer id) {
return dao.delete(id);
}
}
5.web层
public class StudentController {
private StudentServiceImpl service=new StudentServiceImpl();
@Test
public void findAll(){
ArrayList<Student> students = service.findAll();
for(Student stu:students){
System.out.println(stu);
}
}
@Test
public void findByid(){
Student student=service.findByid(2);
System.out.println(student);
}
@Test
public void insert(){
Student student = new Student(5, "xiaosan", 27, new Date());
int i = service.insert(student);
if(i!=0){
System.out.println("添加成功");
}else {
System.out.println("添加失败");
}
}
@Test
public void updata(){
Student student = new Student(5, "小三", 24, new Date());
int i = service.update(student);
if(i!=0){
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
}
@Test
public void delete(){
int i = service.delete(5);
if(i!=0){
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
}
}
程序的不足
有sql注入攻击的风险
解决方法:PreparedStatement预编译执行者对象。