总体
- .dao层,dao层里面有一个接口,这里需要注意的是dao层没有实现类,原因是因为我们使用了Mybatis框架。
下面展示IUsersDao代码片
。
public interface IUsersDao {
/**
* 登录判断
* 判断账号密码是否正确
* @param uname
* @param upwd
* @return
*/
//注解
@Select("select * from user_test where uname=#{uname} and upwd=#{upwd}")
//结果集映射
@Results(id = "usersMap",value = {
@Result(id = true,column = "id",property = "id"),
@Result(column = "uname",property = "uname"),
@Result(column = "upwd",property = "upwd"),
@Result(column = "uage",property = "uage"),
@Result(column = "uzhuzhi",property = "uzhuzhi"),
@Result(column = "uphone",property = "uphone"),
})
//@param 传递多个参数,解决可读性和直观性 单对象可以不用@param
List<Users> loginUsers(@Param("uname") String uname, @Param("upwd") String upwd);
/**
* 多表查询 多对多
*/
@Select("select t1.*,t2.* from student t1 left join subject t2 on t1.stu_id=t2.stu_id")
List<Map<String,Object>> selctTwoAll();
}
上述使用的是注解方式,也可以使用xml文件来完成配置。 通用结果集映射是在实体类中属性名与数据库中字段名不相同时设置,如果属性名和字段名相同可以选择不配置结果集映射。
@Result(id = true,column = “id”,property = “id”)这里的id表示是设置数据库中的主键字段
- entity类,实体类,私有属性(尽量与数据库中字段名相对应),里面有getter、setter方法,toString方法,无参构造方法和有参构造方法(用不到的方法可以省略)。
下面展示Users代码片
。
/**
* Users实体类
* Created by acer on 2021/4/3.
*/
public class Users {
private int id;//id编号
private String uname;//账号
private String upwd;//密码
private String uage;//年龄
private String uzhuzhi;//住址
private String uphone;//电话
//生成getter、setter方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
public String getUage() {
return uage;
}
public void setUage(String uage) {
this.uage = uage;
}
public String getUzhuzhi() {
return uzhuzhi;
}
public void setUzhuzhi(String uzhuzhi) {
this.uzhuzhi = uzhuzhi;
}
public String getUphone() {
return uphone;
}
public void setUphone(String uphone) {
this.uphone = uphone;
}
//生成tostring方法
@Override
public String toString() {
return "Users{" +
"id=" + id +
", uname='" + uname + '\'' +
", upwd='" + upwd + '\'' +
", uage='" + uage + '\'' +
", uzhuzhi='" + uzhuzhi + '\'' +
", uphone='" + uphone + '\'' +
'}';
}
//生成无参构造方法
public Users() {
super();
}
//生成有参构造方法
public Users(int id, String uname, String upwd, String uage, String uzhuzhi, String uphone) {
this.id = id;
this.uname = uname;
this.upwd = upwd;
this.uage = uage;
this.uzhuzhi = uzhuzhi;
this.uphone = uphone;
}
}
上述中生成了有参构造,无参构造,toString方法,如不需要可将其删除。这里需要注意的是创建实体类时尽量要将实体类中的属性名与数据库中的字段名相对应。
- service层
1.IUsersService接口类
下面展示IUsersService代码片
。
/**
* service层接口
* Created by acer on 2021/4/3.
*/
public interface IUsersService {
//判断该用户是否存在,登录判断
List<Users> loginUsers(String uname, String upwd);
}
IUsersService中的方法和IUsersDao中的方法是相同的
- UsersServiceImpl实现类
下面展示一些UsersServiceImpl代码片
。
/**
* service实现类
* Created by acer on 2021/4/3.
*/
public class UsersServiceImpl implements IUsersService {
/**
* 登录判断
* @return
*/
@Override
public List<Users> loginUsers(String uname, String upwd) {
//加载连接
SqlSession session = MyBatisUtil.getSqlSession();
//创建dao层
IUsersDao dao = session.getMapper(IUsersDao.class);
List<Users> b = dao.loginUsers(uname,upwd);
//关闭session连接
MyBatisUtil.close();
return b;
}
}
细心的会发现我上面是有一个MyBatisUtil,这个是我建的一个工具类,后面会说到
- servlet层,控制层
下面展示servlet层代码片
。
/**
* servlet
* 登录
* Created by acer on 2021/4/5.
*/
@WebServlet("/loginUsersServlet")
public class loginUsersServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置中文编码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
resp.setCharacterEncoding("utf-8");
//service
IUsersService service=new UsersServiceImpl();
//指定账号密码
String uname=req.getParameter("uname");
String upwd=req.getParameter("upwd");
//传参
/*List<Users> b = service.loginUsers(uname, upwd);*/
List<Users> b = service.loginUsers(uname,upwd);
System.out.println(b);
//isEmpty()判断list集合有没有元素,如果有元素返回false,没有返回true,如果集合本身设置为null,则会报空指针异常
if(b.isEmpty()==false){
req.getRequestDispatcher("selectServlet").forward(req,resp);
}else
req.getRequestDispatcher("fail.jsp").forward(req,resp);
}
}
设置中文编码可以最后放到一个过滤器filter中,当前文件中只有一个servlet所以我图一个省事,就直接在此处写。isEmpty()判断list集合有没有元素,如果有元素返回false,没有返回true,如果集合本身设置为null,则会报空指针异常。
- util类,工具类
下面展示util类代码片
。
/**工具类
* 加载数据库连接
* Created by mp on 2021-03-30.- 9:38
*/
public class MyBatisUtil {
private static SqlSessionFactory factory;
//保证service层 进行多次dao操作,公用一个SqlSession对象
private static ThreadLocal<SqlSession> tl = new ThreadLocal<SqlSession>();
static{
try {
String resouce = "mybatis-config.xml"; //代表总配置文件的路径
InputStream is = Resources.getResourceAsStream(resouce);//使用输入流读取配置文件
factory = new SqlSessionFactoryBuilder().build(is);//facotry只需要创建一个
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
SqlSession session = tl.get();
if(session == null) {
session = factory.openSession();
tl.set(session);
}
return session;
}
public static void close(){
SqlSession session = tl.get();
if(session != null){
session.close();
tl.set(null);
}
}
}
上述中都有注释,不理解的地方可以留言问
- 主配置文件 mybatis-config.xml
下面展示主配置文件代码片
。
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration >
<!--配置数据库连接信息-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
<!--配置mapper文件的路径-->
<mappers>
<mapper class="com.test.dao.IUsersDao"/>
</mappers>
</configuration>
注:这是xml文件。 name=“username” value=“scott” 用户名
name=“password” value=“tiger” 密码
使用注解的方式的话,mappers中应该写成 class=“全限定类名” 。如果使用xml配置的话应该写成 resource=“com/test/dao/StudentMapper.xml” 后面跟的是mapper.xml文件的全限定类名。
今天就先到这里,有问题的可以留言,也可以直接私信我,不喜勿喷,谢谢大家,再见!!!