SSM案例利用Spring框架技术连接数据库对数据库进行查序操作(第十三课)本案例采用的是Spring注解开发的
回顾SSM开发流程:
Mvc三层架构增删改查执行流程
在构建一个Java web项目中。比如我以学生表为例子.对学生表的数据进行增删改查如何进行呀。
前端技术与服务器数据交互技术:离不开前端访问服务器的数据
在这里我们学了两种方案。方案一利用上个学Servlect+jsp页面编程技术.
方案二利用这个学期所学AJax+JSON+HTMl.在HTML中有包含这些内容HTML+JavaScript+AJax+jQuery+JSON
.jQuery中包含选择器 事件 效果 在对单张表的增删改查中最难理解
是修改因为他要步骤最多。
@1修改功能
首先第一部要获得你要修改那一条数据的id
第二步你要用jQuery的属性选择器将数据显示在页面上
第三步 你要将修改后的页面数据信息发回到服务器 经历MVC 三层架构 将修改后上,信息在数据库中更新
第四步将更新后的数据刷新到页面上查看。
总结遇到修改不用慌
先分清楚流程是什么 利用的技术是 Ajax+JSON解析。当我要修改的的记录编号ID 为1001001 时候
首先浏览器要将ID编号发送给服务器 在控制层中
将浏览器发过来的ID等于1001001接收
利用的是resquest 对象 然后将ID 参数发送到 业务逻辑层 在到数据访问层
为了更好的理解一般是从数据访问层的接口中定义方法
Map getInfoStudentById(int id);
在数据反问层实现类中实现
DBUtil.jt.queryForMap("select * from student where id=?", new Object[]{id});}
这里数据反问层使用的方案是
Ajax+Json+Mvc+JdbcTemplate+Servlect+Html+JavaScript+Jquery+Mysql
同理在业务实现类的接口
Map getInfoStudentById(int id);
在业务逻辑层接口的实现类中实现。
在控制层中调用以下方法
Map infoStudentById = service.getInfoStudentById(Integer.parseInt(id));
//我要获得 年龄 姓名 电话 地址
List<String> age = service.getAge(); List<String> name = service.getName(); List<String> phone = service.getPhone(); List<String> address = service.getAddress();
第二步步分上面的数据利用什么方式封装起来
Map<String, Object> map = new HashMap<>(); map.put("infoStudentById", infoStudentById); map.put("age", age); map.put("name", name); map.put("phone", phone); map.put("address", address); new ObjectMapper().writeValue(response.getWriter(), map);
比如在浏览器中要在input标签中显示性别 年龄如何实现呢!
$("input[name=age]").val(json.infoStudentById.age)//将数据库中的年龄展示在页面中 (json.infoStudentById.sex = "男") { $("input[value='男']").attr("checked", true) } else { $("input[value='女']").attr("checked", true) }
用户单机修改按钮将修改后的数据发送到数据库中去步骤
浏览器中页面完成修改后数据库也要更新
因此根据MVC三层架构思想
控制器要接收到浏览器要修改的页面数据信息
在控制层的第一步
Map<String, String[]> parameterMap = request.getParameterMap(); String id = (String) request.getSession().getAttribute("id");
接下来从数据访问层的接口中定义方法
int updateStudent(Map<String, Object> map);
同理在业务逻辑层中的接口中写下以下方法
int updateStudent(Map<String, Object> map);
最终控制器回执行下面的内容
i
nt student = service.updateStudent(parameterMap, Integer.parseInt(id)); if(student>0){ System.out.println("恭喜用户修改信息已完成"); response.sendRedirect("workList1.html"); }
最后修改页面完成。仔细分析发现也不是那么难吧!🤗
运用到的知识
到了服务器中:在服务器中要构建三层. 方案一:在构建这三层种你可以利用普通的Java方式构建三层。方案二:使用框架的方式构建三层. 在控制层中你可以使用方案一:使用Servlect 方案二使用springMVC框架。在这里你有两种方案。1 配置文件的方式 方案2 利用注解的方式
在业务逻辑逻辑层 创建对象使用spring框架。spring中分为好多模块利用bean管理。在spring框架中你可以使用IOc三种方案 1 配置文件的注入 2 注解的方式注入 3 不需要配置文件注入 建立一个工具类使用注解的方式
在数据反问层中你可以使用的是MyBatis框架。在数据访问层中正对MyBatis框架有三种方案。方案一利用配置文件注入。方案二利用 配置文件注入加接口文件的方式。方案三利用MyBats注解的方式。
在写Java web项目的过程中首先用到的数据库中的知识创建数据库创建数据库的表格。
在idea中新建项目 导入必备的SSM架包 配置资源文件的信息 配置web-xml文件信息。
第一个功能 查询数据库中所有数据信息。
首先从数据库将SQL语句写好 select * from student
然后分析查到的数据利用什么方式存放起来呢!
在此之前要建立好三个包 分别是控制层的 实现类 业务逻辑层的接口和实现类 再是数据反问层的接口和实现类 如果数据反问层使用的MyBats注解的方式只需写个接口文件。
@2查询功能
在查询的数据库中的表中肯定是多条记录 每个条记录中有多个字段 因此使用Java存放的方式是
在这里我使用的是MVC三层架构的普通方式介绍
因此你要在数据反问层的接口中定义方法
List<Map<String, Object>> getStudentList();}或者是List<Student,student>gestudentList();}
同理在业务逻辑思层中:
List<Map<String, Object>> getStudentList();}或者是List<Student,student>gestudentList();}
那么如何将控制层 业务逻辑层 数据反问层 连接起来呢!
在控制层中: ITeacherService service = new TeacherServiceImp();
在业务逻辑层中
ITeacherDao dao=new TeacherDaoImp();
然后层层返回 到控制层
List<Map<String, Object>> teacherList = service.getTeacherList(); Map<String, Object> map = new HashMap<>(); map.put("list", teacherList); new ObjectMapper().writeValue(response.getWriter(), map);
发到HTML页面进行JSON解析。
JSON解析后会将数据展示在页面。
@3删除功能
写出SQL语句
delete from emp where id=?
分析SQL语句在Java中利用什么方式存放起来的
在增删改中返回值为int类型值。删除是根据编号删除的因此控制器要将浏览器发来的ID接收 利用是是resquest对象
在控制层调用业务逻辑层的方法利用。
IEmpService service=new EmpServiceImp()
同理在业务逻辑层是实现类中
IEmpDao dao = new EmpDaoImp();
在业务逻辑层接口中定义方法利用int del(int Id)
同理在数据访问层接口中定义方法
int del(int Id) int delete service.delete(ids);if(delete>0){response.sendRedirect("workList.html"); }
利用重定向的方式
@4增加一条数据库记录
SQL语句当我点击按钮跳转到一个新的页面用于增加数据的信息。
当用户增加成功要进行页面的查询操作。
insert into emp values(?,?,?,?,?,?)",
返回值为int类型 在没条记录中但对应的属性和值。
在业务逻辑层接口中定义方法 int add(Map map);
同理在数据访问层
int add(Map map);
在控制层中
Map<String, String[]> parameterMap = request.getParameterMap(); int add = service.add(parameterMap); if (add > 0) { //添加成功,跳回主页面 response.sendRedirect("index.html"); }
利用SSM框架对数据库中的数据查询操作
第一步 建立起数据库 建立起数据库中的表
如图所示建立起数据库的表
第二步建立起工具类 用来连接数据库用的
package Com.Teacher.Utils; public interface IDBUtil { void init(); }
package Com.Teacher.Utils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.sql.Connection; import java.sql.DriverManager; /** * 创建工具类信息 */ @Component(value="db") public class DBUtil implements IDBUtil{ @Value("com.mysql.cj.jdbc.Driver") private String driver;//连接数据库的驱动程序 @Value("jdbc:mysql://localhost:3306/mdb?useUnicode=true&characterEncoding=UTF-8") private String url;//访问数据库的地址 @Value("root") private String username;//登录数据库的用户名 @Value("123456") private String password;//登录数据库的密码 public Connection connection=null; @PostConstruct public void init(){ //加载驱动程序 try { Class.forName(driver); //开始连接数据,获得connection对象 connection = DriverManager.getConnection(url, username, password); } catch (Exception e) { e.printStackTrace(); } } }
上面有些方法没有写 在我们学习Spring框架开发中 这里不使用配置文件 利用一个类来实现
package Com.Teacher.Utils; public interface ITeacherSpingUtil { void TeacherSpingUtil(); }
package Com.Teacher.Utils; import org.junit.Test; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan("Com.Teacher") public class TeacherSpingUtil implements ITeacherSpingUtil { @Test public void TeacherSpingUtil(){ System.out.println("调用Sping接口"); } }
如图所示建立起SSM中常用的三层架构
实体类
public class Teacher { private int id; private String name; private int phone; private int money; private Object date; }
Dao层
package Com.Teacher.Dao; import java.util.List; import java.util.Map; public interface ITeacherDao { List<Map<String,Object>> All(); void X(); }
package Com.Teacher.Dao; import Com.Teacher.Utils.DBUtil; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /*从这个类中访问数据库的内容对数据进行增删改查*/ @Repository(value = "dao") public class TeacherDaoImp implements ITeacherDao { @Autowired DBUtil db; @Override public List<Map<String, Object>> All() { List<Map<String, Object>> oList = new ArrayList<>(); //判断连接数据库是否成功 if (db.connection!= null) { String sql = "SELECT *FROM teacher"; try { PreparedStatement ps = db.connection.prepareStatement(sql); ResultSet rs = ps.executeQuery(); while (rs.next()) { //int id = rs.getInt("id"); int id=rs.getInt("id"); String name=rs.getString("name"); int phone=rs.getInt("phone"); int money=rs.getInt("money"); String date=rs.getString("date"); Map<String, Object> oMap = new HashMap<>(); // oMap.put("id", id); oMap.put("id",id); oMap.put("name",name); oMap.put("phone",phone); oMap.put("money",money); oMap.put("date",date); oList.add(oMap); } } catch (SQLException e) { e.printStackTrace(); } } return oList; } @Test @Override public void X() { System.out.println("开始调用数据库dao层"); } }
Servlect层
package Com.Teacher.Servlect; import java.util.List; import java.util.Map; public interface ITeacherServlect { List<Map<String,Object>> All(); void X(); }
package Com.Teacher.Servlect; import Com.Teacher.Dao.ITeacherDao; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; @Service(value = "service") public class TeacherServlectImp implements ITeacherServlect{ @Autowired ITeacherDao dao; @Override public List<Map<String, Object>> All() { return dao.All(); } @Test @Override public void X() { System.out.println("开始调用Servlect层对象"); } }
Controller层
package Com.Teacher.Controller; import java.util.List; import java.util.Map; public interface ITeacherController { List<Map<String,Object>> All(); void X(); }
package Com.Teacher.Controller; import Com.Teacher.Servlect.ITeacherServlect; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import java.util.List; import java.util.Map; /*控制层调到测试层中*/ @Controller(value = "controller") public class TeacherController implements ITeacherController { @Autowired ITeacherServlect servlect; public List<Map<String,Object>> All(){ return servlect.All(); } @Override public void X() { System.out.println("开始调用控制层对象"); } }
Test测试类
package Com.Teacher.Test; public interface TeacherTesstImp { void one(); void X(); }
package Com.Teacher.Test; import Com.Teacher.Controller.TeacherController; import Com.Teacher.Utils.TeacherSpingUtil; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class TeacherTesst implements TeacherTesstImp{ @Test public void one() { ApplicationContext ac = new AnnotationConfigApplicationContext(TeacherSpingUtil.class); TeacherController controller = ac.getBean("controller",TeacherController.class); controller.All().forEach(map-> System.out.println(map)); } @Test @Override public void X() { System.out.println("调用成功"); } }
运行结果
这里采用了注解的方式开发 下面的博客会讲到 这个案例让你了解一下框架的的方便