写在前面:
无论JDBC还是Mybatis,都属于“持久化”这个概念的范畴,只不过Mybatis是一种更有效和更高级的解决方案,ORM(Object Relational Mapping)对象关系映射;本章中的编写规范主要是为了动态代理;
- 第一步:新建EmpMapper.xml(用于对员工进行操作,可以任意命名)和EmpMapper.java接口;
<?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="mapper.EmpMapper"><!--namespace为EmpMapper.java的完全限定名-->
<!--查询某个工号员工的信息,可以用注解方式实现 -->
<!-- <select id="getOneByEmpNo" parameterType="int" resultType="emp"> -->
<!-- SELECT * FROM EMP WHERE EMPNO = #{empNo} -->
<!-- </select> -->
<!--查询某个部门下所有员工 -->
<select id="getEmpListByDeptNo" parameterType="int"
resultType="emp">
SELECT * FROM EMP WHERE DEPTNO = #{deptNo}
</select>
<!--新增员工 -->
<insert id="saveOneEmp">
INSERT INTO EMP(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(#{empNo},#{eName},#{job},#{mgr},to_date(#{hireDate},'yyyy-MM-dd'),#{sal},#{comm},#{deptNo})
</insert>
<!--根据工号更新一个员工信息 -->
<update id="updateOneByEmpNo" parameterType="emp">
UPDATE EMP SET
ENAME=#{eName},JOB=#{job},MGR=#{mgr},HIREDATE=to_date(#{hireDate},'yyyy-mm-dd'),SAL=#{sal},COMM=#{comm},DEPTNO=#{deptNo}
where EMPNO=#{empNo}
</update>
<!--根据工号删除员工信息 -->
<delete id="removeByEmpNo" parameterType="int">
DELETE FROM EMP WHERE
EMPNO = #{empNo}
</delete>
<!--根据姓名模糊查询 -->
<select id="getEmpByName" parameterType="string"
resultType="emp">
SELECT * FROM EMP WHERE ENAME LIKE #{ename}
</select>
<!--查询某个职位和某个部门下的员工(已知职位名称和部门编号查员工),不可以为空时可以考虑不加jdbcType -->
<select id="getEmpByJobAndDeptNo" resultType="emp">
SELECT * FROM EMP
WHERE JOB=#{job,jdbcType=VARCHAR} AND
DEPTNO=#{deptNo,jdbcType=NUMERIC}
</select>
<!--分页查询(已知起始行数和结束行数查员工信息) -->
<select id="getPageInfo" resultType="emp">
SELECT T2.*
FROM (SELECT e.*,rownum rn FROM EMP e) T1,EMP T2
WHERE rn BETWEEN #{param1} AND #{param2} AND T1.EMPNO=T2.EMPNO
</select>
</mapper>
public interface EmpMapper {
// 方法名要与Mapper.xml中的id一样
// 0.查询某个工号员工的信息,简单SQL可以用注解方式;
@Select("SELECT * FROM EMP WHERE EMPNO = #{empNo}")
Emp getOneByEmpNo(int empNo);
// 1.查询某个部门下所有员工;
List<Emp> getEmpListByDeptNo(int deptNo);
// 2.添加一条员工信息;
int saveOneEmp(Emp emp);
// 3.根据工号更新一个员工信息;
int updateOneByEmpNo(Emp newEmp);
// 4.根据工号删除员工信息;
int removeByEmpNo(int empNo);
// 5.模糊查询
List<Emp> getEmpByName(String name);
// 6.查询某个职位和某个部门下的员工(已知职位名称和部门编号查员工)
List<Emp> getEmpByJobAndDeptNo(@Param("job")String job, @Param("deptNo")int deptNo);
// 7.分页查询(已知起始行数和结束行数查员工信息)
List<Emp> getPageInfo(int start, int end);
}
写在后面:
- namespace和id都可以任意命名,但是必须要对EmpMapper.java接口编写实现类,体现不出Mybatis的优势,所以严格命名以便于动态代理的实现,namespace为EmpMapper.java的完全限定名,id为对应的方法名,parameterType可以省略,但是能加上就加上;
- 对于其中Mapper中的SQL实现方法采用了两种方式:1.使用XML文件进行配置,2.使用注解的方式(注解的方式可以用于简单的SQL语句,复杂的推荐使用XML进行配置),可以参考 Mybatis传多个参数;
- 在Mybatis 3.4.6中传参可以使用注解的方式@param(“别名”)类型 属性名,在XML文件中进行获取;也可以在XML直接使用[arg0、arg1…argn]或者[param1、param2…paramn]来直接获取第一个参数、第二个参数(不能使用其他的否则会报错,而且arg是从0开始,param是从1开始,如下)
- 在MySQL中进行模糊查询也有多种方式,在这里贴出我同学给出的方法,使用#{}和${}是有很大区别的,最后会贴出学习链接:
<!--第一种-->
<select id="uvw" parameterType="String" resultType="model.Emp">
SELECT * FROM EMP WHERE ENAME LIKE '%${value}%'
</select>
<!--第二种-->
<select id="queryEmpByName" parameterType="string" resultType="EMP.Model.Emp">
select * from emp where ename like '%'||#{search_name}||'%'
</select>
XML文件中不支持大于号小于号等符号,需要进行转义,具体可以百度,以下贴上几种常见转义:
友情链接:
jdbcType详解
#{}和${}用法的区别,主要就是#{}相当于JDBC中PrepareStatement中的?,在插入参数过后,如果参数abc为String类型,#{}会自动把参数变为“abc”,为int时不改变;但是用美元符号{}时将会不改变如何东西,直接传入,即参数为abc,传入后还是abc.