删除工作区的内容,Mapper.xml文件中修改内容为下

2019-10-06 作者:编程   |   浏览(82)

通过泛型可以定义类型安全的数据结构,而无须使用实际的数据类型。这能够显著提高性能并得到更高质量的代码,因为您可以重用数据处理算法,而无须复制类型特定的代码。 考虑一种普通的、提供传统Push方法的数据结构。在开发通用堆栈时,您可能愿意使用它来存储各种类型的实例。您可以使用基于 Object 的堆栈,这意味着,在该堆栈中使用的内部数据类型是难以归类的 Object,并且堆栈方法与 Object 交互:

目录:

前言

接着上一篇Mybatis入门继续,上一篇主要演示了Mybatis的基本操作,对数据库的增删改查,但是在实际项目中用到的Mybatis知识点要远多于这些基本操作,这篇将演示一些Mybatis的更加常用的用法。

简书 賈小強转载请注明原创出处,谢谢!

public class Stack { Object[] mItems; public void push(Object item){...} public Object pop(){...}}
  • 1.查看工作区和版本库里面最新版本的区别
  • 2.让这个文件回到最近一次git commitgit add时的状态。
  • 3.把git add暂存区的修改撤销掉,重新放回工作区
  • 4.查看从近到远的提交日志
  • 5.查看从近到远的提交日志只显示版本号
  • 6.回退到上一次 git commit的版本
  • 7.查询自己的每一次命令并显示版本号
  • 8.删除一个文件
  • 9.克隆的两种地址

知识点汇总

新建项目,基本环境都如上篇,Maven的pom.xml中添加jUnit依赖。

Mapper.xml的Insert节点添加useGeneratedKeys,keyProperty即可。

KeyProperty:(仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。

UseGeneratedKeys:仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。

在Mybaitis 入门教程的项目, Mapper.xml文件中修改内容为下:

 <insert parameterType="Blog" keyProperty="id" useGeneratedKeys="true" > INSERT INTO Blog  VALUES (#{id},#{title}) </insert>

此时数据库内容:

小鱼儿玄机30码 1程序运行前数据库内容

测试程序:

 @Test public void test1(){ InputStream inputStream = null; SqlSession sqlSession = null; try { inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory mSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); sqlSession = mSqlSessionFactory.openSession(); Blog blog = new Blog; sqlSession.insert("me.aihe.dao.BlogMapper.insertBlog",blog); // 检测是否将插入数据的主键返回 System.out.println(blog.getId; sqlSession.commit(); } catch (IOException e) { e.printStackTrace(); } finally { if (sqlSession != null) { sqlSession.close(); } } }

运行结果

小鱼儿玄机30码 2运行结果小鱼儿玄机30码 3运行程序之后数据库内容

注意:还有一种实现方式是在insert内部添加<SelectKey>节点,这里就不再演示。

在Mapper.xml文件中,SQL语句里我们可以传入对象,或传入其它参数。当我们以如下方式传递参数时:

 // 这是在UserMapp.java文件 int insertByParam(int id,String name, String email); //UserMapper.xml文件中 <insert > INSERT INTO User (id,name,email) VALUE (#{id},#{name},#{email}) </insert>

测试程序如下:

@Test public void test2(){ InputStream inputStream = null; SqlSession sqlSession = null; try { inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory mSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); sqlSession = mSqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); userMapper.insertByParam(2,"Gao","gao@gmail.com"); sqlSession.commit(); } catch (IOException e) { e.printStackTrace(); } finally { if (sqlSession != null) { sqlSession.close(); } } }

这个时候程序运行会出现如下错误,提示我们找不到参数。

### Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg2, arg1, arg0, param3, param1, param2]

Servlet是一种允许响应请求的Java类。虽然Servlet可以响应任何类型的请求,但它们通常被用来响应网络请求。一个Servlet必须部署在Java servlet容器中,它才能成为可用的。虽然许多开发者利用Servlet框架如小鱼儿玄机30码,Java Server PagesJava Server Faces ,但实际上这两种技术通过servlet容器在幕后将页面编译为Java servlet。也就是说,Java servlet技术的基本知识对任何Java web开发都很有用。

上述容器可按下述方式使用:

.

解决方法:四种任选其一
  • 修改UserMapp.java文件添加@Param注解,即可
int insertByParam(@Param int id,@Param String name, @Param String email);
  • 修改UserMapper.xml文件,修改为param*类型如下
 <insert > INSERT INTO User (id,name,email) VALUE (#{param1},#{param2}, #{param3}) </insert>
  • 将参数换为对象,如下
// UserMapper.java修改为如下 int insertByPoDo(User user);//UserMapper.java修改为下 <insert parameterType="User" > INSERT INTO User (name,email) VALUE (#{name},#{email}) </insert>//Test文件修改为如下 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = new User("leishen","Rxlen@126.com"); userMapper.insertByPoDo;
  • 将参数转为Map对象。
 int insertByMap(Map<String,Object> map);//xml <insert > INSERT INTO User (name,email) VALUE (#{name},#{email}) </insert>//Test UserMapper userMapper = sqlSession.getMapper(UserMapper.class); HashMap<String,Object> map = new HashMap<String, Object>(); map.put("name","test"); map.put("email","test@qq.com"); userMapper.insertByMap; sqlSession.commit();

一般来说,模型与业务相关传入POJO对象,与业务无关就传入Map对象。注意:关于参数封装原理部分请查看MapperMethod.java,ParamNameResolve.java

默认情况下,使用#{}格式的语法会导致 MyBatis 创建预处理语句属性并安全地设置值。这样做更安全,更迅速,通常也是首选做法,不过有时你只是想直接在 SQL 语句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:

ORDER BY ${columnName}

这里 MyBatis 不会修改或转义字符串。注意:** 以这种方式接受从用户输出的内容并提供给语句中不变的字符串是不安全的,会导致潜在的 SQL 注入攻击,因此要么不允许用户输入这些字段,要么自行转义并检验。**

$是字符串替换,#会进行预编译

// UserMapper接口 List<User> getUserByEmail(@Param String email);// UserMaper.xml <select resultType="me.aihe.dao.User"> SELECT * FROM User WHERE email LIKE #{email} </select>//测试文件 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> result = userMapper.getUserByEmail; System.out.println;

最终输出内容

小鱼儿玄机30码 4获取列表数据结果

//UserMapeer接口文件 Map<String,Object> getUserMapById(@Param Integer id);//UserMapper.xml文件 <select resultType="java.util.Map"> SELECT * FROM User WHERE id = #{id} </select>//测试程序 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); Map result = userMapper.getUserMapById; System.out.println;

测试输出结果

小鱼儿玄机30码 5获取Map数据结果

这个和获取列表很类似了,只不过把数组都封装到一个Map中去了

// UserMapper接口文件 @MapKey Map<Integer,User> getUserMapLikeemail(@Param String email);// UserMapper.xml文件 <select resultType="java.util.Map"> SELECT * FROM User WHERE id = #{id} </select>// 测试文件 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); Map result = userMapper.getUserMapLikeemail; System.out.println;

程序输出

小鱼儿玄机30码 6获取Map映射的多组数据

**注意: 注解@MapKey指定的是以数据库表中的那一列作为Map结果的key。

// UserMapper接口 User getUserMapByIdThroughResultMap(@Param Integer id);// UserMapper.xml文件 //Id标识的是查询结果中的主键是那一列,对应的User属性是什么 <resultMap type="User"> <id column="id" property="id" /> <result property="email" column="email" /> <result property="name" column="name" /> </resultMap> <select resultMap="MyResultMap"> SELECT * FROM User WHERE id = #{id} </select>//测试文件 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.getUserMapByIdThroughResultMap; System.out.println;

输出结果

小鱼儿玄机30码 7ResultMap映射结果数据

在本教程中,我们将涵盖以下主题,从而获得Java servlet技术的整体认识。

 Stack stack = new Stack(); stack.push; stack.push; int number = stack.pop();
1.查看工作区和版本库里面最新版本的区别

总结

本文主要讲解了几个Mybatis日常使用中经常用到的几个知识点,获取主键,参数映射,及$与#符号的区别,最后演示一些各种获取数据库中结果的方式。

目录

基于Object 的解决方案存在两个问题:

  • git diff HEAD -- 文件名.后缀

参考

Mybatis 官方文档Mybatis 视频教程

  • 编写第一个Servlet
  • Servlet的生命周期方法
  • 使用@WebServlet注解开发Servlet
  • 打包并部署Servlet到Tomcat服务器
  • Servlet响应中写入动态内容
  • Servlet接受参数处理并响应
  • 监听Servlet容器事件
  • Servlet传入初始化参数
  • 给指定的请求增加Servlet过滤器
  • Servlet下载二进制文件
  • 用RequestDispatcher.forward()将请求内部转发到另一个Servlet
  • 用HttpServletResponse.sendRedirect()将请求重定向到另一个Servlet
  • Servlet读写cookie
  • 让我们开始一步一步学习Servlet
  • 第一个问题是性能。在使用值类型时,必须boxing & unboxing。装箱和取消装箱都会根据它们自己的权限造成重大的性能损失,但是它还会增加托管堆上的压力,导致更多的垃圾收集工作,而这对于性能而言也不太好。即使是在使用引用类型而不是值类型时,仍然存在性能损失,这是因为必须从 Object 向您要与之交互的实际类型进行强制类型转换,从而造成强制类型转换开销。
  • 第二个问题是类型安全。因为编译器允许在任何类型和 Object 之间进行强制类型转换,所以您将丢失编译时类型安全。例如,以下代码可以正确编译,但是在运行时将引发无效强制类型转换异常:

例如: git diff HEAD -- huan.txt

编写第一个Servlet

下面是一个非常简单的Servlet,实际上你需要写的代码代码非常少

package com.bill.servlets; import java.io.IOException;import java.io.PrintWriter; import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; public class MyFirstServlet extends HttpServlet { private static final long serialVersionUID = -1915463532411657451L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { // Write some content out.println("<html>"); out.println("<head>"); out.println("<title>MyFirstServlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h2>Servlet MyFirstServlet at "   request.getContextPath()   "</h2>"); out.println("</body>"); out.println("</html>"); } finally { out.close(); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Do some other work } @Override public String getServletInfo() { return "MyFirstServlet"; }}

用一个web.xml文件将上面的MyFirstServlet注册在web容器中。

<?xml version="1.0"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/Javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <welcome-file-list> <welcome-file>/MyFirstServlet</welcome-file> </welcome-file-list> <servlet> <servlet-name>MyFirstServlet</servlet-name> <servlet-class>com.bill.servlets.MyFirstServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyFirstServlet</servlet-name> <url-pattern>/MyFirstServlet</url-pattern> </servlet-mapping> </web-app>

你可能想知道上面MyFirstServlet的完成了哪些重要的事情。

  1. MyFirstServlet继承自HttpServlet。这是强制性的,因为所有的Servlet必须继承javax.servlet.GenericServletjavax.servlet.http. HttpServlet
  2. 重写了doGet方法。这些方法定义在HttpServlet类中。每当GET或POST请求到来时,它被映射到其各自对应的方法(例如,如果您发送一个 HTTP GET请求,然后servlet的doGet()方法被调用。
  3. 还有一些你可以重写的其他方法,被用来控制应用程序,比如getServletInfo()。
  4. HttpServletRequestHttpServletResponse是doxxx()方的默认参数类型。我们将在以后的章节中更多地了解这两种类型对应的对象。

这就是了解一个简单Servlet需要知道的的全部内容。

pc@NSUS-V505L MINGW64 ~/Desktop/git/CCCC-GBLT $ git diff HEAD -- huan.txtdiff --git a/huan.txt b/huan.txtindex f129554..5dd4709 100644--- a/huan.txt    b/huan.txt@@ -1  1 @@-12121212 No newline at end of file 12121212asdfasfa No newline at end of file

Servlet的生命周期方法

在应用程序中,每当加载并使用Servlet时会发生一系列事件,如初始化和销毁。这些被称为Servlet的生命周期事件。让我们多了解一些关于它们的故事。

init(),service(),和destroy()是三个在Servlet的生命周期中至关重要的方法。它们由每个Servlet实现,并在特定时间被调用。

1)在Servlet生命周期的初始阶段,web容器通过调用init()方法初始化Servlet实例,同时传入一个实现javax.servlet.ServletConfig接口的对象。这个配置对象允许Servlet访问在web.xml文件中定义的键值对值初始化参数。这只在Servlet实例的生命周期中调用一次。init方法定义如下所示:

public void init() throws ServletException { //custom initialization code}

2)在初始化之后,Servlet实例可以为客户请求提供服务。web容器调用Servlet的service()方法处理每个请求。service方法判断请求的种类或者将请求转发到哪个方法里处理更加合适。Servlet的开发人员必须为这些方法提供一个实现。如果Servlet未实现这个方法,那么请求将调用父类的方法处理,通常会给请求者导致返回一个错误。

几乎没有必要重写此方法。

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{String method = req.getMethod(); if (method.equals(METHOD_GET)) { long lastModified = getLastModified; if (lastModified == -1) { // servlet doesn't support if-modified-since, no reason // to go through further expensive logic doGet(req, resp); } else { long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE); if (ifModifiedSince < (lastModified / 1000 * 1000)) { // If the servlet mod time is later, call doGet() // Round down to the nearest second for a proper compare // A ifModifiedSince of -1 will always be less maybeSetLastModified(resp, lastModified); doGet(req, resp); } else { resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } } } else if (method.equals(METHOD_HEAD)) { long lastModified = getLastModified; maybeSetLastModified(resp, lastModified); doHead(req, resp); } else if (method.equals(METHOD_POST)) { doPost(req, resp); } else if (method.equals(METHOD_PUT)) { doPut(req, resp); } else if (method.equals(METHOD_DELETE)) { doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) { doOptions; } else if (method.equals(METHOD_TRACE)) { doTrace; } else { // // Note that this means NO servlet supports whatever // method was requested, anywhere on this server. // String errMsg = lStrings.getString("http.method_not_implemented"); Object[] errArgs = new Object[1]; errArgs[0] = method; errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);}}

3)最后,web容器调用destroy()方法终止Servlet的服务。如果希望在Servlet不可用之前关闭或销毁某些文件系统或网络资源,则应该调用此方法。destory()方法和init()方法一样在Servlet整个生命周期中只被调用一次。

public void destroy() { //}

通常情况下,你不需要重写Servlet的这些方法。

 Stack stack = new Stack(); stack.push; //可以通过编译,但不是类型安全的,将会抛出异常; String number = stack.pop();
2.让这个文件回到最近一次git commitgit add时的状态。

使用@WebServlet注解开发servlet

如果你不是很喜欢xml配置,而特别喜欢注释, Servlets API也有这样的功能。您可以使用@WebServlet ,如下的例子,那么你不需要在web.xml中做任何事情。在运行时会自动将Servlet注册到容器,并像往常一样处理它。

package com.bill.servlets; import java.io.IOException;import java.io.PrintWriter; import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; @WebServlet(name = "MyFirstServlet", urlPatterns = {"/MyFirstServlet"})public class MyFirstServlet extends HttpServlet { private static final long serialVersionUID = -1915463532411657451L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Do some work } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Do some other work }}
  • 第三个问题您可以通过提供类型特定的高性能堆栈来克服上述两个问题。对于整型,可以实现并使用 **IntStack。对于字符串,可以实现 StringStack。遗憾的是,以这种方式解决性能和类型安全问题,会引起第三个同样严重的问题 — 影响工作效率。编写类型特定的数据结构是一项乏味的、重复性的且易于出错的任务。在修复该数据结构中的缺陷时,您不能只在一个位置修复该缺陷,而必须在实质上是同一数据结构的类型特定的副本所出现的每个位置进行修复。此外,没有办法预知未知的或尚未定义的将来类型的使用情况,因此还必须保持基于 Object 的数据结构。既不能用Object,又想避免使用具体类型所带来的重复修改,我们需要泛型。
  • git checkout -- 文件名.后缀

打包并部署servlet到Tomcat服务器

如果您使用的是任何IDE,那么打包和部署应用程序非常简单。右键单击项目> Run As > Run As Server。如果尚未完成,就配置服务器,然后就完成了。如果您不使用任何IDE,那么您需要做一些额外的工作,例如从命令提示符编译应用程序,使用Ant创建WAR文件等,但我确信现在每个人都使用一些IDE进行开发,所以我不会在这里浪费更多的时间。当您在Tomcat中部署完我们写的第一个Servlet,然后在浏览器地址栏输入

小鱼儿玄机30码 8

我们首先写一个最简单的泛型类来说明:

小鱼儿玄机30码 9

在Servlet响应中写入动态内容

Servlet之所以非常用用的原因是它允许给网页内容动态的加入一些内容。内容可以从服务器本身、数据库、另一个web站点或许多其他可访问的web资源。Servlet不是静态的网页,他们是动态的,这是它们最关键的地方。

让我们以Servlet为例,它负责向用户显示当前日期和时间,以及他的名字和一些自定义消息,代码如下。

package com.bill.servlets; import java.io.IOException;import java.io.PrintWriter;import java.util.Date;import java.util.HashMap;import java.util.Map; import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; @WebServlet(name = "CalendarServlet", urlPatterns = {"/CalendarServlet"})public class CalendarServlet extends HttpServlet { private static final long serialVersionUID = -1915463532411657451L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Map<String,String> data = getData(); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { // Write some content out.println("<html>"); out.println("<head>"); out.println("<title>CalendarServlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h2>Hello "   data.get("username")   ", "   data.get("message")   "</h2>"); out.println("<h2>The time right now is : "   new Date()   "</h2>"); out.println("</body>"); out.println("</html>"); } finally { out.close(); } } //This method will access some external system as database to get user name, and his personalized message private Map<String, String> getData() { Map<String, String> data = new HashMap<String, String>(); data.put("username", "Guest"); data.put("message", "Welcome to my world !!"); return data; }}

当你在Tomcat中运行上面的Servlet,然后在浏览器中请求

小鱼儿玄机30码 10

public class Generics<T> { //T是type的简称,可以使用任何名称代替 private T o; //泛型成员变量 public Generics{ this.o=o; } public T getObject() { return o; } public void setObject { this.o = o; } public String getType() { return o.getClass().getName(); } } 
3.把git add暂存区的修改撤销掉,重新放回工作区

Servlet接受参数处理并响应

Servlet可以很容易地创建web应用程序,给用户的请求返回响应。它们能够提供HTTP响应,并在同一代码体中处理业务逻辑。用于处理业务逻辑的能力使Servlet比标准的HTML代码更强大。

在实际应用程序中,HTML Web表单包含发送给Servlet的参数。然后servlet以某种方式处理这些参数,并给客户端返回一个响应。在一个HttpServlet对象的情况下,客户端是一个web浏览器,响应是一个网页。表单的action属性标签指定了谁来处理表单中所包含的参数。

调用HttpServletRequest对象的getparameter()方法获取请求参数,通过id获得你想得到的参数。

String value1 = req.getParameter;String value1 = req.getParameter;

一旦获得这些值,就可以根据需要进行处理。然后为客户机返回响应,正如我们在以上章节中讨论的那样,用HttpServletResponse类型的对象给客户端返回响应。

一个基本的请求-处理-响应的流程如下:

@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String username = request.getParameter("username"); String password = request.getParameter("password"); boolean success = validateUser(username, password); try { // Write some content out.println("<html>"); out.println("<head>"); out.println("<title>LoginServlet</title>"); out.println("</head>"); out.println("<body>"); if { out.println("<h2>Welcome Friend</h2>"); }else{ out.println("<h2>Validate your self again.</h2>"); } out.println("</body>"); out.println("</html>"); } finally { out.close(); }}

你需要从HttpServletResponse对象获得PrintWriter对象,给客户端返回内容。任何写入它的内容将被写入OutputStream,然后数据将被发送回客户端。

本文由小鱼儿玄机30码发布于编程,转载请注明出处:删除工作区的内容,Mapper.xml文件中修改内容为下

关键词: 小鱼儿玄机30码