victory的博客

长安一片月,万户捣衣声

0%

HashMap的七种遍历方式

参考资料

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

public class HashMapTraversalMethodsTest {
    public static void main(String[] args) {
        
        Map<Integer, String> map = new HashMap();
        map.put(1, "Java");
        map.put(2, "Python");
        map.put(3, "C");
        map.put(4, "C++");
        map.put(5, "JavaScript");
        
        //迭代器EntrySet(推荐使用)
//        Iterator<Entry<Integer, String>> iterator = map.entrySet().iterator();
//        while(iterator.hasNext()){
//            Entry<Integer, String> entry = iterator.next();
//            System.out.println(entry.getKey());
//            System.out.println(entry.getValue());
//        }
        
        //迭代器KeySet
//        Iterator<Integer> iterator = map.keySet().iterator();
//        while(iterator.hasNext()){
//            Integer key = iterator.next();
//            System.out.println(key);
//            System.out.println(map.get(key));
//        }
        
        //ForEach EntrySet
//        for(Entry<Integer, String> entry:map.entrySet()){
//            System.out.println(entry.getKey());
//            System.out.println(entry.getValue());
//        }
        
        //ForEach KeySet
//        for(Integer key:map.keySet()){
//            System.out.println(key);
//            System.out.println(map.get(key));
//        }
        
        //Lambda
//        map.forEach((key, value) -> {
//            System.out.println(key);
//            System.out.println(value);
//        });
        
        //Streams API单线程
//        map.entrySet().stream().forEach((entry) -> {
//            System.out.println(entry.getKey());
//            System.out.println(entry.getValue());
//        });
        
        //Streams API多线程
        map.entrySet().parallelStream().forEach((entry) ->{
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        });
    }
}

批量删除

1.list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>展示员工信息</title>
<link rel="stylesheet" href="${pageContext.servletContext.contextPath}/css/index_work.css"/>
<script type="text/javascript" src="${pageContext.servletContext.contextPath}/js/jquery-1.8.2.min.js"></script>
<script type="text/javascript">
    $(function(){
        $("#selectAll").click(function(){
            $("[name='eid']").prop("checked", $(this).prop("checked"));
        });
        
        $("#deleteMore").click(function(){
            $("form").attr("action", $(this).attr("href")).submit();
            return false;//关闭默认跳转
        });
    });
</script>
</head>
<body>
    <form method="post">
        <input type="hidden" name="_method" value="DELETE"/>
        <table>
            <tr>
                <th>
                    <input type="checkbox" id="selectAll">
                </th>
                <th>EID</th>
                <th>ENAME</th>
                <th>AGE</th>
                <th>SEX</th>
                <th>DEPARTMENTNAME</th>
                <th>OPTIONS</th>
            </tr>
            <c:forEach items="${empList}" var="emp">
                <tr>
                    <td>
                        <input type="checkbox" name="eid" value="${emp.eid}"/>
                    </td>
                    <td>${emp.eid}</td>
                    <td>${emp.ename}</td>
                    <td>${emp.age}</td>
                    <td>${emp.sex == 0 ? '女':'男'}</td>
                    <td>${emp.dept.dname}</td>
                    <td>
                        <a href="emp">删除</a>
                        <a href="${pageContext.servletContext.contextPath}/emp/${emp.eid}">修改</a>
                    </td>
                </tr>
            </c:forEach>
            <tr>
                <td colspan="10">
                    <a id="deleteMore" href="${pageContext.servletContext.contextPath}/emps">批量删除</a>&nbsp;
                    ${page}
                </td>
            </tr>
        </table>
    </form>
</body>
</html>

2.EmpMapper.java

public interface EmpMapper {
    //获取所有的员工信息
    List<Emp> getAllEmp();
    
    ......
    
    void deleteMore(String eids);
}

3.EmpMapper.xml

<!-- void deleteMore(String eids); -->
<delete id="deleteMore">
    delete from emp where eid in (${value})
</delete>

4.EmpService.java

public interface EmpService {
    ......
    
    void deleteMore(String eids);
}

5.EmpServiceImpl.java

@Service
public class EmpServiceImpl implements EmpService{
    @Autowired
    private EmpMapper empMapper;
    
    ......

    @Override
    public void deleteMore(String eids) {
        // TODO Auto-generated method stub
        empMapper.deleteMore(eids);
    }
}

6.EmpController.java

@Controller
public class EmpController {

    @Autowired
    private EmpService service;
    
    ......
    
    @RequestMapping(value="/emps", method=RequestMethod.DELETE)
    public String deleteMore(String eid){
        //获取客户端name属性相同的多个元素的值,可以通过字符串直接获取,每个值以逗号分隔,也可以以数组直接获取
        System.out.println(eid);
        service.deleteMore(eid);
        return "redirect:/emps/1";
    }
}

修改员工信息

1.list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>展示员工信息</title>
<link rel="stylesheet" href="${pageContext.servletContext.contextPath}/css/index_work.css"/>
</head>
<body>
    <table>
        <tr>
            <th>EID</th>
            <th>ENAME</th>
            <th>AGE</th>
            <th>SEX</th>
            <th>DEPARTMENTNAME</th>
            <th>OPTIONS</th>
        </tr>
        <c:forEach items="${empList}" var="emp">
            <tr>
                <td>${emp.eid}</td>
                <td>${emp.ename}</td>
                <td>${emp.age}</td>
                <td>${emp.sex == 0 ? '女':'男'}</td>
                <td>${emp.dept.dname}</td>
                <td>
                    <a href="emp">删除</a>
                    <a href="${pageContext.servletContext.contextPath}/emp/${emp.eid}">修改</a>
                </td>
            </tr>
        </c:forEach>
        <tr>
            <td colspan="10">
                ${page}
            </td>
        </tr>
    </table>
</body>
</html>

2.update.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>修改员工信息</title>
<link rel="stylesheet" href="${pageContext.servletContext.contextPath}/css/index_work.css"/>
</head>
<body>
    <form:form action="${pageContext.servletContext.contextPath}/emp" method="post" modelAttribute="emp">
        <input type="hidden" name="_method" value="PUT"/>
        <form:hidden path="eid"/>
        <table>
            <tr>
                <th colspan="2">UPDATE EMP INFO</th>
            </tr>
            <tr>
                <td>ENAME</td>
                <td>
                    <form:input path="ename"/>
                </td>
            </tr>
            <tr>
                <td>AGE</td>
                <td>
                    <form:input path="age"/>
                </td>
            </tr>
            <tr>
                <td>sex</td>
                <td>
                    <form:radiobuttons path="sex" items="${sex}"/>
                </td>
            </tr>
            <tr>
                <td>DEPARTMENT</td>
                <td>
                    <form:select path="dept.did" items="${deptList}" itemLabel="dname" itemValue="did"></form:select>
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <input type="submit" value="修改" />
                </td>
            </tr>
        </table>
    </form:form>
</body>
</html>

3.EmpController.java

@Controller
public class EmpController {

    @Autowired
    private EmpService service;
    
    @RequestMapping(value="/emp/{eid}", method=RequestMethod.GET)
    public String toUpdate(@PathVariable("eid")String eid, Map<String, Object> map){
        //要修改的员工信息
        Emp emp = service.getEmpByEid(eid);
        
        //所有的部门信息
        List<Dept> deptList = service.getAllDept();
        
        //获取存储性别的map集合
        Map<String, String> sex = new HashMap<>();
        sex.put("0", "女");
        sex.put("1", "男");
        
        map.put("emp", emp);
        map.put("deptList", deptList);
        map.put("sex", sex);
        
        return "update";
    }
    
    @RequestMapping(value="/emp", method=RequestMethod.PUT)
    public String updateEmp(Emp emp){
        service.updateEmp(emp);
        return "redirect:/emps/1";
    }
}

4.EmpService.java

public interface EmpService {
    ......
    
    List<Dept> getAllDept();
}

5.EmpServiceImpl.java

@Service
public class EmpServiceImpl implements EmpService{
    @Autowired
    private EmpMapper empMapper;
    
    @Autowired
    private DeptMapper deptMapper;
    
    ......
    
    @Override
    public List<Dept> getAllDept() {
        // TODO Auto-generated method stub
        return deptMapper.getAllDept();
    }
}

反射

1.反射
运行时分析类并调用类中的属性和方法
2.反射的应用场景
(1)spring、springboot等框架的实现
(2)动态代理
(3)注解
3.反射的优缺点
3.1优点
(1)灵活
(2)不安全(比如无视泛型参数的安全检查)
3.2缺点
性能稍差
4.获取Class对象的四种方式
(1)类.class
(2)Class.forName(类的全限定名)
(3)Instance.getClass()
(4)xxxClassLoader.loadClass()

SSM整合步骤:

1.导入jar包
spring:
springMVC:
mybatis:
第三方支持:log4j,pageHelper,AspectJ,jackson,jstl

2.搭建springMVC
(1)web.xml
CharacterEncodingFilter:filter
HiddenHttpMethodFilter:filter
DispatcherServlet:servlet
(2)springMVC.xml
扫描控制层组件:context:component-scan
视图解析器:InternalResourceViewResolver
Default Servlet:mvc:default-servlet-handler/
MVC驱动:<mvc:annotation-driven />
可选:MultipartResolver,拦截器

阅读全文 »

分页插件PageHelper及PageHelper模拟分页

1.导入相关包
1)pagehelper-x.x.x.jar
2)jsqlparser-0.9.5.jar
2)在MyBatis全局配置文件mybatis-config.xml中配置分页插件



3)使用PageHelper提供的方法进行分页
4)可以使用更强大的PageInfo封装返回结果

模拟分页

PageUtil.java

package com.atguigu.test;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;

import com.atguigu.bean.Emp;
import com.github.pagehelper.PageInfo;

/**
 * 首页 上一页 1 2 3 4 5 下一页 末页
 */
public class PageUtil {
    public static String getPageInfo(PageInfo<Emp> pageInfo, HttpServletRequest request){
        //String path = request.getContextPath() + "/";
        String path = "/SSM/";
        
        StringBuilder builder = new StringBuilder();
        
        //拼接首页
        builder.append("<a href='"+path+"emps/1'>首页</a>");
        builder.append("&nbsp;");
        
        //拼接上一页
        if(pageInfo.isHasPreviousPage()){
            builder.append("<a href='"+path+"emps/"+pageInfo.getPrePage()+"'>上一页 </a>");
            builder.append("&nbsp;");
        }else{
            builder.append("上一页");
            builder.append("&nbsp;");
        }
        
        //拼接页码
        int[] nums = pageInfo.getNavigatepageNums();
        for(int i : nums){
            if(i == pageInfo.getPageNum()){
                builder.append("<a style='color:red;' href='"+path+"emps/"+i+"'>"+i+"</a>");
                builder.append("&nbsp;");
            }else{
                builder.append("<a href='"+path+"emps/"+i+"'>"+i+"</a>");
                builder.append("&nbsp;");
            }
        }
        
        //拼接下一页
        if(pageInfo.isHasNextPage()){
            builder.append("<a href='"+path+"emps/"+pageInfo.getNextPage()+"'>下一页</a>");
            builder.append("&nbsp;");
        }else{
            builder.append("下一页");
            builder.append("&nbsp;");
        }
        
        //拼接尾页
        builder.append("<a href='"+path+"emps/"+pageInfo.getPages()+"'>尾页</a>");
        builder.append("&nbsp;");
        
        return builder.toString();
    }
}

TestPage.java

package com.atguigu.test;

import java.io.InputStream;
import java.util.Arrays;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import com.atguigu.bean.Emp;
import com.atguigu.mapper.EmpMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

public class TestPage {
    @Test
    public void testPage() throws Exception{
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        PageHelper.startPage(2, 2);
        List<Emp> list = mapper.getAllEmp();
        
        PageInfo<Emp> pageInfo = new PageInfo<>(list, 5);
//        System.out.println(pageInfo);
//        System.out.println(Arrays.toString(pageInfo.getNavigatepageNums()));
        
        System.out.println(PageUtil.getPageInfo(pageInfo, null));
        
        
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
    
    public SqlSessionFactory getSqlSessionFactory() throws Exception{
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        return sqlSessionFactory;
    }
}

返回结果
字符串:

<a href='/SSM/emps/1'>首页</a>&nbsp;<a href='/SSM/emps/1'>上一页 </a>&nbsp;<a href='/SSM/emps/1'>1</a>&nbsp;<a style='color:red;' href='/SSM/emps/2'>2</a>&nbsp;<a href='/SSM/emps/3'>3</a>&nbsp;<a href='/SSM/emps/4'>4</a>&nbsp;<a href='/SSM/emps/5'>5</a>&nbsp;<a href='/SSM/emps/3'>下一页</a>&nbsp;<a href='/SSM/emps/6'>尾页</a>&nbsp;

浏览器显示:

逆向工程

1.项目目录

2.导入逆向工程的jar包

mybatis-generator-core-1.3.2.jar

3.编写MBG的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>

  <context id="DB2Tables" targetRuntime="MyBatis3">
    <!-- 设置连接数据库的信息 -->
    <jdbcConnection driverClass="com.mysql.jdbc.Driver"
        connectionURL="jdbc:mysql://localhost:3306/ssm"
        userId="root"
        password="root">
    </jdbcConnection>

    <javaTypeResolver >
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>

    <!-- javabean的生成策略 -->
    <javaModelGenerator targetPackage="com.atguigu.bean" targetProject=".\src">
      <property name="enableSubPackages" value="true" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>


    <!-- 映射文件的生成策略 -->
    <sqlMapGenerator targetPackage="com.atguigu.mapper"  targetProject=".\conf">
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>

    <!-- mapper接口的生成策略 -->
    <javaClientGenerator type="XMLMAPPER" targetPackage="com.atguigu.mapper"  targetProject=".\src">
      <property name="enableSubPackages" value="true" />
    </javaClientGenerator>

    <!-- 设置要将数据库中的哪张表逆向生成哪一个javabean -->
    <table tableName="emp" domainObjectName="Emp"></table>
    <table tableName="dept" domainObjectName="Dept"></table>

  </context>
</generatorConfiguration>

4.运行代码生成器生成代码

@Test
public void testMBG() throws Exception {
   List<String> warnings = new ArrayList<String>();
   boolean overwrite = true;
   File configFile = new File("mbg.xml");
   ConfigurationParser cp = new ConfigurationParser(warnings);
   Configuration config = cp.parseConfiguration(configFile);
   DefaultShellCallback callback = new DefaultShellCallback(overwrite);
   MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
   myBatisGenerator.generate(null);
}

5.逆向工程的使用
基本查询与带条件查询测试

@Test
    public void testCRUD() throws Exception{
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        
//        Emp emp = mapper.selectByPrimaryKey(2);
//        System.out.println(emp);
        
        EmpExample example = new EmpExample();
        
        Criteria c1 = example.createCriteria();
        c1.andEnameLike("%a%");
        c1.andSexEqualTo("1");
        
        Criteria c2 = example.createCriteria();
        c2.andDidEqualTo(2);
        
        example.or(c2);
        
        List<Emp> list = mapper.selectByExample(example);
        for (Emp emp : list) {
            System.out.println(emp);
        }
        
        //查询全部
//        List<Emp> list1 = mapper.selectByExample(null);
//        for (Emp emp : list1) {
//            System.out.println(emp);
//        }
    }

缓存

一级缓存

mybatis中的一级缓存默认开启,是SqlSession级别的,即同一个SqlSession对于一个SQL语句执行之后就会存储在缓存中,
下次执行相同的sql,直接从缓存中取。
一级缓存失效的几种情况:
(1)不同的SqlSession对应不同的一级缓存
(2)同一个SqlSession但是查询条件不同
(3)同一个SqlSession两次查询期间执行了任何一次增删改操作,会自动将缓存清空
(4)同一个SqlSession两次查询期间手动清空了缓存

二级缓存

mybatis的二级缓存默认不开启,需要设置:
1)全局配置文件中开启二级缓存
2)需要使用二级缓存的映射文件处使用cache配置缓存
3)POJO需要实现Serializable接口
注意:二级缓存在 SqlSession 关闭或提交之后才会生效
1)全局setting的cacheEnable:
配置二级缓存的开关,一级缓存一直是打开的。
2)select标签的useCache属性:
配置这个select是否使用二级缓存。一级缓存一直是使用的
3)sql标签的flushCache属性:
增删改默认flushCache=true。sql执行以后,会同时清空一级和二级缓存。
查询默认 flushCache=false。
4)sqlSession.clearCache():只是用来清除一级缓存。

阅读全文 »

动态SQL

1.项目目录

2.EmpMapper.java

package com.atguigu.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.atguigu.bean.Emp;

public interface EmpMapper {
    //根据eid,ename,age,sex多条件查询员工信息
    List<Emp> getEmpListByMoreTJ(Emp emp);
    
    //根据eid,ename,age,sex其中一个查询员工信息
    List<Emp> getEmpListByChoose(Emp emp);
    
    //添加员工信息,将0|1-->女|男
    void insertEmp(Emp emp);
    
    //根据eid所组成的字符串进行批量删除
    void deleteMoreEmp(String eids);
    
    //通过list集合实现批量删除
    //void deleteMoreByList(List<Integer> eids);
    void deleteMoreByList(@Param("eids")List<Integer> eids);
    
    //批量添加
    void insertMoreByArray(Emp[] emps);
    
    //批量修改
    void updateMoreByArray(@Param("emps")Emp[] emps);
}

3.EmpMapper.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.atguigu.mapper.EmpMapper">
    <!--
         <sql id=""></sql>:设置一段SQL片段,即公共SQL,可以被当前映射文件中所有的SQL语句所访问
     -->
    <sql id="empColumns">
        select eid,ename,age,sex,did from emp
    </sql>

    <!-- List<Emp> getEmpListByMoreTJ(); -->
    <!--
        多条件查询:若页面中没有设置此条件,SQL语句中一定不能有该条件
     -->
    <!--
        <if test=""></if>:通过test表达式拼接SQL 
        <where>:添加where关键字并去掉多余的and
        <trim prefix="" suffix="" prefixOverrides="" suffixOverrides="">:截取并拼接
        prefix:在操作的SQL语句前加入某些内容
        suffix:在操作的SQL语句后加入某些内容
        prefixOverrides:把操作的SQL语句前的某些内容去掉
        suffixOverrides:把操作的SQL语句后的某些内容去掉
     -->
    <select id="getEmpListByMoreTJ" resultType="Emp">
        <!-- select eid,ename,age,sex,did from emp
        where 1 = 1
        <if test="eid != null">
            and eid=#{eid}
        </if>
        <if test="ename != null and ename != ''">
            and ename=#{ename}
        </if>
        <if test="age != null">
            and age=#{age}
        </if>
        <if test="sex == '1' or sex == '0'">
            and sex=#{sex}
        </if> -->
        
        
        <!-- select eid,ename,age,sex,did from emp
        <where>
            <if test="eid != null">
                and eid=#{eid}
            </if>
            <if test="ename != null and ename != ''">
                and ename=#{ename}
            </if>
            <if test="age != null">
                and age=#{age}
            </if>
            <if test="sex == '1' or sex == '0'">
                and sex=#{sex}
            </if>
        </where> -->
        
        <!-- select eid,ename,age,sex,did from emp -->
        <include refid="empColumns"></include>
        <trim prefix="where" suffixOverrides="and|or">
            <if test="eid != null">
                eid=#{eid} and
            </if>
            <if test="ename != null and ename != ''">
                ename=#{ename} and
            </if>
            <if test="age != null">
                age=#{age} or
            </if>
            <if test="sex == '1' or sex == '0'">
                sex=#{sex}
            </if>
        </trim>
    </select>
    
    <!-- List<Emp> getEmpListByChoose(Emp emp); -->
    <!--
        <choose>选择某一个when或otherwise执行
            <when test=""></when>:通过test表达式拼接SQL
            .
            .
            .
            <otherwise></otherwise>:当when都不符合条件,就会选择otherwise拼接SQL语句
        </choose> 
     -->
    <select id="getEmpListByChoose" resultType="Emp">
        select eid,ename,age,sex from emp
        where 
        <choose>
            <when test="eid != null">
                eid = #{eid}
            </when>
            <when test="ename != null and ename != ''">
                ename = #{ename}
            </when>
            <when test="age != null">
                age = #{age}
            </when>
            <otherwise>
                sex = #{sex}
            </otherwise>
        </choose>
    </select>
    
    <!-- void insertEmp(Emp emp); -->
    <insert id="insertEmp">
        insert into emp(eid,ename,age,sex) values(
            null,
            #{ename},
            #{age},
            <choose>
                <when test="sex == 0">'女'</when>
                <when test="sex == 1">'男'</when>
                <otherwise>'不详'</otherwise>
            </choose>
        )
    </insert>
    
    <!-- void deleteMoreEmp(String eids); -->
    <delete id="deleteMoreEmp">
        delete from emp where eid in (${value})
    </delete>
    
    <!-- void deleteMoreByList(List<Integer> eids); -->
    <!--
        <foreach collection="eids" item="" close="" open="" separator="" index=""></foreach>
        对一个数组或集合进行遍历
        collection:指定要遍历的集合或数组
        item:设置别名
        close:设置循环体的结束内容
        open:设置循环体的开始内容
        separator:设置每一次循环之间的分隔符
        index:若遍历的是list集合,index代表下标;若遍历的是map结合,index代表键
     -->
     <!--
        delete from emp where eid in ();
        delete from emp where eid = 1 or eid = 2 or eid = 3 
      -->
    <delete id="deleteMoreByList">
        <!-- delete from emp where eid in 
        <foreach collection="list" item="eid" separator="," open="(" close=")">
            #{eid}
        </foreach> -->
        
        delete from emp where
        <!-- <foreach collection="list" item="eid" separator="or">
            eid = #{eid}
        </foreach> -->
        <foreach collection="eids" item="eid" separator="or">
            eid = #{eid}
        </foreach>
    </delete>
    
    <!--
        delete:
            delete from emp where eid in ();
            delete from emp where eid = 1 or eid = 2 or eid = 3 
        select:
            select * from emp where eid in ();
            select * from emp where eid = 1 or eid = 2 or eid = 3 
        update:
            把每条数据修改成相同内容
            update emp set ... where eid in ();
            update emp set ... where eid = 1 or eid = 2 or eid = 3 
            把每条数据修改成对应内容,注意必须在链接地址(url)后添加?allowMultiQueries=true
            update emp set ... where eid=1;
            update emp set ... where eid=2;
            update emp set ... where eid=3;
        insert:
            insert into emp values(),(),()
     -->
     
     <!-- void insertMoreByArray(Emp[] emps); -->
     <insert id="insertMoreByArray">
        insert into emp values
        <foreach collection="array" item="emp" separator=",">
            (null,#{emp.ename},#{emp.age},#{emp.sex},1)
        </foreach>
     </insert>
     
     <!-- void updateMoreByArray(@Param("emps")Emp[] emps); -->
     <update id="updateMoreByArray">
        <foreach collection="emps" item="emp">
            update emp set ename=#{emp.ename}, age=#{emp.age}, sex=#{emp.sex} where eid = #{emp.eid};
        </foreach>
     </update>
</mapper>

4.TestDynamicSQl.java

package com.atguigu.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import com.atguigu.bean.Emp;
import com.atguigu.mapper.EmpMapper;

public class TestDynamicSQL {
    @Test
    public void TestMore() throws Exception{
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        
        //批量删除
//        List<Integer> eids = new ArrayList<>();
//        eids.add(10);
//        eids.add(16);
//        eids.add(17);
//        mapper.deleteMoreByList(eids);//只能删除id为1的员工
        
        //批量添加
        //Emp[] emps = new Emp[3];
        //Emp[] emps = new Emp[]{};
        //Emp[] emps = {};
//        Emp emp1 = new Emp(null, "a",23,"男");
//        Emp emp2 = new Emp(null, "aa",23,"男");
//        Emp emp3 = new Emp(null, "aaa",23,"男");
//        Emp[] emps = {emp1, emp2, emp3};
//        mapper.insertMoreByArray(emps);
        
        //批量修改(需要在jdbc.url后加?allowMultiQueries=true)
        //jdbc.url=jdbc:mysql://localhost:3306/ssm?allowMultiQueries=true
        Emp emp1 = new Emp(20, "a1",233,"女");
        Emp emp2 = new Emp(21, "aa1",233,"女");
        Emp emp3 = new Emp(22, "aaa1",233,"女");
        Emp[] emps = {emp1, emp2, emp3};
        mapper.updateMoreByArray(emps);
    }
    
    @Test
    public void TestChoose() throws Exception{
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        
        //测试1
        //Emp emp = new Emp();
//        emp.setEid(1);
//        emp.setEname("张三");
//        emp.setAge(12);
        //emp.setSex("1");
//        List<Emp> list = mapper.getEmpListByChoose(emp);
//        for (Emp e : list) {
//            System.out.println(e);
//        }
        
        //测试2
//        Emp emp = new Emp();
//        emp.setEname("张三");
//        emp.setAge(12);    
//        emp.setSex("1");
//        mapper.insertEmp(emp);
        
        Emp emp = new Emp();
        emp.setEname("张三三");
        emp.setAge(12);    
        emp.setSex("123");
        mapper.insertEmp(emp);
    }
    
    @Test
    public void TestIf() throws Exception{
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = new Emp();
        //emp.setEid(1);
        emp.setEname("张三");
        emp.setAge(12);
        //emp.setSex("1");
        List<Emp> list = mapper.getEmpListByMoreTJ(emp);
        for (Emp e : list) {
            System.out.println(e);
        }
    }
    
    public SqlSessionFactory getSqlSessionFactory() throws Exception{
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        return sqlSessionFactory;
    }
}