5.写代码,暴露数据

5.1.entity包

实体包,里面写Userinfos类,将MySQL数据库中表中的列在这里声明,封装这些属性。并做好(上面的@... 是 lombok 包中的便捷方法)

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserInfos {
    private Long userid;
    private String username;
    private Date birthday;
}

5.2.dao包

5.2.1BaseDAO

public class BaseDAO {
    //静态属性
    private static String DRIVER;
    private static String URL;
    private static String USERNAME;
    private static String PASSWORD;
    private static Connection con;
    //静态块,提前加载驱动
    static {
        loadDriver();
    }
    //加载驱动的方法
    private static void loadDriver(){
        try {
            String path =URLDecoder.decode(BaseDAO.class.getResource("/driver.properties").getPath(),"utf-8");
            Properties pro = new Properties();
            pro.load(new FileInputStream(path));
            DRIVER = pro.getProperty("driver");
            URL = pro.getProperty("url");
            USERNAME = pro.getProperty("username");
            PASSWORD = pro.getProperty("password");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //保护类。包内可见,子类可见,但外部不可见
    protected BaseDAO(){}
    //获得链接方法
    public static Connection getConnection(){
        if(con == null){
            try {
                Class.forName(DRIVER);
                con= DriverManager.getConnection(URL,USERNAME,PASSWORD);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return con;
    }
}

5.2.2UserInfosDao
BaseDAO包的子类(本项目中这个类所具备的功能就代表了java数据链路层的功能)

public class UserInfosDao extends BaseDAO{
    private PreparedStatement pstat;
    private ResultSet rs;
    //1.增删改的方法
    public void update(String sql,Object[] params){
        try {
            pstat = getConnection().prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                pstat.setObject(i+1,params[i]);
            }
            pstat.executeLargeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    //2.查询的方法
    public ResultSet query(String sql,Object[] params){
        try {
            pstat = getConnection().prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                pstat.setObject(i+1,params[i]);
            }
            rs = pstat.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }
    //3.将查询结果放入List集合的方法
    public List<UserInfos> change(String sql,Object[] params){
        ResultSet rs = query(sql, params);
        List<UserInfos> users = new ArrayList();
        try {
            while(rs.next()){
                UserInfos us = UserInfos.builder()
                        .userid(rs.getLong("userid"))
                        .username(rs.getString("username"))
                        .birthday(rs.getDate("birthday")).build();
                users.add(us);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return users;
    }
    //4.登陆方法(最终需要实现的方法,带上sql语句)
    public UserInfos login(String username,Integer pwd){
        String sql = "select * from userinfos where username=? and pwd=?";
        List<UserInfos> uss = change(sql,new Object[]{username,pwd});
        return uss.isEmpty()? null : uss.get(0);

    }
    //5.查询全部(最终需要实现的方法,带上sql语句)
    public List<UserInfos> findAll(){
        String sql ="select * from userinfos";
        return change(sql,new Object[]{});
    }
}

5.3services包

5.3.1UserinfosService接口

public interface UserinfosService {
    public String serchAll();
    public UserInfos userLogin(String username,Integer pwd);
}

5.3.2UserinfosServiceImpl

接口实现类

public class UserinfosServiceImpl implements UserinfosService {
    private UserInfosDao userInfosDao;
    //构造中创建数据链路层DAO对象,实现服务层调用数据链路层(二层调三层)
    public UserinfosServiceImpl(){
        userInfosDao = new UserInfosDao();
    }
    //重写方法
    @Override
    public String serchAll() {
        //调取DAO层的方法查询所有信息,返回一个List集合
        List<UserInfos> allData = userInfosDao.findAll();
        //利用JSON包中的方法,将List集合转换为String(步骤2.3已经加了这个包)
        String res = JSONObject.toJSONString(allData);
        return res;
    }
    @Override
    public UserInfos userLogin(String username, Integer pwd) {
        return userInfosDao.login(username,pwd);

    }
}

5.4controller包(Servlet)

5.4.1InitServlet

创建Servlet类的方法:

1.导包(步骤2.4已完成)

2.创建:鼠标点到包上,alt+ins 直接输入ser找到并创建新的servlet,创建的Servlet类会自动继承HttpServlet,并且有两种方法doPost和doGet。

3.每创建一个Servlet类都需要在web.xml里面添加一个servlet-map(不写会报错),添加名字和模式,名字就是类名,模式写“/login”或"/init",这里写完的模式需要在网络地址中使用

public class initServlet extends HttpServlet {
    private UserinfosService userinfosService;
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //控制层调服务层(一层调二层),调出查询方法
        userinfosService = new UserinfosServiceImpl();
        String result = userinfosService.serchAll();
        //用响应造出输出流
        PrintWriter out = response.getWriter();
        out.println(result);
        out.close();
    }
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //此处用doGet调用doPost方法,两种方法都走doPost
        doPost(request,response);
    }
}

5.4.2LoginServlet

控制层的登陆方法

public class LoginServlet extends HttpServlet {
    private UserinfosService userinfosService;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //在控制层上调服务层的登陆方法,并且用request请求 写入名字和密码
        String name = request.getParameter("name");
        Integer pwd = Integer.parseInt(request.getParameter("pwd"));
        userinfosService = new UserinfosServiceImpl();
        UserInfos us = userinfosService.userLogin(name, pwd);
        PrintWriter out = response.getWriter();
        out.println(us!=null?"success":"fail");
        out.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

       至此,java远程连接数据库,实现方法并暴露在网络上可供测试的目标已经实现,下一步就是进行实际测试,并用压力测试找到代码还存在的问题,并进行修改和优化。