目录
更新步骤:
一:servlet 六大步骤
1.乱码处理
req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8");
2.获取前端的值
req.getParameter("");
3.封装到model
UserModel Model=new UserModel(); Model.setXX(XX);
4.调用service
UserService userService=new UserServiceImpl();
5.得到返回值
int count =userService.update(Model);
6.返回给前端
resp.getWriter().println(JSONObject.toJSONString(count));
二.调用service
三调用dao
四JDBC
难点:
* 1)servlet 封装model
* 2)sql语句 要判断是否为空等操作
* 3)最后又逗号怎么解决
* 1.修改密码需要单独设置
* 2.删除:
* 3.查询一条数据的时候,必备条件就算id
* 4.根据分页去查询
* 5.每次跟新model的时候,都会重新设置set和get方法,比较麻烦,所以有没有自动生成set和get方法的插件呢?
* lombok插件
* 6.sql语句每个单词前后都记得加空格
2012-12-13 产品CRUD
* 新增
* 1.model 和数据库的产品表 的列名一一对应
* 2.servlet 前端想要传递什么数据给后台(数据库想要保存什么数据)
2.1乱码处理
req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8");
2.2获取前端的值
req.getParameter("");
2.3封装到model
UserModel Model=new UserModel(); Model.setXX(XX);
2.4调用service
UserService userService=new UserServiceImpl();
2.5得到返回值
int count =userService.update(Model);
2.6返回给前端
resp.getWriter().println(JSONObject.toJSONString(count));
* 3.service 逻辑服务处 处理逻辑和调用dao层
* 4.dao 写sql语句,调用JDBC的更新/查询
* ---------------------------------------------------------
* 文件上传:
* 1.引入jar包
<dependency> <groupId>org.lucee</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency>
private static final long serialVersionUID = 1L; // 上传文件存储目录 private static final String UPLOAD_DIRECTORY = "upload"; // 上传配置 private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp){ // 检测是否为多媒体上传 if (!ServletFileUpload.isMultipartContent(req)) { // 如果不是则停止 PrintWriter writer = null; try { writer = resp.getWriter(); } catch (IOException e) { e.printStackTrace(); } writer.println("Error: 表单必须包含 enctype=multipart/form-data"); writer.flush(); return; } // 配置上传参数 DiskFileItemFactory factory = new DiskFileItemFactory(MEMORY_THRESHOLD,new File(System.getProperty("java.io.tmpdir"))); // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中 factory.setSizeThreshold(MEMORY_THRESHOLD); // 设置临时存储目录 factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); ServletFileUpload upload = new ServletFileUpload(factory); // 设置最大文件上传值 upload.setFileSizeMax(MAX_FILE_SIZE); // 设置最大请求值 (包含文件和表单数据) upload.setSizeMax(MAX_REQUEST_SIZE); // 中文处理 upload.setHeaderEncoding("UTF-8"); // 构造临时路径来存储上传的文件 // 这个路径相对当前应用的目录 String uploadPath = req.getServletContext().getRealPath("./") + File.separator + UPLOAD_DIRECTORY; // 如果目录不存在则创建 createDirectory(uploadPath); try { // 解析请求的内容提取文件数据 @SuppressWarnings("unchecked") List<FileItem> formItems = upload.parseRequest(req); if (formItems != null && formItems.size() > 0) { // 迭代表单数据 for (FileItem item : formItems) { // 处理不在表单中的字段 if (!item.isFormField()) { String fileName = new File(item.getName()).getName(); fileName=System.currentTimeMillis()+"--"+fileName; String filePath = uploadPath + File.separator + fileName; File storeFile = new File(filePath); // 在控制台输出文件的上传路径 System.out.println(filePath); // 保存文件到硬盘 item.write(storeFile); req.setAttribute("message", "文件上传成功!"); // 拷贝一份文件到web目录下 String path = storeFile.getPath().split("out")[0] + "/web/" + UPLOAD_DIRECTORY + "/"; copyFile(storeFile, fileName); resp.getWriter().println(JSONObject.toJSONString("/" + UPLOAD_DIRECTORY + "/" + fileName)); } } } } catch (Exception ex) { req.setAttribute("message", "错误信息: " + ex.getMessage()); } } private void createDirectory(String uploadPath) { // 如果目录不存在则创建 File uploadDir = new File(uploadPath); if (!uploadDir.exists()) { uploadDir.mkdir(); } } private void copyFile(File storeFile, String fileName){ String path = storeFile.getPath().split("out")[0] + "/src/main/web/" + UPLOAD_DIRECTORY; createDirectory(path); File file = new File(path, fileName); try (InputStream inputStream = new FileInputStream(storeFile); OutputStream outputStream = new FileOutputStream(file);) { int read = 0; while ((read = inputStream.read()) != -1) { outputStream.write(read); } } catch (IOException e) { e.printStackTrace(); } }
2012-12-14 mybatis
1.引入mybatis包 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.11</version> </dependency>
2.配置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> <!-- 连接数据库的资源文件--> <properties resource="jdbc.properties"></properties> <!-- 数据库的配置--> <settings> <!-- 控制台打印sql语句 --> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <environments default="development"> <environment id="development"> <!--开启数据库事务管理--> <transactionManager type="JDBC"/> <!--使用连接池,不用频繁打开关闭数据库,提高数据库效率。--> <dataSource type="POOLED"> <!--数据库连接信息--> <property name="driver" value="${db.driver}"/> <property name="url" value="${db.url}"/> <property name="username" value="${db.username}"/> <property name="password" value="${db.password}"/> </dataSource> </environment> </environments> <mappers> <!--加载sql映射文件--> <!-- <mapper resource="com/itheima/mapper/UserMapper.xml"/>--> <!--Mapper代理方式--> <package name="com.itheima.mapper"/> </mappers> </configuration>
3.导入:jdbc.properties
db.driver=com.mysql.cj.jdbc.Driver db.url=jdbc:mysql://127.0.0.1:3306/mybatis?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=UTC db.username=***** db.password=******
4.配置Mapper映射文件-----配置数据表CRUD操作的sql语句,在mybatis的核心配置文件中加载映射接口
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.itheima.mapper.UserMapper"> <select id="selectAll" resultType="com.itheima.pojo.User"> select * from tb_user; </select> </mapper> 5.操作数据库
//加载mybatis的核心配置文件,获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取SqlSession对象,用它来执行sql SqlSession sqlSession = sqlSessionFactory.openSession(); //执行sql // List<User> users = sqlSession.selectList("test.selectAll"); //获取UserMapper接口代理对象 UserMapper usermapper = sqlSession.getMapper(UserMapper.class); List<User> users = usermapper.selectAll(); System.out.println(JSON.toJSONString(users)); //释放资源 sqlSession.close();
2012-12-15
修改:只修改状态
* 只需要一个id即可,
* update product set enable=1 where id=5;
* String sql="UPDATE product SET enable = CASE enable WHEN 0 THEN 1 WHEN 1 THEN 0 END WHERE id="+productModel.getId();
* String sql = "UPDATE product SET enable = 1-enable WHERE id = " + productModel.getId();
* String sql = "UPDATE product SET enable=enable^1 where id=" + productModel.getId();
对于前端来说,我们应该返回一个统一的格式,让别人好理解
* layui
* {
* "code": 0,
* "msg": "",
* "count": 1000,
* "data": [{}, {}]
* }
* servlet 只做两件事情:得到前端的值,返回数据前端:不要做任何逻辑关系
对于service和dao都封装了一个基类
* 对于service 做了一个统一的返回值数据格式