MyUtil.setParams
自己实现将请求数据取出并存放到对应的实体对象,之前使用是tomcat提供的
D1
软件开发流程:
产品/项目定义
需求分析 功能定义 性能定义 安全定义。。。。。。
概要设计 软件结构 模块划分 模块之间关系。。。。。。
数据库设计:
详细设计:针对重要模块详细流程图 类图。。。。。。
编码:
测试:单元测试 集成测试 系统测试 验收测试
正式上线
先将mybatis模板代码运行起来(针对user表)
然后创建一张表func1(
fld1 int pk ,
fld2 varchar not null,
fld3 date/datetime )
利用mybatis代码模板,实现对表的增加即可
first 10:50
11:10 <50%
11:30 30%左右没完成
last 11:50
同一个工程中同时操作两张及以上表 user1/func1,只要能增加
实现对多个表操作,注意变化部分
mybatis框架配置文件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="com/dlj/resources/db.properties" />
<typeAliases>
<typeAlias type="com.dlj.model.User" alias="User"></typeAlias>
<typeAlias type="com.dlj.model.Func1" alias="Func1"></typeAlias>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/dlj/mapper/UserMapper.xml" />
<mapper resource="com/dlj/mapper/Func1Mapper.xml" />
</mappers>
</configuration>
不同表对应的实体类
package com.dlj.model;
/**
* @author karthy
*
*/
public class Func1 {
private Integer fld1;
private String fld2;
private Date fld2;
// 你可以使用String java.util.Date java.sql.Date只要做到对所有数据库都通用
。。。。。。。
}
不同表对应的映射配置文件
Func1Mapper.xml
<?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.dlj.mapper.Func1Mapper">
<select id="getFunc1ById" parameterType="int" resultType="Func1">
</select>
。。。。。。。。。。。。。
</mapper>
映射代码提炼
public interface MyMapper {
public void insert(Object obj);
public Object getById(Integer id);
public List<Object> getAll();
public void update(Object obj);
public void delete(Integer id);
}
public interface Func1Mapper extends MyMapper {
}
public interface UserMapper extends MyMapper{
}
数据库操作提炼
package com.dlj.dao;
import com.dlj.mapper.MyMapper;
import com.dlj.util.MyBatisDAOUtil;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
/**
* @author karthy
*
*/
public class MyDAO {
public void insert(Class cls,Object obj) {
SqlSession sqlSession = MyBatisDAOUtil.getSqlSessionFactory()
.openSession();
try {
MyMapper myMapper = (MyMapper) sqlSession.getMapper(cls);
myMapper.insert(obj);
sqlSession.commit();
} finally {
sqlSession.close();
}
}
public Object getById(Class cls,Integer id) {
SqlSession sqlSession = MyBatisDAOUtil.getSqlSessionFactory()
.openSession();
try {
MyMapper myMapper = (MyMapper) sqlSession.getMapper(cls);
return myMapper.getById(id);
} finally {
sqlSession.close();
}
}
public List<Object> getAll(Class cls) {
SqlSession sqlSession = MyBatisDAOUtil.getSqlSessionFactory()
.openSession();
List<Object> lst = null;
try {
MyMapper myMapper = (MyMapper) sqlSession.getMapper(cls);
lst = myMapper.getAll();
return lst;
} finally {
sqlSession.close();
}
}
public void update(Class cls,Object obj) {
SqlSession sqlSession = MyBatisDAOUtil.getSqlSessionFactory()
.openSession();
try {
MyMapper myMapper = (MyMapper) sqlSession.getMapper(cls);
myMapper.update(obj);
sqlSession.commit();
} finally {
sqlSession.close();
}
}
public void delete(Class cls,Integer id) {
SqlSession sqlSession = MyBatisDAOUtil.getSqlSessionFactory()
.openSession();
try {
MyMapper myMapper = (MyMapper) sqlSession.getMapper(cls);
myMapper.delete(id);
sqlSession.commit();
} finally {
sqlSession.close();
}
}
}
使用serlvet和mybatis实现对表func1增加删除修改查询
实现func1.action
@WebServlet(urlPatterns = "/func1.action")
public class Func1Action extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String op=req.getParameter("op");
PrintWriter out= resp.getWriter();
if(op==null) op="";
switch (op){
case "insert":
out.print("insert ......");
break;
case "check":
out.print("yes");
break;
default:
break;
}
}
运行程序访问增加界面,
点击增加能看到insert 。。。。。。
继续,οnkeyup="verify(this.value)"
实现verify能发现异步请求
function verify(fld1) {
$.ajax(
{
url:"func1.action?op=check&fld1="+fld1,
success:function (res) {
alert(res);
}
}
);
}
访问能看到yes消息框
设计界面 html/jslt/other tag
addFunc1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="func1.action" οnsubmit="return check(this)"> <input type="hidden" id="op" name="op" value="insert"> fld1: <input id="fld1" name="fld1" οnkeyup="verify(this.value)"> <br> fld2: <input id="fld2" name="fld2"> <br> fld3: <input id="fld3" name="fld3"> <br> <input type="submit" value="insert"> </form>
</body>
</html>
编辑Func1Action.java,创建insert函数
case "insert":
insert(req, resp);
break;
private void insert(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Func1 func1 = new Func1();
PrintWriter out = resp.getWriter();
//将请求中数据取出并赋值给func1对象
MyUtil.setParams(req, func1);
out.print(func1);
}
编辑Func1.java重写toString函数
@Override
public String toString() {
return "fld1:"+fld1+",fld2:"+fld2+",fld3:"+fld3;
}
运行应用输入数据,在页面能看到用户输入的数据,再继续。。。。
创建业务逻辑层
public interface Func1Service {
public abstract boolean insertFunc1(Func1 func1);
}
public class Func1ServiceImpl implements Func1Service{
MyDAO dao=new MyDAO();
@Override
public boolean insertFunc1(Func1 func1) {
try {
//调用数据库层
dao.insert(Func1Mapper.class, func1);
} catch (Exception e) {
return false;
}
return true;
}
}
编辑action,调用业务逻辑层
private void insert(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Func1 func1 = new Func1();
PrintWriter out = resp.getWriter();
MyUtil.setParams(req, func1);
out.print(func1);
//调用业务逻辑层
func1Service.insertFunc1(func1);
}
运行应用输入正确数据,能将数据增加到表中
D2
js怎么设置事件?
打开浏览器,按F12,使用js创建标签,并为标签设置某个事件
<form action="func1.action" οnsubmit="return check(this)"> <input type="hidden" id="op" name="op" value="insert"> fld1: <input id="fld1" name="fld1" οnkeyup="verify(this.value)"> <br> fld2: <input id="fld2" name="fld2"> <br> fld3: <input id="fld3" name="fld3"> <br> <input type="submit" value="insert"> </form>
布置一个任务,去掉οnsubmit="return check(this)"使用js设置onsubmit事件
实现异步校验
实现校验动作
private void check(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Func1 func1 = new Func1();
PrintWriter out = resp.getWriter();
MyUtil.setParams(req, func1);
if (func1Service.getFunc1(func1) != null) {
out.print("yes");
} else {
out.print("no");
}
}
业务逻辑层
@Override
public Func1 getFunc1(Func1 func1) {
try {
return (Func1) dao.getById(Func1Mapper.class, func1.getFld1());
} catch (Exception e) {
return null;
}
}
数据库层
public Object getById(Class cls,Integer id) {
SqlSession sqlSession = MyBatisDAOUtil.getSqlSessionFactory()
.openSession();
try {
MyMapper myMapper = (MyMapper) sqlSession.getMapper(cls);
return myMapper.getById(id);
} finally {
sqlSession.close();
}
}
相关配置
<select id="getById" parameterType="int" resultType="Func1">
SELECT * FROM func1 WHERE fld1 = #{id}
</select>
做好后启动应用,地址栏直接发请求,能看到yes或no
继续。。。。。。
将记录日志的功能加到工程里
将mybatis获取连接对象写成函数
private SqlSession getConn() {
try {
SqlSession sqlSession = MyBatisDAOUtil.getSqlSessionFactory()
.openSession();
return sqlSession;
} catch (Exception e) {
log.fatal(e.getMessage());
return null;
}
}
实现登录功能
复制stu表对应的类
public class Stu {
private int xh;
private String xm;
private float xs;
set/get
无参/有参构造函数
。。。。。。。
}
复制之前的登录界面login.jsp
<form action="stu.action" >
<input type="hidden" id="op" name="op" value="login">
user: <input id="xh" name="xh" >
<font color="red">${sessionScope.err}</font>
<br>
pass: <input type="password" id="xm" name="xm"> <br>
<input type="submit" value="login">
</form>
实现登录action
private void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Stu stu = new Stu();
PrintWriter out = resp.getWriter();
MyUtil.setParams(req, stu);
if(stuService.getStu(stu)!=null){
req.getSession().setAttribute("islogin", stu);
resp.sendRedirect("addFunc1.jsp");
}else {
req.getSession().setAttribute("err", "invalid user or pass");
resp.sendRedirect("login.jsp");
}
}
实现登录业务逻辑
public class StuServiceImpl implements StuService {
MyDAO dao = new MyDAO();
Logger log=Logger.getLogger(StuServiceImpl.class);
@Override
public Stu getStu(Stu stu) {
try {
return (Stu) dao.getByObj(StuMapper.class, stu);
} catch (Exception e) {
log.error(e.getMessage());
return null;
}
}
}
编辑数据库访问
public Object getByObj(Class cls,Object obj) {
SqlSession sqlSession =getConn();
try {
MyMapper myMapper = (MyMapper) sqlSession.getMapper(cls);
return myMapper.getByObj(obj);
} finally {
sqlSession.close();
}
}
编译映射命名
public interface MyMapper {
public void insert(Object obj);
public Object getById(Integer id);
public Object getByObj(Object obj);
public List<Object> getAll();
public void update(Object obj);
public void delete(Integer id);
}
编辑表对应的xml
<mapper namespace="com.dlj.mapper.StuMapper">
<select id="getByObj" parameterType="Stu" resultType="Stu">
SELECT *
FROM stu
WHERE xh = #{xh} and xm=#{xm}
</select>
编辑mybatis框架配置文件
<configuration>
<properties resource="com/dlj/resources/db.properties" />
<typeAliases>
<typeAlias type="com.dlj.model.Stu" alias="Stu"></typeAlias>
<typeAlias type="com.dlj.model.Func1" alias="Func1"></typeAlias>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/dlj/mapper/StuMapper.xml" />
<mapper resource="com/dlj/mapper/Func1Mapper.xml" />
</mappers>
</configuration>
启动应用,测试登录功能是否实现
显示数据
创建显示数据jsp
<%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2018/10/13
Time: 14:02
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>showStu</title>
<script src="js/jquery.min.js"></script>
<script>
function getStu() {
$.ajax(
{
url:"func1.action?op=ajaxsel",
dataType:"json",
success:function (data) {
var str="";
for (var i=0;i<data.length;i++) {
var x=data[i];
str=str+"<tr><td>"+x.fld1+"</td><td>"+x.fld2+"</td><td>"+x.fld3+"</td>";
str=str+"<td> <a href='#' οnclick='return ajaxdel("+x.fld1+")'> del</td></tr>" ;
}
$("#func1").html(str);
}
}
);
}
</script>
<style>
table,tr,td{
border: 1px solid black;
border-collapse: collapse;
}
</style>
</head>
<body>
<table >
<thead>
<tr> <td>fld1</td> <td>fld2</td> <td>fld3</td> <td> op</td> </tr>
</thead>
<tbody id="func1">
</tbody>
</table>
</body>
<script>
getStu();
</script>
</html>
实现查询action
private void ajaxsel(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// Func1 func1 = new Func1();
PrintWriter out = resp.getWriter();
// MyUtil.setParams(req, func1);
// out.print(func1);
List<Func1> lstFunc1= func1Service.getAllFunc1();
out.print(JSON.toJSONString(lstFunc1));
}
实现业务逻辑
@Override
public List<Func1> getAllFunc1() {
try {
return ( List) dao.getAll(Func1Mapper.class);
} catch (Exception e) {
log.error(e.getMessage());
return null;
}
}
编辑表对应的xml
<mapper namespace="com.dlj.mapper.Func1Mapper">
<insert id="insert" parameterType="Func1" >
INSERT INTO func1(fld1, fld2, fld3)
VALUES(#{fld1}, #{fld2}, #{fld3})
</insert>
<select id="getById" parameterType="int" resultType="Func1">
SELECT * FROM func1 WHERE fld1 = #{id}
</select>
<resultMap type="Func1" id="Func1ResultSet">
<id property="fld1" column="fld1" />
<result property="fld2" column="fld2" />
<result property="fld3" column="fld3" />
</resultMap>
<select id="getAll" resultMap="Func1ResultSet">
SELECT * FROM func1
</select>
启动应用地址栏直接请求查询动作
实现异步删除
实现删除action
private void ajaxdel(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Func1 func1 = new Func1();
PrintWriter out = resp.getWriter();
MyUtil.setParams(req, func1);
// out.print(func1);
if( func1Service.deleteFunc1(func1) ) {
out.print("yes");
}
else
{
out.print("no");
}
}
实现删除业务逻辑
@Override
public boolean deleteFunc1(Func1 func1) {
try {
return dao.delete(Func1Mapper.class, func1.getFld1());
} catch (Exception e) {
log.error(e.getMessage());
return false;
}
}
调整删除DAO
public boolean delete(Class cls,Integer id) {
SqlSession sqlSession =getConn();
int n=0;
try {
MyMapper myMapper = (MyMapper) sqlSession.getMapper(cls);
n=myMapper.delete(id);
sqlSession.commit();
} finally {
sqlSession.close();
}
return n>0;
}
增加删除配置
<delete id="delete" parameterType="int">
DELETE FROM func1 WHERE fld1 = #{id}
</delete>
启动应用地址栏直接发删除请求看到yes或no
继续。。。。。。。。。跟前端对接。。。
编辑显示数据界面
function ajaxdel(fld1) {
if(confirm("确定要删除[fld1="+fld1+"]的数据吗?")){
$.ajax(
{
url:"func1.action?op=ajaxdel&fld1="+fld1,
success:function (data) {
if(data=="yes"){
$("#fld"+fld1).remove();
}
}
}
);
}
return false;
}
运行程序
点击删除,选择确定则删除、取消则不删除
实现修改功能
复制增加界面,命名修改界面modifyFunc1.jsp
<form action="func1.action" οnsubmit="return check(this)"> <input type="hidden" id="op" name="op" value="update"> <input type="hidden" id="oldfld1" name="oldfld1" value="${param.oldfld1}"> fld1: <input id="fld1" name="fld1" value="${param.fld1}" οnkeyup="verify(this.value)"> <font color="red" id="fld1ts"></font> <br> fld2: <input id="fld2" name="fld2" value="${param.fld2}"> <br> fld3: <input type="date" id="fld3" name="fld3"> <br> <input type="submit" id="update" value="update"> </form>
在显示数据部分增加修改超链接
实现修改action
注意:使用哈希表传递参数
实现修改业务逻辑
@Override
public boolean updateFunc1(Map map) {
try {
dao.update(Func1Mapper.class, map);
} catch (Exception e) {
log.error(e.getMessage());
return false;
}
return true;
}
实现数据库操作
public boolean update(Class cls, Map map) {
SqlSession sqlSession =getConn();
int n=0;
try {
MyMapper myMapper = (MyMapper) sqlSession.getMapper(cls);
n=myMapper.update(map);
sqlSession.commit();
} finally {
sqlSession.close();
}
return n>0;
}
命名映射
public interface MyMapper {
public void insert(Object obj);
public Object getById(Integer id);
public Object getByObj(Object obj);
public List<Object> getAll();
public void update(Object obj);
public int update(Map map);
public int delete(Integer id);
}
配置文件
<?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.dlj.mapper.Func1Mapper">
<insert id="insert" parameterType="Func1" >
INSERT INTO func1(fld1, fld2, fld3)
VALUES(#{fld1}, #{fld2}, #{fld3})
</insert>
<select id="getById" parameterType="int" resultType="Func1">
SELECT * FROM func1 WHERE fld1 = #{id}
</select>
<resultMap type="Func1" id="Func1ResultSet">
<id property="fld1" column="fld1" />
<result property="fld2" column="fld2" />
<result property="fld3" column="fld3" />
</resultMap>
<select id="getAll" resultMap="Func1ResultSet">
SELECT * FROM func1
</select>
<delete id="delete" parameterType="int">
DELETE FROM func1 WHERE fld1 = #{id}
</delete>
<update id="update" parameterType="Map">
UPDATE func1
SET fld1=#{func1.fld1},fld2=#{func1.fld2},fld3=#{func1.fld3}
WHERE
fld1 = #{oldfld}
</update>
</mapper>
运行效果
将之前练习过滤器增加