千锋学习的第四十五天,
不积跬步无以至千里,不积小流无以成江河;
封装DQL和DML方法可以是代码进行重用,很大程度上减少了我们的代码冗余,而且业务层,数据访问层加上接口,这样可以降低模块之前的耦合性
这里思想最重要,尤其是那个封装的DQL方法内的接口回调,先实现一个接口,这个接口实现了一个方法,接受结果集然后把结果集内的零散数据组合起方法对象中,返回给DQL公共方法,再添加到集合中,其中对于泛型,以及接口回调思想尤为重要,要细细的思考。
以下是具体代码实现
测试代码/用户层次
package com.qf.day5.t2.view;
import com.qf.day5.t2.entity.User;
import com.qf.day5.t2.service.Impl.UserServiceImpl;
import com.qf.day5.t2.service.UserService;
public class Test {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
// User user = new User(5,"大强子","123","山东","1777777");//注册
// System.out.println(userService.register(user));
//
// System.out.println(userService.login(4, "123"));//登录
//
// //删除用户
//
// System.out.println(userService.deleteUser(10));
//查看所有用户
userService.showAllUsers().forEach(System.out::println);
}
}
业务层次(接受用户传递的参数,对数据访问层进行数据的操作)
业务层次接口
package com.qf.day5.t2.service;
import com.qf.day5.t2.entity.User;
import java.util.List;
public interface UserService {
String login(int id,String password);
String register(User user);
List<User> showAllUsers();
String update(User user);
String deleteUser(int id);
}
业务层
package com.qf.day5.t2.service.Impl;
import com.qf.day5.t1.account.utils.DButil;
import com.qf.day5.t2.dao.UserDao;
import com.qf.day5.t2.dao.impl.UserDaoImpl;
import com.qf.day5.t2.entity.User;
import com.qf.day5.t2.service.UserService;
import java.sql.Connection;
import java.util.List;
public class UserServiceImpl implements UserService {
//登录
@Override
public String login(int id, String password) {
UserDaoImpl ud = new UserDaoImpl();
User u = ud.select(id);
if (u == null) {
return "用户存在";
}
if (u.getPwd().equals(password)) {
return "登陆成功";
}
return "登录失败密码错误";
}
//注册
@Override
public String register(User user) {
UserDaoImpl ud = new UserDaoImpl();
int i = ud.insert(user);
if (i > 0) {
return "注册成功";
} else {
return "注册失败";
}
}
//查看所有用户
@Override
public List<User> showAllUsers() {
UserDao ud = new UserDaoImpl();
return ud.selectAll();
}
//修改用户信息
@Override
public String update(User user) {
UserDao ud = new UserDaoImpl();
int i = ud.update(user);
if (i>0){
return "修改成功";
}else {
return "修改失败";
}
}
//删除用户
@Override
public String deleteUser(int id) {
UserDao ud = new UserDaoImpl();
int i = ud.delete(id);
if (i>0){
return "删除成功";
}else {
return "删除失败";
}
}
}
数据访问层
package com.qf.day5.t2.dao.impl;
import com.qf.day5.t2.advanced.Impl.UserRowMapperImpl;
import com.qf.day5.t2.advanced.RowMapper;
import com.qf.day5.t2.dao.UserDao;
import com.qf.day5.t2.entity.User;
import com.qf.day5.t2.utils.Daoutil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
public class UserDaoImpl implements UserDao {
private Connection connection = null;
private PreparedStatement preparedStatement = null;
private ResultSet resultSet = null;
//DAO通用方法工具
private Daoutil<User> daoUtils = new Daoutil();
@Override
public int insert(User user) {
String sql = "insert into user(userid,username,password,address,phone) values (?,?,?,?,?)";
return daoUtils.cupdate(sql,user.getId(),user.getName(),user.getPwd(),user.getAddress(),user.getPhone());
}
@Override
public int update(User user) {
String sql = "update user set username=? , password = ?,address = ?, phone=? where userid=?";
return daoUtils.cupdate(sql,user.getName(),user.getPwd(),user.getAddress(),user.getPhone(),user.getId());
}
@Override
public int delete(int id) {
return daoUtils.cupdate("delete from user where userid=?",id);
}
@Override
public User select(int id) {
RowMapper<User> ro = new UserRowMapperImpl();
List<User> users = daoUtils.selects("select * from user where userid =?",ro,id);
if(users != null){//判断查询是够查询到了数据
return users.get(0);
}
return null;
}
@Override
public List<User> selectAll() {
RowMapper<User> ro = new UserRowMapperImpl();
return daoUtils.selects("select * from user",ro,null);
}
}
数据访问层接口
package com.qf.day5.t2.dao;
import com.qf.day5.t2.entity.User;
import java.util.List;
public interface UserDao {
int insert(User user);
int update(User user);
int delete(int id);
User select(int id);
List<User> selectAll();
}
封装的数据访问层内的DML和DQL方法类
package com.qf.day5.t2.utils;
import com.qf.day5.t2.advanced.RowMapper;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class Daoutil<T> {
//DML重用
/**
* 公共处理增、删、改的方法
* sql语句,参数列表
*
* @param sql 执行的sql语句
* @param args 参数列表。为占位符赋值
* @return
*/
public int cupdate(String sql,Object... args){
Connection conn = null;
PreparedStatement pre = null;
try {
conn =DButil.getConnection();
pre = conn.prepareStatement(sql);
for (int i=0;i<args.length;i++){
pre.setObject(i+1,args[i]);
}
return pre.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
DButil.close(null,pre,null);
}
return 0;
}
/**
* 公共查询方法 (可查询单个对象,也可查询多个对象,可以查任何一张表)
*
* @param sql
* @param args
* @return
*/
// select * from t_account
// select * from t_student
//工具不知道查的是什么 调用者知道
//封装对象、对象赋值 调用者清楚
public List<T> selects(String sql, RowMapper<T> rm,Object... args){
Connection conn = null;
PreparedStatement pre = null;
ResultSet re = null;
List<T> list = new ArrayList<T>();
try {
conn = DButil.getConnection();
pre = conn.prepareStatement(sql);
if(args != null){
for(int i =0;i<args.length;i++){
pre.setObject(i+1,args[i]);
}
}
re = pre.executeQuery();
while(re.next()){//根据查询到的结果完成ORM,如何进行对象的创建及赋值?
//回调---->调用者提供的一个封装方法ORM
T u = rm.getRow(re);
list.add(u);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DButil.close(null,pre,re);
}
return list;
}
}
其中涉及到的接口回调类
package com.qf.day5.t2.advanced.Impl;
import com.qf.day5.t2.advanced.RowMapper;
import com.qf.day5.t2.entity.User;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserRowMapperImpl implements RowMapper<User> {
/**
* 接口实现类。明确创建的对象,并返回
*/
@Override
public User getRow(ResultSet resultSet) {
User user = null;
try {
user = new User(resultSet.getInt(1),resultSet.getString(2),resultSet.getString(3),resultSet.getString(4),resultSet.getString(5));
} catch (SQLException e) {
e.printStackTrace();
} finally {
}
return user;
}
}
数据库的连接注册驱动
package com.qf.day5.t2.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class DButil {
private static final Properties properties = new Properties();
private static final ThreadLocal<Connection> THREAD_LOCAL = new ThreadLocal<Connection>();
static {
InputStream is = DButil.class.getResourceAsStream("/dab.properties");
try {
properties.load(is);
Class.forName(properties.getProperty("driver"));
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
Connection conn = THREAD_LOCAL.get();
try {
if (conn == null){
conn = DriverManager.getConnection(properties.getProperty("url"),properties.getProperty("username"),properties.getProperty("password"));
THREAD_LOCAL.set(conn);
}
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void begin(){
Connection connection = getConnection();
try {
connection.setAutoCommit(false);
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void commit(){//提交
Connection connection = getConnection();
try {
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(connection,null,null);
}
}
public static void rollback(){//回滚
Connection connection = getConnection();
try {
connection.rollback();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(connection,null,null);
}
}
public static void close(Connection conn, Statement st, ResultSet re){
try {
if (re != null){
re.close();
}
if (st != null){
st.close();
}
if (conn != null){
conn.close();
THREAD_LOCAL.remove();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}