三層架構(gòu)
三層結(jié)構(gòu)解釋:
視圖層:主要是用于與用戶進行交互,比如接收用戶輸入的內(nèi)容將返回結(jié)果向用戶展示等。
業(yè)務邏輯層:實現(xiàn)每個功能的特定的邏輯方法。
數(shù)據(jù)訪問層:主要是與數(shù)據(jù)庫進行連接,然后對數(shù)據(jù)庫進行增刪改查工作。
結(jié)構(gòu)一:
包的層級結(jié)構(gòu):
三層結(jié)構(gòu)目錄架構(gòu):
命名規(guī)則為公司域名反寫 eg:com.li.xxx
bean:存放JavaBean,一張表對應一個類,一個字段對應一個屬性
dao:存放連接數(shù)據(jù)庫及對數(shù)據(jù)庫進行增刪改查的操作的接口
dao.impl:存放dao接口的實現(xiàn)類
service:存放邏輯層的接口
service.impl:存放邏輯層的接口的實現(xiàn)類
view:用戶交互層的接口
view.impl:用戶交互層的接口的實現(xiàn)類
包內(nèi)的實現(xiàn)類:
在編寫代碼之前先要創(chuàng)建一個數(shù)據(jù)庫:
CREATE TABLE `student` (
`Sid` int NOT NULL AUTO_INCREMENT,
`Sname` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`birthday` datetime DEFAULT NULL,
`ssex` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '男',
`classid` int DEFAULT NULL,
PRIMARY KEY (`Sid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;
以學生類為例下面是實現(xiàn)代碼:
Student的JavaBean:
public class Student {
//JavaBean實體類
private int sid;
private String sname;
private Date birthday;
private String ssex;
private int classid;
public Student(){
}
public Student(int sid,String sname,Date birthday,String ssex,int classid){
this.sid = sid;
this.sname = sname;
this.birthday = birthday;
this.ssex = ssex;
this.classid = classid;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSsex() {
return ssex;
}
public void setSsex(String ssex) {
this.ssex = ssex;
}
public int getClassid() {
return classid;
}
public void setClassid(int classid) {
this.classid = classid;
}
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", birthday=" + birthday +
", ssex='" + ssex + '\'' +
", classid=" + classid +
'}';
}
Dao層的接口:
稍作贅述:接口的出現(xiàn)實際上是為了制定規(guī)則,代碼編寫三要素:方法名、參數(shù)、返回值類型;而在接口中定義這三個東西然后讓子類實現(xiàn),當某一層未開發(fā)時也不影響其他層的開發(fā)。
public interface IStudentDao {
//增加
public int addStudent(Student s);
//刪除
public int deleteStudent(int sid);
//修改
public int updateStudent(Student s);
//查詢
public Student findStudentBySid(int sid);
//全查
public List<Student> findAllStudent();
}
Dao層接口的實現(xiàn)類:
//增加記錄
@Override
public int addStudent(Student s) {
Connection conn = null;
PreparedStatement presta = null;
int update = 0;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/myschool?charset=utf8mb4&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8&characterEncoding=utf-8&allowPublicKeyRetrieval=true";
String user = "root";
String pwd = "123456";
conn = DriverManager.getConnection(url, user, pwd);
String sql = "insert into student(sname,birthday,ssex,classid) values (?,?,?,?)";
presta = conn.prepareStatement(sql);
// presta.setObject(1,s.getSid());
presta.setObject(1,s.getSname());
presta.setObject(2,s.getBirthday());
presta.setObject(3,s.getSsex());
presta.setObject(4,s.getClassid());
update = presta.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
if (presta != null){
try {
presta.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return update;
}
//刪除記錄
@Override
public int deleteStudent(int sid) {
int update = 0;
PreparedStatement presta = null;
Connection conn = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/myschool?charset=utf8mb4&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8&characterEncoding=utf-8&allowPublicKeyRetrieval=true";
String user = "root";
String pwd = "123456";
conn = DriverManager.getConnection(url, user, pwd);
String sql = "delete from student where sid = ?";
presta = conn.prepareStatement(sql);
presta.setObject(1,sid);
update = presta.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
if(presta != null){
try {
presta.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return update;
}
//修改記錄
@Override
public int updateStudent(Student s) {
int update = 0;
PreparedStatement presta = null;
Connection conn = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/myschool?charset=utf8mb4&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8&characterEncoding=utf-8&allowPublicKeyRetrieval=true";
String user = "root";
String pwd = "123456";
conn = DriverManager.getConnection(url, user, pwd);
String sql = "update student set sname = ?,birthday = ? ,ssex = ? ,classid = ? where sid = ?";
presta = conn.prepareStatement(sql);
presta.setObject(1,s.getSname());
presta.setObject(2,s.getBirthday());
presta.setObject(3,s.getSsex());
presta.setObject(4,s.getClassid());
presta.setObject(5,s.getSid());
update = presta.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
if (presta != null){
try {
presta.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return update;
}
//sid查詢
@Override
public Student findStudentBySid(int sid) {
Connection conn = null;
Student student = null;
PreparedStatement statement = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/myschool?charset=utf8mb4&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8&characterEncoding=utf-8&allowPublicKeyRetrieval=true";
String user = "root";
String pwd = "123456";
conn = DriverManager.getConnection(url, user, pwd);
String sql = "select * from student where sid = ?";
statement = conn.prepareStatement(sql);
statement.setObject(1,sid);
ResultSet resultSet = statement.executeQuery();
if(resultSet.next()){
student = new Student();
student.setSid(resultSet.getInt("sid"));
student.setSname(resultSet.getString("sname"));
student.setBirthday(resultSet.getDate("birthday"));
student.setSsex(resultSet.getString("ssex"));
student.setClassid(resultSet.getInt("classid"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
if (statement != null){
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return student;
}
//全查
@Override
public List<Student> findAllStudent() {
Connection conn = null;
PreparedStatement statement = null;
List list = new ArrayList();
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/myschool?charset=utf8mb4&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8&characterEncoding=utf-8&allowPublicKeyRetrieval=true";
String user = "root";
String pwd = "123456";
conn = DriverManager.getConnection(url, user, pwd);
String sql = "select * from student";
statement = conn.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()){
Student stu = new Student();
stu.setSid(resultSet.getInt("sid"));
stu.setSname(resultSet.getString("sname"));
stu.setBirthday(resultSet.getDate("birthday"));
stu.setSsex(resultSet.getString("ssex"));
stu.setClassid(resultSet.getInt("classid"));
list.add(stu);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
if (statement != null){
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return list;
}
service層的接口:
public interface IStudentService {
//注冊(添加字段)
public boolean register(Student s);
//刪除學生
public boolean deleteStu(int sid);
//修改學生信息
public boolean modifyStu(Student s);
//Sid查詢學生
public Student info(int sid);
//所有學生列表
public List<Student> student();
}
service層的接口的實現(xiàn)類:
//添加學生字段
@Override
public boolean register(Student s) {
boolean isok = false;
IStudentDao isd = new StudentDaoImpl();
int ret = isd.addStudent(s);
if (ret > 0) {
isok = true;
}
return isok;
}
//刪除學生字段
@Override
public boolean deleteStu(int sid) {
boolean isok = false;
IStudentDao isd = new StudentDaoImpl();
int ret = isd.deleteStudent(sid);
if (ret > 0){
isok = true;
}
return isok;
}
//修改學生字段
@Override
public boolean modifyStu(Student s) {
boolean isok = false;
IStudentDao isd = new StudentDaoImpl();
int i = isd.updateStudent(s);
if (i > 0){
isok = true;
}
return isok;
}
//Sid查學生字段
@Override
public Student info(int sid) {
IStudentDao isd = new StudentDaoImpl();
Student studentBySid = isd.findStudentBySid(sid);
return studentBySid;
}
//學生字段全查
@Override
public List<Student> student() {
IStudentDao isd = new StudentDaoImpl();
List<Student> allStudent = isd.findAllStudent();
return allStudent;
}
View的是接口:
public interface IStudentView {
//學生的注冊
public void showstuadd();
//學生的修改
public void showstumodify();
//學生的全部查詢
public void showstuinfo();
//學生的Sid查詢
public void showstuinfoSid();
//學生的刪除
public void showstudelete();
//學生的菜單
public void showstumenu();
}
View的是接口的實現(xiàn)類:
//學生的注冊(添加字段)
@Override
public void showstuadd() {
SimpleDateFormat format = new SimpleDateFormat();
Scanner input = new Scanner(System.in);
System.out.println("添加學生:");
System.out.println("請輸入學生姓名");
String sname = input.next();
System.out.println("請輸入學生生日");
String bir = input.next();
System.out.println("請輸入學生性別");
String sex = input.next();
System.out.println("請輸入學生班級");
int classid = input.nextInt();
Student stu = new Student();
stu.setSname(sname);
try {
stu.setBirthday(format.parse(bir));
} catch (ParseException e) {
stu.setBirthday(new Date());
}
stu.setSsex(sex);
stu.setClassid(classid);
IStudentService iss = new StudentServiceImpI();
boolean register = iss.register(stu);
if (register){
System.out.println("插入成功");
}else{
System.out.println("插入失敗");
}
}
//學生的修改
@Override
public void showstumodify() {
SimpleDateFormat format = new SimpleDateFormat();
Scanner input = new Scanner(System.in);
System.out.println("修改學生信息:");
System.out.println("請輸入需要修改的學生編號");
int sid = input.nextInt();
System.out.println("請輸入學生新姓名");
String sname = input.next();
System.out.println("請輸入學生新生日");
String bir = input.next();
System.out.println("請輸入學生新性別");
String sex = input.next();
System.out.println("請輸入學生新班級");
int classid = input.nextInt();
Student stu = new Student();
stu.setSname(sname);
try {
stu.setBirthday(format.parse(bir));
} catch (ParseException e) {
stu.setBirthday(new Date());
}
stu.setSsex(sex);
stu.setClassid(classid);
stu.setSid(sid);
IStudentService iss = new StudentServiceImpI();
boolean register = iss.modifyStu(stu);
if (register){
System.out.println("修改成功");
}else{
System.out.println("修改失敗");
}
}
//學生的全部查詢
@Override
public void showstuinfo() {
IStudentService iss = new StudentServiceImpI();
List<Student> list = iss.student();
list.forEach(System.out::println);
}
//學生的Sid查詢
@Override
public void showstuinfoSid() {
Scanner scan = new Scanner(System.in);
System.out.println("請輸入需要查詢的ID:");
int i = scan.nextInt();
IStudentService iss = new StudentServiceImpI();
Student info = iss.info(i);
System.out.println(info);
}
//學生的刪除
@Override
public void showstudelete() {
Scanner scan = new Scanner(System.in);
System.out.println("請輸入要刪除學生的ID:");
int anInt = scan.nextInt();
IStudentService iss = new StudentServiceImpI();
boolean deleteStu = iss.deleteStu(anInt);
if (deleteStu){
System.out.println("刪除成功!");
}else{
System.out.println("刪除失敗!");
}
}
//學生的菜單
@Override
public void showstumenu() {
Scanner input = new Scanner(System.in);
System.out.println("歡迎使用校園系統(tǒng)--學生模塊管理");
int key = -1;
do {
System.out.println("輸入:\n1.添加學生\n2.根據(jù)ID查看信息\n3.查看所有學生\n4.修改學生\n5.開除學生\n0.退出程序");
System.out.println("請輸入:");
if(input.hasNextInt()) {
key = input.nextInt();
switch(key) {
case 1:
{
showstuadd();
}
break;
case 2:
{
showstuinfoSid();
}
break;
case 3:
{
showstuinfo();
}
break;
case 4:
{
showstumodify();
}
break;
case 5:
{
showstudelete();
}
break;
default:
System.out.println("請輸入正確的序號");
break;
}
}else {
System.out.println("請輸入菜單中的序號,否則打死你");
input.next();
}
}while(key != 0);
System.out.println("感謝使用");
}
測試類:
public static void main(String[] args) {
IStudentView isv = new IStudentViewImpI();
isv.showstumenu();
}
結(jié)構(gòu)二:
結(jié)構(gòu)一中,在DAO層中頻繁的進行數(shù)據(jù)連接創(chuàng)建訪問對象等,結(jié)構(gòu)復雜,代碼重復率高,因此結(jié)構(gòu)二中對DAO層進行了抽象。
創(chuàng)建DaoUtil類:將加載驅(qū)動,獲取連接,流的釋放進行抽象。
public class DaoUtil {
//加載驅(qū)動
//驅(qū)動的加載只需加載一次,因此使用靜態(tài)代碼塊,當加載此類時,會隨著類的加載而加載一次
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//獲取連接
public static Connection getConn(){
Connection conn = null;
try {
String url = "jdbc:mysql://localhost:3306/myschool?charset=utf8mb4&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8&characterEncoding=utf-8&allowPublicKeyRetrieval=true";
String user = "root";
String pwd = "123456";
conn = DriverManager.getConnection(url, user, pwd);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return conn;
}
//關(guān)閉連接
public static void closeResource(Connection conn, PreparedStatement prep, ResultSet res){
if (res != null){
try {
res.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (prep != null){
try {
prep.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
創(chuàng)建BaseDao:用來存放增刪改和查的方法;這里需要注意的是,增刪改操作時返回值是int的整數(shù)值,表示數(shù)據(jù)庫中的受影響的行數(shù)。而查詢操作返回的是ResultSet類型的結(jié)果,因此需要分開進行寫。
public class BaseDao {
protected Connection conn;
protected PreparedStatement prepstat;
protected ResultSet rs;
//增刪改
protected int update(String sql,Object...args){
int ret = 0;
try {
conn = DaoUtil.getConn();
prepstat = conn.prepareStatement(sql);
if (args != null) {
for (int i = 0; i < args.length; i++) {
prepstat.setObject(i + 1,args[i]);
}
}
ret = prepstat.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
DaoUtil.closeResource(conn, prepstat, rs);
}
return ret;
}
//查詢
protected ResultSet query(String sql,Object...args){
ResultSet rs = null;
try {
conn = DaoUtil.getConn();
prepstat = conn.prepareStatement(sql);
if (args != null){
for (int i = 0; i < args.length; i++) {
prepstat.setObject(i + 1,args[i]);
}
}
rs = prepstat.executeQuery();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return rs;
}
}
抽象后的實現(xiàn)類如下:文章來源:http://www.zghlxwxcb.cn/news/detail-772111.html
public class StudentDaoImpl extends BaseDao implements IStudentDao {
//增加記錄
@Override
public int addStudent(Student s) {
String sql = "insert into student(sname,birthday,ssex,classid) values (?,?,?,?)";
return update(sql,s.getSname(),s.getBirthday(),s.getSsex(),s.getClass());
}
//刪除記錄
@Override
public int deleteStudent(int sid) {
String sql = "delete from student where sid = ?";
return update(sql,sid);
}
//修改記錄
@Override
public int updateStudent(Student s) {
String sql = "update student set sname = ?,birthday = ? ,ssex = ? ,classid = ? where sid = ?";
return update(sql,s.getSname(),s.getBirthday(),s.getSsex(),s.getClassid(),s.getSid());
}
//sid查詢
@Override
public Student findStudentBySid(int sid) {
Student s = null;
SimpleDateFormat format = new SimpleDateFormat();
try {
String sql = "select * from student where sid = ?";
rs = query(sql, sid);
if (rs.next()) {
s = new Student();
s.setSid(rs.getInt("sid"));
s.setSname(rs.getString("sname"));
try {
s.setBirthday(format.parse(rs.getString("birthday")));
} catch (ParseException e) {
e.printStackTrace();
}
s.setSsex(rs.getString("ssex"));
s.setClassid(rs.getInt("classid"));
s.setSid(rs.getInt("sid"));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
DaoUtil.closeResource(conn, prepstat, rs);
}
return s;
}
//全查
@Override
public List<Student> findAllStudent() {
Student s = null;
List list = new ArrayList();
SimpleDateFormat format = new SimpleDateFormat();
try {
String sql = "select * from student where sid = ?";
rs = query(sql);
if (rs.next()) {
s = new Student();
s.setSid(rs.getInt("sid"));
s.setSname(rs.getString("sname"));
try {
s.setBirthday(format.parse(rs.getString("birthday")));
} catch (ParseException e) {
e.printStackTrace();
}
s.setSsex(rs.getString("ssex"));
s.setClassid(rs.getInt("classid"));
s.setSid(rs.getInt("sid"));
list.add(s);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
DaoUtil.closeResource(conn, prepstat, rs);
}
return list;
}
}
不同的分法可能會略微有所區(qū)別,劃分程度不同,劃分的層級可能也不同,但本質(zhì)思想不變,將代碼功能模塊化,實現(xiàn)高內(nèi)聚低耦合,例如Dao用來做數(shù)據(jù)庫連接等操作,就盡量只需調(diào)方法傳參就能執(zhí)行即可,不要在執(zhí)行的過程中還需要其他層數(shù)據(jù)的介入,主要也是為了開發(fā)的高效性,同時便于對代碼進行測試。文章來源地址http://www.zghlxwxcb.cn/news/detail-772111.html
到了這里,關(guān)于java三層架構(gòu),有圖有案例有代碼,一看就懂?。?!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!