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