实习笔记Day02:java实现数据库的增删查改及分层操作
JDBC连接数据库的步骤(MySQL)
- 加载驱动
- 连接数据库
- 写sql语句
- 创建Statement对象,作为容器
- 执行sql语句
- 处理结果(对于查询操作而言)
- 关闭连接
以下是使用数据库查询的完整例子:
package com;
import java.sql.*;
public class Test {
public static void main(String[] args) {
ResultSet resultSet=null;
PreparedStatement statement=null;
Connection connection=null;
try {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
System.out.print("Driver successful\n");
//2.创建连接
connection =DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useSSL=true&characterEncoding=utf-8&user=root&password=password");
System.out.print("connection successful!\n");
//3.写sql
String sql = "select * from userinfo";
//4.得到statement对象,生成容器
statement=connection.prepareStatement(sql);
//5.执行sql,得到结果集
resultSet=statement.executeQuery();
//6.处理结果集
while(resultSet.next()){
System.out.print(resultSet.getInt(1));
System.out.print(resultSet.getString(2));
System.out.print(resultSet.getInt(3));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//7.关闭连接
if (resultSet !=null)
{
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement !=null)
{
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null)
{
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
分层操作实现用户登陆
为何分层及一个分层demo
(1)分层的目的
分层操作是为了实现团队的协作,分层的要求是“高内聚、低耦合”,这样,在框架写好后,团队成员就可以负责各自的模块,通过各层的接口就可以将各个模块组合在一起,形成完整的项目。
(2)分层的一个实例
以用户登陆界面为例,项目的组织结构如下:
我们对数据库中的用户信息表进行查询操作,实现简单的用户登陆界面。用户信息表userinfo如下 :
(3)如何分层
一般的业务流程总是离不开用户界面操作到数据库信息操作这样一段距离。根据用户的操作(比如输入的用户名和密码),软件做出相应的反应,对数据库进行操作(增删查改等),之后对数据库返回的信息做出后返回给用户。
csdn上已经有同学用uml非常清楚的画出了这个过程:
原文地址:
view层
view层的作用非常的直观,就是实现软件与用户交互的界面。具体要实现两个方面的功能
- 面向用户方面记录用户的输入信息,提供一些交互式的信息
- 面向应用(软件):调用功能函数,满足用户的请求
在这个登陆操作中,我简单的用控制台写了如下交互界面:
具体的代码如下:
package com.view;
import com.model.User;
import service.ServiceImpl.LoginServiceImpl;
import java.util.Scanner;
public interface LoginUI {
public static Scanner in=new Scanner(System.in);
//快捷键psvm
public static void main(String[] args) {
//快捷键sout
System.out.println("1.实现用户登陆");
System.out.println("请输入用户名");
String username=in.next();
System.out.println("请输入密码");
String password=in.next();
User loginUser=new User(username,password);
new LoginServiceImpl().doLogin(loginUser);
}
}
以下代码段的作用是记录用户输入的信息:
User loginUser=new User(username,password);
以下代码段的作用是调用功能函数,doLogin(),完成用户的登陆请求。
new LoginServiceImpl().doLogin(loginUser);
说明:
这里直接调用了Service层的方法,但是对于复杂的软件来说,可以通过controller层的实例来统一操纵Service层实现的各种功能。因为这个登陆程序过于简单,所以就不再创建controller层了。
service层:逻辑设计层
service层建立在Dao数据库访问层之上,必须先建立Dao层,才可以建立Service层,正确的建立顺序应该是先建立dao层,再写service层的逻辑。
service层的目的:调用dao层,实现用户要求的各种逻辑功能。
以下是service层的实现代码:
package service.ServiceImpl;
import com.model.User;
import dao.DaoImpl.LoginDaoImpl;
import dao.LoginDao;
import service.LoginService;
public class LoginServiceImpl implements LoginService {
LoginDao dao =new LoginDaoImpl();
@Override
public boolean doLogin(User loginUser) {
//真正操作时,dao产生变化
boolean loginrs=dao.doLogin(loginUser);
if (loginrs)
{
System.out.println("welcome,you've already login");
}else{
System.out.println("failed,there's no such loginUser");
}
return loginrs;
}
}
注意:
service层的结构是:
先写接口中,再通过ServiceImpl实现接口中的各种功能,而不是直接写出各种逻辑功能。这一点给我的启发很大,在学校里学习的抽象、多态只觉得是非常枯燥的概念,而企业中可以通过设置接口方便大家分工合作,并且如果有人想要查看提供给用户的有什么样的逻辑功能,可以直接查看LoginService这个接口内的方法,非常的简洁明了。
- 这个分层的思想真的很有智慧!!
dao层:(Data Access Object)
数据库访问层:实现对数据库的各种操作
代码如下:
package dao.DaoImpl;
import com.model.User;
import com.util.DBUtil;
import dao.LoginDao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class LoginDaoImpl implements LoginDao {
@Override
public boolean doLogin(User loginuser) {
Connection conn= new DBUtil().getConn();
String sql ="select count(*) as num from userinfo where username=? and password =?";
try {
PreparedStatement ptsm=conn.prepareStatement(sql);
ptsm.setString(1,loginuser.getUsername());
ptsm.setString(2,loginuser.getPassword());
//数据库的四种语言,DOL、DML、DQL、DCL
ResultSet rs= ptsm.executeQuery();
while(rs.next())
{
int num=rs.getInt("num");
if (num>0){
return true;
}else {
return false;
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
}
同样的,这里实现对数据库访问的类LoginDaoImpl也是实现了LoginDao这个接口,这里就不在赘述这样做的理由了。
另外,有同学可能会不明白数据库连接操作:
Connection conn= new DBUtil().getConn();
这里用到了com。util下的数据库连接工具类,这个类中封装了数据库的连接代码以及数据库资源释放代码,方便被dao层中的各类方法调用。
model层
终于来到了最最底层,model层 ,又称为entity(实体层),在我目前的理解下,这个层的作用就是使用java的类或者是一些数据结构表示出数据库中的实体,也就是面向对象的思想。
代码如下:
package com.model;
/**
* 实体类,创建用户实体
*/
public class User {
private int id;
private String username;
private String password;
public User(String username,String password) {
this.username = username;
this.password=password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Tips
在最后写出一些使用idea的快捷键,用于提升写代码的速率
- Alt+Enter 自动补全异常、实现接口
- Alt+Insert 自动生成getter、setter
- sout+Enter 自动生成控制台输出语句
- psvm+Enter 快速生成main函数