在傳統的MVC模式中,持久層有DAO接口和DAO實現類,DAO實現類在mybatis中就顯得很雞肋了;
這些都是模板化代碼,都可以通過配置自動生成然后通過AOP思想動態的切入。
實際開發中就是接口和映射文件,沒有實現類。
導入依賴
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
</dependencies>
pojo
package com.zsl.pojo;
import java.util.List;
public class Emp {
private Integer empno;
private String ename;
private String job;
public Integer getEmpno() {
return empno;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public Emp() {
super();
// TODO Auto-generated constructor stub
}
public Emp(Integer empno, String ename, String job) {
super();
this.empno = empno;
this.ename = ename;
this.job = job;
}
@Override
public String toString() {
return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job + "]";
}
}
EmpMapper接口
package com.zsl.dao;
import java.io.IOException;
import com.zsl.pojo.Emp;
public interface EmpMapper {
public Integer addEmp(Emp emp) throws IOException;
public Integer deleteEmpById(Integer empno) throws IOException;
public Integer updateEmprById(Emp emp) throws IOException;
public Emp getEmpById(Integer empno) throws IOException;
}
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">
<!-- 使用接口 代理的方式 namespace必須和接口的全路徑名稱一致 -->
<mapper namespace="com.zsl.dao.EmpMapper">
<!-- id必須和接口聲明的方法一致 -->
<insert id="addEmp" parameterType="emp">
insert into emp(ename,job)values(#{ename},#{job})
</insert>
<delete id="deleteEmpById" parameterType="int">
delete from emp where empno=#{empno}
</delete>
<update id="updateEmprById" parameterType="emp">
update emp set name = #{ename} where empno=#{empno}
</update>
<select id="getEmpById" parameterType="int" resultType="emp">
select empno,ename,job from emp where empno=#{empno}
</select>
</mapper>
測試Test
package com.zsl.test;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
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 com.zsl.dao.EmpMapper;
import com.zsl.pojo.Emp;
public class Test {
public static void main(String[] args) throws IOException {
// 1.通過Resources對象加載配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-cfg.xml");
// 2.獲取SqlSessionFactory對象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream );
// 3.通過SqlSessionFactory對象獲取SQLSession對象
SqlSession session = factory.openSession();
Emp emp = new Emp();
emp.setEname("zslzslabc");
emp.setJob("程序員abc");
// emp.addEmp 是映射文件中 namespace的內容加 id的內容,定位要執行的SQL
// int count = session.insert("com.zsl.dao.EmpMapper.addEmp", emp);
EmpMapper empMapper = session.getMapper(EmpMapper.class);
Integer count = empMapper.addEmp(emp);
System.out.println("影響的行數:"+count);
// 需要顯示的提交
session.commit();
session.close();
}
}
注意:
使用mapper接口方式必須滿足:
1.映射文件的namespace的值必須是接口的全路徑名稱 比如:com.zsl.dao.EmpMapper
2.接口中的方法名在映射文件中必須有一個id值與之對應。
3.映射文件的名稱必須和接口的名稱一致