使用IDEA创建maven项目,File→New→Project→maven→Next→填写GroupId(例:com.zyl)和ArtifactId(mybatis-demo-parent)→Next,创建完成后,将src目录删除。鼠标右击项目名创建module,就是创建出了子模块。
注意:1.所有类都应该写在包下,如果不写包会出现模块之间依赖了,但是编写代码时使用不了该类的现象
2.添加tomcat后,要将Artifacts中的Output Layout中右边的Artifacts所有内容添加到左边去,不然运行时会出现异常:找不到类和什么异常来着,忘了
3.jstl的<c:if>判断条件是写在${xx == xx}里面的,而不是写成${xx}==xx,当时没注意,一直不知道错哪了
4.@WebServlet("/*")别忘了写/,好多次都是因为/没写报了一些莫名其妙的错误,自己又找不到
创建以下五个子模块,mybatis-demo-util,mybatis-demo-entity,mybatis-demo-dao,mybatis-demo-service,mybatis-demo-web.其中父模块的pom文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.nf</groupId>
    <artifactId>mybatis-firstWork-parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>mybatis-demo-util</module>
        <module>mybatis-demo-dao</module>
        <module>mybatis-demo-entity</module>
        <module>mybatis-demo-service</module>
        <module>mybatis-demo-web</module>
    </modules>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
<!--统一使用自定义标签的版本号,方便以后修改,同样的,模块之间的依赖的版本号也使用maven的全局标签<project.version>-->
        <mybatis.version>3.5.2</mybatis.version>
        <mysql.version>5.1.47</mysql.version>
        <junit.version>4.12</junit.version>
        <servlet.version>3.1.0</servlet.version>
        <jstl.version>1.2</jstl.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
<!--记住,要写scope,junit是test-->
            <!-- https://mvnrepository.com/artifact/junit/junit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>${servlet.version}</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>${jstl.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>
Mysql数据库:
表dept dept | CREATE TABLE `dept` ( `dept_id` int(11) NOT NULL AUTO_INCREMENT, `dept_name` char(20) DEFAULT NULL, PRIMARY KEY (`dept_id`) ) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8mb4 | 表employee | employee | CREATE TABLE `employee` ( `employee_id` int(11) NOT NULL AUTO_INCREMENT, `employee_name` char(30) DEFAULT NULL, `employee_gender` binary(1) DEFAULT NULL, `employee_salary` decimal(10,2) DEFAULT NULL, `dept_id` int(11) DEFAULT NULL, PRIMARY KEY (`employee_id`) ) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4 |
创建相应的实体类。
dao模块中的resources中写四个文件:
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="db.properties"></properties>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <typeAliases>
        <typeAlias type="com.entity.Employee" alias="employee"></typeAlias>
    </typeAliases>
    <environments default="def">
        <environment id="def">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"></property>
                <property name="url" value="${url}"></property>
                <property name="username" value="${username}"></property>
                <property name="password" value="${password}"></property>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="employeeMapper.xml"></mapper>
        <mapper resource="deptMapper.xml"></mapper>
    </mappers>
</configuration>
db.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/guoqing?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8 #url后面还有一串参数 username=root password=root #?和?之后的内容可以不用写
employeeMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//OTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--自动映射关掉了,虽然说默认是打开的,但是我这里没用,要的话也可以上官网查找-->
<mapper namespace="com.dao.EmployeeDao">
    <resultMap id="employeeResultMap" type="employee">
        <id property="employeeId" column="employee_id"></id>
        <result property="employeeName" column="employee_name"></result>
        <result column="employee_gender" property="employeeGender"></result>
        <result column="employee_salary" property="employeeSalary"></result>
        <result column="dept_name" property="deptName"></result>
    </resultMap>
    <resultMap id="employeeResultOne" type="employee">
        <result column="dept_name" property="deptName"></result>
        <result column="employee_salary" property="employeeSalary"></result>
        <result property="employeeName" column="employee_name"></result>
        <result column="employee_gender" property="employeeGender"></result>
    </resultMap>
  
    <select id="queryAll" resultMap="employeeResultMap">
        select employee_id,employee_name,employee_gender,employee_salary,dept_name from employee left outer join dept on employee.dept_id = dept.dept_id
    </select>
    <insert id="insert">
        insert into employee(employee_name,employee_gender,employee_salary,dept_id) values(#{arg0},#{arg1},#{arg2},#{arg3})
    </insert>
    <update id="update">
        update employee set employee_name=#{arg0},employee_gender=#{arg1},employee_salary=#{arg2},dept_id=#{arg3} where employee_id=#{arg4}
    </update>
    <delete id="delete">
        delete from employee where employee_id=#{arg0}
    </delete>
    <select id="queryOne" resultMap="employeeResultOne">
        select employee_name,employee_gender,employee_salary,dept_name from employee left outer join dept on employee.dept_id = dept.dept_id where employee_id = #{arg0}
    </select>
    <select id="selectList" resultMap="employeeResultMap">
        select employee_id,employee_name,employee_gender,employee_salary,dept_name from employee inner join dept on employee.dept_id = dept.dept_id where employee.dept_id=#{arg0}
    </select>
</mapper>
deptMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//OTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--自动映射关掉了-->
<mapper namespace="com.dao.DeptDao">
    <resultMap id="DeptResultMap" type="com.entity.Dept">
        <id property="deptId" column="dept_id"></id>
        <result property="deptName" column="dept_name"></result>
    </resultMap>
    <select id="queryAll" resultMap="DeptResultMap">
        select dept_id,dept_name from dept
    </select>
</mapper>
com.dao包下:
package com.dao;
import com.entity.Employee;
import java.math.BigDecimal;
import java.util.List;
public interface EmployeeDao {
    List<Employee> queryAll();
    int insert(String name, int gender, BigDecimal salary, Integer deptId);
    int update(String name, int gender, BigDecimal salary, Integer deptId, Integer id);
    int delete(Integer id);
    Employee queryOne(Integer employeeId);
    List<Employee> selectList(Integer employeeId);
}
package com.dao;
import com.entity.Employee;
import com.util.MapperFactory;
import org.apache.ibatis.annotations.Mapper;
import java.math.BigDecimal;
import java.util.List;
public class EmployeeDaoImpl implements EmployeeDao{
    @Override
    public List<Employee> queryAll() {
        EmployeeDao employeeDao = MapperFactory.generateMapper(EmployeeDao.class);
        List<Employee> employees = employeeDao.queryAll();
        return employees;
    }
    @Override
    public int insert(String name, int gender, BigDecimal salary, Integer deptId) {
        EmployeeDao employeeDao = MapperFactory.generateMapper(EmployeeDao.class);
        return employeeDao.insert(name, gender, salary, deptId);
    }
    @Override
    public int update(String name, int gender, BigDecimal salary, Integer deptId, Integer id) {
        EmployeeDao employeeDao = MapperFactory.generateMapper(EmployeeDao.class);
        return employeeDao.update(name, gender, salary, deptId, id);
    }
    @Override
    public int delete(Integer id) {
        EmployeeDao employeeDao = MapperFactory.generateMapper(EmployeeDao.class);
        return employeeDao.delete(id);
    }
    @Override
    public Employee queryOne(Integer employeeId) {
        EmployeeDao employeeDao = MapperFactory.generateMapper(EmployeeDao.class);
        Employee employee = employeeDao.queryOne(employeeId);
        return employee;
    }
    @Override
    public List<Employee> selectList(Integer deptId) {
        EmployeeDao employeeDao = MapperFactory.generateMapper(EmployeeDao.class);
        List<Employee> employees = employeeDao.selectList(deptId);
        return employees;
    }
}
mybatis-demo-util中使用了代理,让SqlSession在使用后自动关闭
package com.util;
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 java.io.IOException;
import java.io.InputStream;
public class SqlSessionFactoryUtil {
    private final static String RESOURCE = "mybatis-config.xml";
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            InputStream inputStream = Resources.getResourceAsStream(RESOURCE);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            throw new DaoException("get SqlSessionFactory failed", e);
        }
        }
    public static SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession(true);// 这里的true是让sql语句执行后自动提交,如果不写的话,后面的java代码执行sql语句都需要多写一句提交代码
    }
}
package com.util;
import org.apache.ibatis.session.SqlSession;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MapperInterceptor implements InvocationHandler {
    private SqlSession sqlSession;
    private Object target;
    public MapperInterceptor(SqlSession sqlSession, Object target) {
        this.sqlSession = sqlSession;
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        try {
            return method.invoke(target, args);
        } finally {
            sqlSession.close();
        }
    }
}
package com.util;
import org.apache.ibatis.session.SqlSession;
public class MapperFactory {
    public static <T> T generateMapper(Class<? extends T> clz) {
        SqlSession sqlSession = SqlSessionFactoryUtil.getSqlSession();
        return sqlSession.getMapper(clz);
    }
}
mybatis-demo-web的pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>mybatis-firstWork-parent</artifactId>
        <groupId>com.nf</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>mybatis-web</artifactId>
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>com.nf</groupId>
            <artifactId>mybatis-service</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
<!--打包成war包-->
    <build>
        <finalName>big</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.3</version>
                <configuration>
                    <warSourceDirectory>web</warSourceDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
File→Project Settings→Modules→mybatis-demo-web→+→web→OK变成web项目
添加tomcat,再写相应的Servlet和jsp
最后,关于动态查询:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//OTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.EmployeeDao">
    <resultMap id="employeeResultMap" type="employee">
        <id property="employeeId" column="employee_id"></id>
        <result column="employee_name" property="employeeName"></result>
        <result property="employeeGender" column="employee_gender"></result>
        <result column="employee_salary" property="employeeSalary"></result>
        <result property="deptName" column="dept_name"></result>
    </resultMap>
    <select id="queryAll" resultMap="employeeResultMap">
        select employee_id,employee_name,employee_gender,employee_salary,dept_name from employee e left outer join dept d on e.dept_id = d.dept_id where 1 = 1 ${arg0}
    </select>
</mapper>
其中要注意,where 1=1后面的参数一定要写$而不是#,写#的话是转成?的,若是没用条件那么语句就是错误的,而$是完全代替,就不会有这个错误了
package com.dao;
import com.entity.Employee;
import java.util.List;
public interface EmployeeDao {
    List<Employee> queryAll(String sql);
}
package com.dao;
import com.entity.Employee;
import com.util.MapperFactory;
import java.util.List;
public class EmployeeDaoImpl implements EmployeeDao {
    @Override
    public List<Employee> queryAll(String sql) {
        EmployeeDao employeeDao = MapperFactory.generateMapper(EmployeeDao.class);
        List<Employee> employees = employeeDao.queryAll(sql);
        return employees;
    }
}
jsp中的<Script>是重点:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>员工</title>
</head>
<body>
<label>
    <span>性别</span>
    <select id="selGender" class="select">
        <option value="">请选择</option>
        <option value="1">男</option>
        <option value="0">女</option>
    </select>
</label>
<label>
    <span>工资</span>
    <select id="selSalary" class="select">
        <option value="">请选择</option>
        <option value="< 1000">1000以下</option>
        <option value="between 1000 and 3000">1000-3000</option>
        <option value="> 3000">3000以上</option>
    </select>
</label>
<label>
    <span>排序</span>
    <select id="selOrder" class="select">
        <option value="">请选择</option>
        <option value=" order by salary desc">工资降序</option>
        <option value=" order by salary asc">工资升序</option>
    </select>
</label>
<table>
    <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>性别</th>
        <th>工资</th>
        <th>部门</th>
    </tr>
<c:forEach items="${employees}" var="employee">
    <tr>
        <td>${employee.employeeId}</td>
        <td>${employee.employeeName}</td>
        <td>${employee.employeeGender}</td>
        <td>${employee.employeeSalary}</td>
        <td>${employee.deptName}</td>
    </tr>
</c:forEach>
</table>
<script>
    $(".select").on("change", function () {
        $.ajax({
            method: "post",
            url: "${pageContext.request.contextPath}/con",
            data: {
                gender: $("#selGender").val(),
                salary: $("#selSalary").val(),
                order: $("#selOrder").val()
            }
        }).done(function (result) {
            $("table").remove();
            $("body").append(result);
        })
    })
</script>
</body>
</html>
转到Servlet
package com.web.servlet;
import com.entity.Employee;
import com.service.EmployeeServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("/con")
public class ConditionServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String gender = req.getParameter("gender");
        String salary = req.getParameter("salary");
        String order = req.getParameter("order");
        StringBuilder sql = new StringBuilder();
        if (gender != "") {
            sql.append(" and employee_gender = " + gender);
        }
        if (salary != "") {
            sql.append(" and employee_salary " + salary);
        }
        if (order != "") {
            sql.append(order);
        }
        List<Employee> employees = new EmployeeServiceImpl().queryAll(sql.toString());
        req.setAttribute("employees", employees);
        req.getRequestDispatcher("WEB-INF/employee/table.jsp").forward(req, resp);
    }
}
这样子就做到了动态修改sql语句,完成了动态条件查询
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<table>
    <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>性别</th>
        <th>工资</th>
        <th>部门</th>
    </tr>
    <c:forEach items="${employees}" var="employee">
        <tr>
            <td>${employee.employeeId}</td>
            <td>${employee.employeeName}</td>
            <td>${employee.employeeGender}</td>
            <td>${employee.employeeSalary}</td>
            <td>${employee.deptName}</td>
        </tr>
    </c:forEach>
</table>
mybatis+maven+父子多模块进行crud以及动态条件查询
原文:https://www.cnblogs.com/woyujiezhen/p/11637682.html