方法一:
1. 定义学生类:
作用:与数据库的内容相同,控制层调用此类方法,数据库查询数据封装为Student对象,在把Student对象传进数组中
格式:私有属性;构造有参无参方法,get和set方法,加一个toString()方法
这里使用时Integer非int,因为integer默认值是null,而int默认为0,防止数组库中有null,
int和integer区别
package com.www.domain;
import javax.xml.crypto.Data;
public class Student {
private Integer sid;
private String last_name;
private Integer age;
//private Data birthday;
public Student() {
}
public Student(Integer sid, String last_name, Integer age) {
this.sid = sid;
this.last_name = last_name;
this.age = age;
// this.birthday = birthday;
}
public Integer getSid() {
return sid;
}
public String getLast_name() {
return last_name;
}
public Integer getAge() {
return age;
}
// public Data getBirthday() {
// return birthday;
// }
public void setSid(Integer sid) {
this.sid = sid;
}
public void setLast_name(String last_name) {
this.last_name = last_name;
}
public void setAge(Integer age) {
this.age = age;
}
/*public void setBirthday(Data birthday) {
this.birthday = birthday;
}*/
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", last_name='" + last_name + '\'' +
", age=" + age +
'}';
}
}
2.1. 学生类接口(包是dao):–相当于dao层,进行业务判断和数据库存取
作用:只写抽象方法(增删改查),具体类有学生类方法实现去解决:类似jdbc和各数据库厂家模式一样;
package com.www.dao;
import com.www.domain.Student;
import java.util.ArrayList;
//抽象类接口,不写具体方法
public interface StudnetDao {
//查询所有学生信息
public abstract ArrayList<Student> findAll();
//条件查询,根据id获取学生信息
public abstract Student findById(Integer id);
//新增学生信息
public abstract int insert(Student stu);
//修改学生信息
public abstract int update(String stu);
//删除学生信息
public abstract int delete(Integer id);
}
2.2. 学生类具体实现方法(包是dao):—相当于模型,进行业务判断和数据库存取
作用:具体些增删改差的实现方法,如何连接数据库,如何编写sql语句去实现查询:
package com.www.dao;
import com.www.domain.Student;
import java.sql.*;
import java.util.ArrayList;
public class StudentDaolmpl implements StudnetDao {
ArrayList<Student> list = new ArrayList<>();
Connection con = null;
Statement stat = null;
ResultSet rs = null;
//查询所有学生信息
public ArrayList<Student> findAll() {
try {
// 第一步:注册驱动:
Class.forName("com.mysql.jdbc.Driver");
// 第二步:获取连接
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/dbtest14", "root", "wqy13955665397");
// 第三步:获取数据库操作对象
stat = con.createStatement();
// 第四步:执行sql语句
String sql = "SELECT * FROM student";
rs = stat.executeQuery(sql);
// 第五步:处理查询结果集
while (rs.next()) {
Integer sid = rs.getInt("sid");
String name = rs.getString("last_name");
Integer age = rs.getInt("age");
// Date birthday = rs.getDate("birthday");
//封装Student对象
Student stu = new Student(sid, name, age);
//将Student对象保持在集合里
list.add(stu);
}
} catch (Exception e) {
e.printStackTrace();
} finally {//finally是必须执行的、这里面注意一点是finally不能使用try语句变量,所以要申请全局变量
//第六步:释放资源(使用完一定要关闭)
if (con != null) {//在进行判断一下是否为null
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//将结果集对象返回
return list;
}
}
//条件查询,根据id获取学生信息
@Override
public Student findById(Integer id) {
Student stu = new Student();
try {
// 第一步:注册驱动:
Class.forName("com.mysql.jdbc.Driver");
// 第二步:获取连接
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/dbtest14", "root", "wqy13955665397");
// 第三步:获取数据库操作对象
stat = con.createStatement();
// 第四步:执行sql语句
String sql = "SELECT * FROM student WHERE sid='" + id + "'";//把id对象传进去
rs = stat.executeQuery(sql);
// 第五步:处理查询结果集
while (rs.next()) {
Integer sid = rs.getInt("sid");
String name = rs.getString("last_name");
Integer age = rs.getInt("age");
// Date birthday = rs.getDate("birthday");
//封装Student对象
stu.setSid(sid);
stu.setLast_name(name);
stu.setAge(age);
//将Student对象保持在集合里
list.add(stu);
}
} catch (Exception e) {
e.printStackTrace();
} finally {//finally是必须执行的、这里面注意一点是finally不能使用try语句变量,所以要申请全局变量
//第六步:释放资源(使用完一定要关闭)
if (con != null) {//在进行判断一下是否为null
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//将结果集对象返回
return stu;
}
}
//新增学生信息
@Override
public int insert(Student stu) {
int result = 0;
try {
// 第一步:注册驱动:
Class.forName("com.mysql.jdbc.Driver");
// 第二步:获取连接
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/dbtest14", "root", "wqy13955665397");
// 第三步:获取数据库操作对象
stat = con.createStatement();
// 第四步:执行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.getLast_name() + "','" + stu.getAge() + "')";//把id对象传进去
result = stat.executeUpdate(sql);//赋值
} catch (Exception e) {
e.printStackTrace();
} finally {//finally是必须执行的、这里面注意一点是finally不能使用try语句变量,所以要申请全局变量
//第六步:释放资源(使用完一定要关闭)
if (con != null) {//在进行判断一下是否为null
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return result;
}
//修改学生信息
@Override
public int update(String stu) {
int result = 0;
try {
// 第一步:注册驱动:
Class.forName("com.mysql.jdbc.Driver");
// 第二步:获取连接
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/dbtest14", "root", "wqy13955665397");
// 第三步:获取数据库操作对象
stat = con.createStatement();
// 第四步:执行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.getLast_name()+"',age='"+stu.getAge()+"' WHERE sid='"+stu.getSid()+"')";//把id对象传进去
result = stat.executeUpdate(sql);//赋值
} catch (Exception e) {
e.printStackTrace();
} finally {//finally是必须执行的、这里面注意一点是finally不能使用try语句变量,所以要申请全局变量
//第六步:释放资源(使用完一定要关闭)
if (con != null) {//在进行判断一下是否为null
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return result;
}
//删除学生信息
@Override
public int delete(Integer id) {
int result = 0;
try {
// 第一步:注册驱动:
Class.forName("com.mysql.jdbc.Driver");
// 第二步:获取连接
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/dbtest14", "root", "wqy13955665397");
// 第三步:获取数据库操作对象
stat = con.createStatement();
// 第四步:执行sql语句
//转换时间格式
// Date d =stu.getBirthday();
// SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
// String birthday = sdf.format(d);
String sql = "DELETE FROM student WHERE sid='"+id+"'";//把id对象传进去
result = stat.executeUpdate(sql);//赋值
} catch (Exception e) {
e.printStackTrace();
} finally {//finally是必须执行的、这里面注意一点是finally不能使用try语句变量,所以要申请全局变量
//第六步:释放资源(使用完一定要关闭)
if (con != null) {//在进行判断一下是否为null
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return result;
}
}
分析:
一:查询学生信息,
前面的注册,连接,获取数据库操作对象都是一样的流程;主要查询结果需要封装数据对象
rs.getString(“last_name”)是把数据库的内容传进 String name ,然后再把这数据封装到student对象集中。
Integer sid = rs.getInt("sid");
String name = rs.getString("last_name");
Integer age = rs.getInt("age");
// Date birthday = rs.getDate("birthday");
//封装Student对象
Student stu = new Student(sid, name, age);
//将Student对象保持在集合里
list.add(stu);
Integer sid = rs.getInt("sid");
String name = rs.getString("last_name");
Integer age = rs.getInt("age");
// Date birthday = rs.getDate("birthday");
//封装Student对象
Student stu = new Student(sid, name, age);
//将Student对象保持在集合里
list.add(stu);
二:新增信息,修改学生信息,删除信息(最大不同就是sql语句不同)
public int insert(Student stu) {},Student stu是把控制层输入的对象传进来,所以这里面肯定需要获取这些数据的方法;stu.getAge()
String sql = "INSERT INTO student VALUES('" + stu.getSid()+ "','" + stu.getLast_name() + "','" + stu.getAge() + "')";//把id对象传进去
类似:把自己输入的id对象传进去方法:sid=’" + id + "
"SELECT * FROM student WHERE sid='" + id + "'"
需要反馈信息:int execuUpdate(String sql)
int可以返回影响的行数;所以数据修改成功返回数据,控制层判断是否为0就可以知道是否修改成功了
int result =0;
result = stat.executeUpdate(sql);//赋值
工具类
上述代码重复特别多,采用工具模式简化代码:
地址:https://blog.csdn.net/gun_wqy/article/details/123731945
3:1 服务层接口(包是service):
作用:学生类主要和数据库打交道,service主要和servlet打交道。应该就是那种降低关联吧
package com.www.service;
import com.www.domain.Student;
import java.util.ArrayList;
public interface StudnetService {
//查询所有学生信息
public abstract ArrayList<Student> findAll();
//条件查询,根据id获取学生信息
public abstract Student findById(Integer id);
//新增学生信息
public abstract int insert(Student stu);
//修改学生信息
public abstract int update(String stu);
//删除学生信息
public abstract int delete(Integer id);
}
3.2: 服务层接口(包是service):
作用:服务接口的具体实现方法
package com.www.service;
import com.www.dao.StudentDaolmpl;
import com.www.domain.*;
import com.www.dao.StudnetDao;
import java.util.ArrayList;
public class StudentServicelmpl implements StudnetService {
private StudnetDao Dao = new StudentDaolmpl();
//查询所有学生信息
@Override
public ArrayList<Student> findAll() {
return Dao.findAll();
}
//条件查询,根据id获取学生信息
@Override
public Student findById(Integer id) {
return Dao.findById(id);
}
//新增学生信息
@Override
public int insert(Student stu) {
return Dao.insert(stu) ;
}
//修改学生信息
@Override
public int update(String stu) {
return Dao.update(stu);
}
//删除学生信息
@Override
public int delete(Integer id) {
return Dao.delete(id);
}
}
4.1测试类:–控制层
package com.www.contorller;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import com.www.service.StudentServicelmpl;
import com.www.service.StudnetService;
import com.www.domain.Student;
import org.testng.annotations.Test;
//import org.junit.Test;
import java.util.ArrayList;
import java.util.Scanner;
public class StudentController {
private StudnetService service = new StudentServicelmpl();
//查询所有学生信息
@Test
public void findAll() {
ArrayList<Student> list = service.findAll();
for (Student stu : list) {
System.out.println(stu);
}
}
//条件查询,根据id获取学生信息
@Test
public void findById() {
Student stu =service.findById(3);
System.out.println(stu);
}
//新增学生信息
@Test
public void insert() {
Student stu =new Student(15,"刘备",32);
int result = service.insert(stu);
if (result!=0){
System.out.println("添加成功");
}else
System.out.println("添加失败");
}
//修改学生信息
@Test
public void update(String stu) {
Student stu2 =service.findById(15);
stu2.setLast_name("韩信");
int result =service.update(stu);
if (result!=0){
System.out.println("修改成功");
}else{
System.out.println("修改失败");
}
}
//删除学生信息
@Test
public int delete(Integer id) {
int result=service.delete(15);
if (result!=0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
return result;
}
}
分析:
MVC框架的dao层、service层和controller层之间的区别与联系
从查询方法为例:从控制层开始:
第一步:findAll()函数创建一个ArrayList 数组,调用服务层的方法findAll(),
ArrayList<Student> list = service.findAll();
第二步:进入服务层方法findAll(), 返回Dao.findAll()数据,以 ArrayList形式返回
public ArrayList<Student> findAll() {
return Dao.findAll();
}
第三步:进入dao 层,就是调用学生类的具体实现方法,因为第一步要求返回的值是 数组,所以这个方法返回的和之前一样,方法为public ArrayList findAll() {},该方法里面就是实现连接数据的六步操作;在JDBC (一)中有解释,最主要不同就sql语句的不同。
问题
一:JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误:
原因:错误是缺少hamcrest的包
hamcrest的包的下载地址:http://www.java2s.com/Code/Jar/h/Downloadhamcrestcore13jar.htm#google_vignette
二;测试可以使用Junit包,也可以导入:import org.testng.annotations.Test;
三:java连接数据库时间格式转换问题:
报错:java.sql.Datae cannot be cast to javacx.xml.crypte.Date
解决方法:去掉时间之后就运行成功了(正在探索)
四:修改数据方法中莫名奇妙找不到方法(解决不了)