纯html的Ajax:

使用了SpringMVC框架的纯html的Ajax:
增删改查
使用Ajax的目的就是不想使用jsp的任何东西。至于是不是增删改查四个全用Ajax,实际上并不重要。纯html使用Ajax最重要的地方就在于全查,得到所有数据后会在Ajax的回调函数中使用JQuery中的each来遍历,这样就可以替代在jsp页面中可以使用标签遍历的优势了。

这是一个html页面。不是jsp页面。

在这里插入代码片
<!DOCTYPE html>
<html>
<head>

<meta charset="UTF-8">
 
<script src="/My_SpringMVC-181122/js/jquery-3.2.1.min.js"></script> 
 

<title>SpringMVC框架中的纯html的Ajax增删改查</title>

 
 
</head>
<body>

          <section>
			          <form action="/My_SpringMVC-181122/createAllUser" method="post"   id="form1"> 
			          			<input type="text" name="username"/>姓名
			          			<input type="text" name="userage"/> 年龄
			          			<input type="radio" name="usergender" value="男" checked="checked"/>男
			  					<input type="radio" name="usergender" value="女"/>女
			          <button type="button" id="btn2">添加</button>
			          <button form="form2"   type="submit"  id="btn3">批量删除</button>
					  </form>
          </section>
         
         
          <section>
    	  			<form id="form2"  method="post"  action="/My_SpringMVC-181122/deleteUsers">
    	  			          <input type="hidden" id="hid01" name="user_id"/>
					          <table border="1">
					                  <thead>
					                  			<tr>
					                  					<th><input type="checkbox"  /></th><th>姓名</th><th>年龄</th><th>性别</th><th>操作</th>
					                  			</tr>
					                  </thead>
					                  <tbody  id="tbodyId">
					                  </tbody>
					          </table>
					</form>
		   </section>
		
		
</body>


<script>
				function update01(oA  ,  user_id){  //直接在当前页面上 进行修改
					$("#hid01").val(user_id);
					var oTd2 = $(oA).parent().parent().children().eq(1);
					var oTd3 = $(oA).parent().parent().children().eq(2);
					var oTd4 = $(oA).parent().parent().children().eq(3);
					var oTd5 = $(oA).parent().parent().children().eq(4);
					oTd2.html("<input type='text' name='username' class='ipt1' value='"+oTd2.text()+"'/>");
					oTd3.html("<input type='text' name='userage' class='ipt1' value='"+oTd3.text()+"'/>");
					if(oTd4.text() == "男")
						oTd4.html("<input type='radio' name='usergender' value='男' checked='checked'/>男&nbsp;<input type='radio' name='usergender' value='女'/>女");
					else
						oTd4.html("<input type='radio' name='usergender' value='男'/>男&nbsp;<input type='radio' name='usergender' value='女' checked='checked'/>女");
					oTd5.html("<a href='javascript:;' onclick='update02();'>确定</a>");
					
				}
				function update02(){    //配合上面的修改方法一起用的
					var oForm = $("#form2");
					oForm.attr("action","/My_SpringMVC-181122/updateUser");
					oForm.submit();
				}

</script>



<script>
       $(function(){//JQuery形式 的页面加载函数
    	    	$.ajax({//当这个页面一加载就会执行这个全查的Ajax
    				url:"/My_SpringMVC-181122/retrieveAllUser",
    				type:"post",
    				success:function(returnValue){//我使用了springMVC框架所支持的json的方式,非常方便
    					    console.log(returnValue);//在浏览器的控制台上输出。可按下F12查看
    						$.each(returnValue,function(i,v){
    								var oTbody=$("#tbodyId");
    								var oTd0=$("<td><input type='checkbox' name='ids' id='selected-all' value='"+v.user_id+"'></td>");
 		  							var oTd1=$("<td>"+v.username+"</td>");
 		  							var oTd2=$("<td>"+v.userage+"</td>");
 		  							var oTd3=$("<td>"+v.usergender+"</td>");
 		  							var oTd4=$('<td><a href="javascript:;" onclick="update01(this,'+(v.user_id)+')" >编辑</a></td>');
 		  							var oTr2=$("<tr></tr>");
 		  							oTd0.appendTo(oTr2);   //把各列添加到一行中
 		  							oTd1.appendTo(oTr2);
 		  							oTd2.appendTo(oTr2);
 		  							oTd3.appendTo(oTr2);
 		  							oTd4.appendTo(oTr2);
 		  							oTr2.appendTo(oTbody);
 		  							
    						});
    				}
    	    });
       
    	     
    	    	
       
          $("#btn2").click(function(){    //为添加按钮挂上事件
        	    $("#form1").submit();
          });
       });

</script>

</html>


在这里插入图片描述

下面的是实体类
package com.oracle.pojo;

import java.io.Serializable;

@SuppressWarnings("serial")
public class UserPojo implements Serializable {
	private Integer user_id;
	private String username;
	private Integer  userage;
	private String usergender;
	public Integer getUser_id() {
		return user_id;
	}
	public void setUser_id(Integer user_id) {
		this.user_id = user_id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public Integer getUserage() {
		return userage;
	}
	public void setUserage(Integer userage) {
		this.userage = userage;
	}
	public String getUsergender() {
		return usergender;
	}
	public void setUsergender(String usergender) {
		this.usergender = usergender;
	}
	public UserPojo() {
		super();
		// TODO Auto-generated constructor stub
	}
	public UserPojo(Integer user_id, String username, Integer userage, String usergender) {
		super();
		this.user_id = user_id;
		this.username = username;
		this.userage = userage;
		this.usergender = usergender;
	}
	@Override
	public String toString() {
		return "UserPojo [user_id=" + user_id + ", username=" + username + ", userage=" + userage + ", usergender="
				+ usergender + "]";
	}
	 
}

使用SpringMVC的框架所需要配置的配置文件:(放在资源文件夹下)
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">


                	<!-- 包扫描:让com.oracle.controller和其子包中的所有被-->
				<!-- @Controller、@Service、@Repository和@Component注解标注的类都被spring管理起来-->
				<!-- 即我们只需要在类上做标记,而不需要为这些类再配置<bean>了-->
				
               <context:component-scan base-package="com.oracle.controller" />
				<context:component-scan base-package="com.oracle.service.impl" />
				<context:component-scan base-package="com.oracle.dao.impl" />




				<!-- 设置注解驱动 -->
				<mvc:annotation-driven  />

			 

				<!-- 视图解析器负责把handler方法返回值解析为实际的物理视图-->
				<!-- 视图解析器使用SpringMVC框架默认的InternalResourceViewResolver-->
				<!-- 这个视图解析器支持JSP视图解析 -->
				<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
										<!-- 配置 逻辑视图路径 的前缀和后缀,当然也可以不配置 -->
										<!--<property name="prefix" value="/WEB-INF/jsp/" />-->
										<!--<property name="suffix" value=".jsp" />-->
				</bean>
				
 
</beans>

dao层代码如下:

package com.oracle.dao.impl;

import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Repository;

import com.joe.jdbc.JDBC;
import com.joe.jdbc.JDBCFactory;
import com.oracle.dao.CRUDDao;
@Repository
public class CRUDDaoImpl implements CRUDDao {

	private JDBC jdbc=JDBCFactory.getJDBC();//这个JDBC类是我自己封装的jar包中的
	 
	@Override
	public List<Map<String, Object>> retrieveAllUser() {
		String sql = "select  user_id,username,userage,usergender "
				+ "from t_user";
		return jdbc.retrieveAll(sql);
	}
	@Override
	public void createAllUser(String username, Integer userage, String usergender) {
		String sql = "insert into t_user (username,userage,usergender) values (?,?,?)";
		jdbc.doDML(sql,username,userage,usergender);
	}
	@Override
	public void deleteUsers(String[] ids) {
		String sql = "delete from t_user where user_id=?";
		jdbc.doDelete(sql,ids);
	}
	@Override
	public void updateUser(String username, Integer userage, String usergender,
			Integer user_id) {
		String sql ="update t_user set username=? , userage=?,usergender=? where user_id=?";
		jdbc.doDML(sql, username,userage,usergender,user_id);
	}
}

Service层代码如下:

package com.oracle.service.impl;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.oracle.dao.CRUDDao;
import com.oracle.dao.impl.CRUDDaoImpl;
import com.oracle.pojo.UserPojo;
import com.oracle.service.CRUDService;
@Service 
public class CRUDServiceImpl implements CRUDService {

	 @Autowired
	private CRUDDao dao;//=new CRUDDaoImpl(); 
	 
	@Override
	public List<Map<String, Object>> retrieveAllUser() {
		return dao.retrieveAllUser();
	}
	@Override
	public void createAllUser(UserPojo user) {
		String username = user.getUsername();
		String usergender = user.getUsergender();
		Integer userage = user.getUserage();System.out.println("-------"+userage);
		dao.createAllUser(username, userage, usergender);
	}
	@Override
	public void deleteUsers(String[] ids) {
		dao.deleteUsers(ids);
	}
	@Override
	public void updateUser(UserPojo user) {
		Integer user_id = user.getUser_id();
		String username = user.getUsername();
		Integer userage = user.getUserage();
		String usergender = user.getUsergender();
		dao.updateUser(username,userage,usergender,user_id);
	}
}

控制层代码如下:(实际上也就是Servlet层。不过因为使用了SpringMVC框架,所以就叫控制层)

package com.oracle.controller;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.oracle.pojo.FenyePojo;
import com.oracle.pojo.UserPojo;
import com.oracle.service.CRUDService;

@Controller
public class CRUDController {

	@Autowired
	private CRUDService cRUDService;
	
	private FenyePojo fenye;
	
	@ResponseBody
	@RequestMapping(value="/retrieveAllUser")
	public List<Map<String,Object>> retrieve(Integer [] q) {
		if(fenye==null){
			fenye=new FenyePojo();
		}
		List<Map<String,Object>> userList=cRUDService.retrieveAllUser();
		return userList;
	}
	
	@RequestMapping(value="/createAllUser")
	public String  create(UserPojo user) {
	     cRUDService.createAllUser(user);
	     return "/html/Ajax.html";
	}
	
	@RequestMapping(value="/updateUser")
	public String  updateUser(UserPojo user) {
	     cRUDService.updateUser(user);
	     return "/html/Ajax.html";
	}
	
 	
	@RequestMapping(value="/deleteUsers")
	public String delete(String [] ids) {
	     cRUDService.deleteUsers(ids);
	     return "/html/Ajax.html";
	}
	
	
	
	
}

到此为止,就只差一个我自己封装的JDBC的jar包了。但是这里不能够导进来,所以我就直接把该jar包中的四个类以及一个配置文件写在这里:

这是DataSource.java源程序文件:如下

package com.oracle.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
//这个DataSource类只负责获取连接和关闭连接。
public class DataSource {

	 
	
	
	//连接池:在类加载的时候就提前创建好10个连接,如果需要就从池中拿一个,关闭的时候,再还回来。(相当于从来一个单进一次货 变为 进一堆货)
	private static List<Connection > pool=new ArrayList<>(); 
	
	private static String driver=null;    
	private static String url=null;
	private static String username=null;
	private static String password=null;
	private static  int size=0;
	// 静态块:只执行一次: static{}:静态块中只能访问静态属性和静态方法
	static{
			// 需要在Java代码中绑定资源文件.properties文件。(注意:下面的括号里不需要加.properties文件后缀名,因为一旦调用这个绑定方法,就必定是.properties文件)
		ResourceBundle bundle=PropertyResourceBundle.getBundle("DataSource");    //而且这个路径中也不需要写res这个路径.(因为res和src一样都是资源文件夹)
		// 从资源文件中获取,取key
		driver=bundle.getString("driver");
		url=bundle.getString("url");
		username=bundle.getString("username");
		password=bundle.getString("password");
		size=Integer.parseInt(bundle.getString("size"));
		try{
			 
			Class.forName(driver);
			for(int i=0;i<size;i++){
				Connection con =DriverManager.getConnection(url,username,password);
				pool.add(con);
			}
		}
		catch(ClassNotFoundException e){ e.printStackTrace(); } 
		catch (SQLException e) {e.printStackTrace();}
	}
	
	public synchronized Connection getConnection(){
		Connection con=null;
		try{//从池中拿一个返回去
			if(pool.isEmpty()){
				con =DriverManager.getConnection(url,username,password);
			}else{
				//从池中移出一个,并返回给你
				//get从池中拿出给你看一眼
				con=pool.remove(0);
			}
		}
		catch(SQLException e){e.printStackTrace();	}
		return con;
	}

	public void closed(ResultSet resultset, Statement pstm,
			Connection con) {
		 try{
			 if(resultset!=null) resultset.close();
		 }catch(SQLException e){
			 e.printStackTrace();
		 }finally{
			 try{
				 if(pstm!=null) pstm.close();
			 }catch(SQLException e){
				 e.printStackTrace();
			 }finally{
			     try{
			    	 if(con!=null){
						 if(pool.size()<size){  //判断池有没有满
							 pool.add(con);
						 }else{
							 con.close();
						 }
			    	 }
				 }catch(SQLException e){
					 e.printStackTrace();
				 } 
			 }
		 }
	}

	public void closed(Statement stmt, Connection con) { //让用户体验更好
		 closed(null,stmt,con);
	}
	
	
}

这是DataSourceFactory.java源程序文件:如下

package com.oracle.jdbc;


public class DataSourceFactory {

	public static DataSource getDataSource(){
		return new DataSource();
	}
}

这是JDBC.java源程序文件:如下

package com.oracle.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

//JDBC这个类负责增删改查
public class JDBC {
    /**全查询*/
	public List<Map<String, Object>> retrieveAll(String sql, Object... params) {
		//得到DataSource
		//得到connection
	    //使用connection造船
	    //得到船Statement(PreparedStatement是其子接口)
	    //将sql与船绑定
	    //发船到数据库,船回来了 带了一个ResultSet回来
	     
	    DataSource source=DataSourceFactory.getDataSource();
	    Connection con=source.getConnection();
	    List<Map<String,Object>> list=null;
	    PreparedStatement pstm=null;
	    ResultSet resultset=null;
	    try {
			pstm=con.prepareStatement(sql);
			for(int i=0;i<params.length;i++){
				// setObject(p1,p2);
				// p1:往哪个位置上放(个数)
				// p2:放的是什么
				pstm.setObject(i+1, params[i]);
			}
			resultset=pstm.executeQuery();
			
			// 一行一行的循环
			// 元数据(列名,列数,约束.相当于标题):从ResultSet中直接取不出来
			// ResultSetMetaData 是结果集中的元数据
			ResultSetMetaData metadata=resultset.getMetaData();
			list=new ArrayList<Map<String,Object>>();
			while(resultset.next()){
				Map<String ,Object > map=new HashMap<>();
				//遍历每一列
				for(int i=1,j=metadata.getColumnCount();i<=j;i++){    //数据库中的都是从1开始的
					String key=metadata.getColumnName(i);
					String value=resultset.getString(i);
					map.put(key,value);
				}
				 list.add(map);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			//关闭资源
			//后开的先关 resultSet --> statement  --> connection
			source.closed(resultset,pstm,con);
		}
	return list;
}

	/**单查询*/
	public Map<String,Object>  retrieveOne(String sql,Object ...params){
		List<Map<String,Object>>  list=retrieveAll(sql,params);
		Map<String,Object> map=null;
		if(list.size()!=0){
			map=list.get(0);
		}
		return map;
	}
	
	
	/**
	 * DQL 数据查询语言 select
	 * DML 数据操作语言 增删改 update set/ delete from/ insert into
	 * DCL 数据控制语言 grant revoke
	 * DDL 数据定义语言 alter
	 * */
    public int doDML(String sql,Object... params){  //增删改
    	DataSource source=DataSourceFactory.getDataSource();
 	    Connection con=source.getConnection();
 	    List<Map<String,Object>> list=null;
 	    PreparedStatement pstm=null;
 	    int result=-1;
 	    try {
 			pstm=con.prepareStatement(sql);
 			for(int i=0;i<params.length;i++){
 				pstm.setObject(i+1, params[i]);
 			}
 			result=pstm.executeUpdate();   //若操作成功,返回受影响行数
 	    }catch(SQLException e){
 	    	e.printStackTrace();
 	    }finally{
 	    	source.closed(pstm, con);
 	    }
    	return result;
    }

    /**
	 * 事务保护
	 * 对于查询来说不需要保护,对于批量DML操作来说需要进行事物保护
	 * 要么都成功,要么都失败- 保证数据库操作的原子性
	 * 	我们的操作是:暂时关闭它的自动提交功能。(如果是只有一条sql语句的话,一写完他就会自动提交的)
	 * update t_user userage = 0 where username = '谢大脚'
	 * update t_user userage = 18 where username = '赵四'
	 * commit();// 手动提交它
	 * 在catch中 rollback();// 手动回滚它
	 * finally中,把人家的自动提交功能再恢复
	 * 事物操作:提交、回滚
	 * */
    /**
     * 此方法用于不同类型的sql语句进行批量操作
     * */
    public int[] doBatch(List<String> sqls){
    	DataSource source=new DataSource();
    	Connection con=source.getConnection();
    	// PreparedStatement 处理问号的专用船
    	// Statement 不能处理问号
    	Statement stmt=null;
    	int [] result=null;
		try { 
			con.setAutoCommit(false);   //暂时先关闭自动提交功能 
			stmt = con.createStatement();
			//将船与各条sql语句绑定
	    	for(String sql: sqls){
	    		stmt.addBatch(sql);
	    	}
	    	//发动船驶向数据库
	    	result=stmt.executeBatch();    //因为有多条语句,所以每一条都有一个返回值。就构成数组
	    	con.commit();    //手动提交
		} catch (SQLException e) {
			e.printStackTrace();
			try {//如果出现异常可以进行回滚
				con.rollback();
			} catch (SQLException e1) {//回滚也可能出现异常,比如断电
				e1.printStackTrace();
			}
		}finally{
			//关闭资源
			try {
				con.setAutoCommit(true); //把人家的自动提交功能再恢复
			} catch (SQLException e) {
				e.printStackTrace();
			}
			source.closed(stmt, con);
		}
    	return result;
    }
    
    
    /**
     * 此方法用于相同类型的sql语句进行批量操作.(比如都是delete的sql语句)
     * paramList:用来存所有的 参数。每条sql语句的要用到的参数都是分别用一个Object数组存储的。把每个数组都存在集合中
     * */
    public int[] doBatch(String sql,List<Object[]> paramList){
    	DataSource source=DataSourceFactory.getDataSource();
    	Connection con=source.getConnection();
    	int []result=null;
    	PreparedStatement pstm=null;
    	try {
    		 con.setAutoCommit(false);
    		//造船
			 pstm=con.prepareStatement(sql);
			 //将船与各条sql语句绑定
			 for(Object[] params:paramList){
				 for(int i=0,j=params.length;i<j;i++){  //为每一条sql语句都配置上其应用的参数
					 pstm.setObject(i+1, params[i]);
				 }
				 pstm.addBatch();    //让船与每一条sql语句都绑定
			 }
			 result=pstm.executeBatch();
			 con.commit();
		} catch (SQLException e) {
			e.printStackTrace();
			try {
				con.rollback();
			} catch (SQLException e1) { e1.printStackTrace(); }
		} finally{
			//关闭资源
			source.closed(pstm, con);
			try {
				con.setAutoCommit(true); //把人家的自动提交功能再恢复
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
    	return result;
    }
    
    
    /**相同类型的sql语句 进行批量删除操作。并设置了事务保护*/
    public int[] deleteBatch(String sql,String[] params){  //此方法只适用于一条sql语句中只有一个参数的操作
    	List<Object[]> list=new ArrayList<>();
    	for(String param:params){
    		Object [] object={param};
    		list.add(object);
    	}
    	return doBatch(sql,list);
    }
    
}

这是JDBCFactory.java源程序文件:如下

package com.oracle.jdbc;

public class JDBCFactory  {

	public static JDBC getJDBC(){
		return new JDBC();
	}
}

这个jdbc的jar包中除了这四个类之外,还有一个DataSource.properties配置文件,用来配置四大参数:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/你的数据库名称?characterEncoding=utf8
username=你的mysql登录账号
password=你的密码
size=10

有了这五样东西后,你可以将它们封装成jdbc的jar包,再将jar包导入上面的我写的那个使用了SpringMVC的项目中。注意:当你将它们封装成jar包后,那个DataSource.properties配置文件实际上就不能够使用了。因为每个封装成jar包的文件都变成了只读的。所以你需要在你导入这个jar包的项目中重新写一个一模一样的DataSource.properties配置文件。文件内容可到jar包中的DataSource.properties配置文件中复制出来。并将其中的数据库名称还有mysql登录的账号及密码改成你自己的。在这里插入图片描述

因为我创建的是一个Maven项目。(创建该项目的好处在于,你想要什么jar包,不需要自己去下,只需在该项目的某个地方进行搜索就行。当然了,前提是你要配置好Maven的各种环境,比如说搭好本地仓库啊等等)。我导入的包有这些:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43666859/article/details/84346884