解释
DAO(Data Access Object)是一个数据访问接口,数据访问:顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。
目的
为了建立一个健壮的Java应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的 语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储
DAO模式是标准的JavaEE设计模式之一.开发人员使用这个模式把底层的数据访问操作和上层的商务逻辑分开,一个典型的DAO实现有下列几个组件:
- 一个DAO接口;
- 数据传递对象(有些时候叫做Bean对象);
- 至少一个实现DAO接口的具体类;
- 一个DAO工厂类;
一个账号管理的小例子:
DAO接口
public interface BaseUserDao {
/**
* 用于向数据库xzk_user表格中插入一行数据
* @param username 是要插入的账号
* @param password 是要插入的密码
* @return 结果, 增加成功返回true
*/
boolean insert(String username,String password);
/**
* 用于从数据库xzk_user表格中查询一行数据
* @param username 是要查询的条件1:账号
* @param password 是要查询的条件2:密码
* @return 结果, 查询成功返回true
*/
boolean findByPassword(String username,String password);
/**
* 用于从数据库xzk_user表格中查询一行数据
* @param username 是要查询的条件1:账号
* @param password 是要查询的条件2:密码
* @return 结果, 查询成功返回true
*/
boolean findByPassword2(String username,String password);
/**
* 查询所有用户信息
* @return 用户列表
*/
List<User> findAll();
}
数据传送对象
public class User {
private String username;
private String password;
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(username, user.username) &&
Objects.equals(password, user.password);
}
@Override
public int hashCode() {
return Objects.hash(username, password);
}
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;
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public User() {
}
}
实现DAO接口的具体类
public class MySqlUserDao implements BaseUserDao{
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
@Override
public boolean insert(String username, String password) {
Connection conn = null;
Statement state = null;
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8", "root", "123");
state = conn.createStatement();
//insert into xzk_user values('username','password') : 字符串的定义格式 字符串的表现格式
int row = state.executeUpdate("insert into xzk_user values('" + username + "','" + password + "')");
return row>0;
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
state.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
@Override
public boolean findByPassword(String username, String password) {
Connection conn = null;
PreparedStatement state = null;
ResultSet rs = null;
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8", "root", "123");
//参数: 预编译的SQL语句, 参数部分使用?替代.
state = conn.prepareStatement("select * from xzk_user where username=? and password=?");
//向预编译的执行环境中, 加入参数的内容
state.setString(1,username);
state.setString(2,password);
//执行
rs = state.executeQuery();
return rs.next();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
rs.close();
} catch (Exception throwables) {
throwables.printStackTrace();
}
try {
state.close();
} catch (Exception throwables) {
throwables.printStackTrace();
}
try {
conn.close();
} catch (Exception throwables) {
throwables.printStackTrace();
}
}
return false;
}
@Override
public boolean findByPassword2(String username, String password) {
Connection conn = null;
Statement state = null;
ResultSet rs = null;
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8", "root", "123");
state = conn.createStatement();
//执行
rs = state.executeQuery("select * from xzk_user where username='"+username+"' and password='"+password+"'");
return rs.next();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
rs.close();
} catch (Exception throwables) {
throwables.printStackTrace();
}
try {
state.close();
} catch (Exception throwables) {
throwables.printStackTrace();
}
try {
conn.close();
} catch (Exception throwables) {
throwables.printStackTrace();
}
}
return false;
}
@Override
public List<User> findAll() {
List<User> data = new ArrayList<>();
Connection conn = null;
Statement state = null;
ResultSet rs = null;
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8", "root", "123");
state = conn.createStatement();
rs = state.executeQuery("select * from xzk_user");
while(rs.next()){
String username = rs.getString("username");
String password = rs.getString("password");
data.add(new User(username,password));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
state.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return data;
}
}
DAO工厂类
public class UserDaoFactory {
public static BaseUserDao get(){
return new MySqlUserDao();
}
}
main方法
public class Main {
static Scanner input = new Scanner(System.in);
static BaseUserDao dao = UserDaoFactory.get();
public static void main(String[] args) {
System.out.println("欢迎来到某某软件");
System.out.println("请选择:");
System.out.println("1.注册\t\t2.登陆\t\t3.查看所有用户");
String menu = input.nextLine();
switch (menu){
case "1":
reg();
break;
case "2":
login();
break;
case "3":
showUsers();
break;
}
}
private static void showUsers() {
List<User> data = dao.findAll();
System.out.println("所有用户信息如下:");
System.out.println(data);
}
private static void login() {
System.out.println("请输入账号:");
String username = input.nextLine();
System.out.println("请输入密码:");
String password = input.nextLine();
boolean flag = dao.findByPassword(username, password);
System.out.println(flag?"恭喜你,登陆成功":"很遗憾,登陆失败");
}
private static void reg() {
System.out.println("请输入要注册的账号:");
String username = input.nextLine();
System.out.println("请输入要注册的密码:");
String password = input.nextLine();
boolean flag = dao.insert(username, password);
System.out.println(flag?"恭喜你,注册成功":"很遗憾,注册失败");
}
}