数据库数据
待会儿后台需要执行的sql语句
JSP页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="C" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<a href="UserServlet?name=老">点击这里一下下</a>
<C:forEach items="${list }" var="x">
</p>${x.name }
</C:forEach>
</body>
</html>
后台代码
1、servlet
package com.xh.Servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xh.Service.UserService;
import com.xh.ServiceImpl.UserServiceImpl;
import com.xh.user.User;
/**
* Servlet implementation class UserServlet
*/
@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
System.out.println("前台传过来的"+name);
User user = new User();
user.setName(name);
UserService us = new UserServiceImpl();
try {
List<User> list = us.showUser(user);
System.out.println("集合"+list);
request.setAttribute("list", list);
request.getRequestDispatcher("/show.jsp").forward(request, response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
2、service
package com.xh.Service;
import java.util.List;
import com.xh.user.User;
public interface UserService {
List<User> showUser(User user) throws Exception;
}
3、serviceImpl
package com.xh.ServiceImpl;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.xh.Dao.UserDao;
import com.xh.DaoImpl.UserDaoImpl;
import com.xh.Service.UserService;
import com.xh.user.User;
public class UserServiceImpl implements UserService {
@Override
public List<User> showUser(User user) throws Exception {
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory ss = new SqlSessionFactoryBuilder().build(in);
UserDao ud = new UserDaoImpl(ss);
return ud.findUserByName(user.getName());
}
}
4、Dao
package com.xh.Dao;
import java.util.List;
import com.xh.user.User;
public interface UserDao {
List<User> findUserByName(String name);
}
5、DaoImpl
package com.xh.DaoImpl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.xh.Dao.UserDao;
import com.xh.user.User;
public class UserDaoImpl implements UserDao {
private SqlSessionFactory ss;
//无参构造函数
public UserDaoImpl() {
}
//通过有参数的构造函数传入会话工厂
public UserDaoImpl(SqlSessionFactory ss) {
this.ss = ss;
}
@Override
public List<User> findUserByName(String name) {
System.out.println("查看"+name);
//创建数据库会话实列
SqlSession s = ss.openSession();
List<User> list = s.selectList("test.findUserByName", name);
s.close();
return list;
}
}
6、演示结果
8、也可以直接用测试直接调Dao
package com.xh.test;
import static org.junit.Assert.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.xh.DaoImpl.UserDaoImpl;
import com.xh.user.User;
public class UserDaoImplTest {
/* 直接测试UserDaoImpl 创建测试方法:在Other里面找到JUnit Test Case即可*/
@Test
public void test() {
InputStream in = null;
try {
in = Resources.getResourceAsStream("SqlMapConfig.xml");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SqlSessionFactory ss = new SqlSessionFactoryBuilder().build(in);
List<User> list = new UserDaoImpl(ss).findUserByName("老");
for (User x : list) {
System.out.println(x.getName()+","+x.getSex());
}
}
}
总结
原始Dao开发中存在以下问题:
- Dao方法体存在重复代码:通过SqlSessionFactory创建SqlSession,调用SqlSession的数据库操作方法
- 调用sqlSession的数据库操作方法需要指定statement的id,这里存在硬编码,不利于开发维护。