一、原理
基础方式的增删改查通过namespace.id定位SQL语句并执行,使用动态代理(接口开发)去掉这一步骤直接找到SQL语句。
根据以下两点可以保证当我们调用接口中的某方法时,程序自动定位到mapper.xml中的SQL标签:
1、根据接口名找到mapper.xml文件:mapper.xml中namespace=接口的全类名。
2、根据接口中的方法找到mapper.xml中的SQL标签:
(1)方法名和mapper.xml中标签的id名相同
(2)方法的输入参数类型和mapper.xml中标签的parameterType一致
(3)方法的返回值类型和mapper.xml中标签的resultType一致
二、代码实现
1、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>
<environments default="mysqlEnv">
<environment id="mysqlEnv">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///ssmcc?useSSL=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/ec/mapper/StudentMapper.xml"/>
</mappers>
</configuration>
2、StudentMapper.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="org.ec.mapper.StudentMapper">//namespace为接口的全类名
<insert id="insertStudent" parameterType="org.ec.entity.Student">
insert into studentMybatis(stuNo,stuName,stuAge)
values(#{stuNo},#{stuName},#{stuAge})
</insert>
<delete id="deleteStudentByStuNo" parameterType="int">
delete from studentMybatis where stuNo = #{stuNo}
</delete>
<update id="updateStudent" parameterType="org.ec.entity.Student">
update studentMybatis set stuName=#{stuName},stuAge=#{stuAge} where stuNo=#{stuNo}
</update>
<select id="selectStudentByStuNo" parameterType="int" resultType="org.ec.entity.Student">
select * from studentMybatis where stuNo=#{stuNo}
</select>
<select id="selectAllStudent" resultType="org.ec.entity.Student">
select * from studentMybatis
</select>
</mapper>
3、接口及实现
//StudentMapper.java
package org.ec.mapper;
import java.util.List;
import org.ec.entity.Student;
public interface StudentMapper {
/*1、方法名和mapper.xml中标签的id名相同
2、方法的输入参数类型和mapper.xml中标签的parameterType一致
3、方法的返回值类型和mapper.xml中标签的resultType一致
*/
public void insertStudent(Student student);
public void deleteStudentByStuNo(int stuNo);
public void updateStudent(Student student);
public Student selectStudentByStuNo(int stuNo);
public List<Student> selectAllStudent();
}
//StudentMapperImpl.java
package org.ec.mapper;
import java.io.IOException;
import java.io.InputStream;
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.ec.entity.Student;
public class StudentMapperImpl implements StudentMapper {
@Override
public void insertStudent(Student student) {
try {
//加载配置文件
InputStream config = Resources.getResourceAsStream("config.xml");
//建立sql会话工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(config);
打开sql会话
SqlSession sqlsession = sessionFactory.openSession();
//调用接口中的方法定位SQL语句
StudentMapper studentmapper = sqlsession.getMapper(StudentMapper.class);
studentmapper.insertStudent(student);
//JDBC方式提交
sqlsession.commit();
sqlsession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void deleteStudentByStuNo(int stuNo) {
try {
//加载配置文件
InputStream config = Resources.getResourceAsStream("config.xml");
//建立sql会话工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(config);
打开sql会话
SqlSession sqlsession = sessionFactory.openSession();
//调用接口中的方法定位SQL语句
StudentMapper studentmapper = sqlsession.getMapper(StudentMapper.class);
studentmapper.deleteStudentByStuNo(stuNo);
//JDBC方式提交
sqlsession.commit();
sqlsession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void updateStudent(Student student) {
try {
//加载配置文件
InputStream config = Resources.getResourceAsStream("config.xml");
//建立sql会话工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(config);
打开sql会话
SqlSession sqlsession = sessionFactory.openSession();
//调用接口中的方法定位SQL语句
StudentMapper studentmapper = sqlsession.getMapper(StudentMapper.class);
studentmapper.updateStudent(student);
//JDBC方式提交
sqlsession.commit();
sqlsession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public Student selectStudentByStuNo(int stuNo) {
Student student = null;
try {
//加载配置文件
InputStream config = Resources.getResourceAsStream("config.xml");
//建立sql会话工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(config);
打开sql会话
SqlSession sqlsession = sessionFactory.openSession();
//调用接口中的方法定位SQL语句
StudentMapper studentmapper = sqlsession.getMapper(StudentMapper.class);
student = studentmapper.selectStudentByStuNo(stuNo);
//JDBC方式提交
sqlsession.commit();
sqlsession.close();
} catch (IOException e) {
e.printStackTrace();
}
return student;
}
@Override
public List<Student> selectAllStudent() {
List<Student> students = null;
try {
//加载配置文件
InputStream config = Resources.getResourceAsStream("config.xml");
//建立sql会话工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(config);
打开sql会话
SqlSession sqlsession = sessionFactory.openSession();
//调用接口中的方法定位SQL语句
StudentMapper studentmapper = sqlsession.getMapper(StudentMapper.class);
students = studentmapper.selectAllStudent();
//JDBC方式提交
sqlsession.commit();
sqlsession.close();
} catch (IOException e) {
e.printStackTrace();
}
return students;
}
}
3、test
package org.ec.test;
import java.util.List;
import org.ec.entity.Student;
import org.ec.mapper.StudentMapper;
import org.ec.mapper.StudentMapperImpl;
import org.junit.Test;
public class StudentMapperTest {
@Test
public void testInsertStudent() {
Student student = new Student(5,"哈哈哈",29);
StudentMapper mapper = new StudentMapperImpl();
mapper.insertStudent(student);
}
@Test
public void testDeleteStudentByStuNo() {
StudentMapper mapper = new StudentMapperImpl();
mapper.deleteStudentByStuNo(5);
}
@Test
public void testUpdateStudent() {
Student student = new Student(4,"哈哈哈",29);
StudentMapper mapper = new StudentMapperImpl();
mapper.updateStudent(student);
}
@Test
public void testSelectStudentByStuNo() {
StudentMapper mapper = new StudentMapperImpl();
Student student = mapper.selectStudentByStuNo(1);
System.out.println(student);
}
@Test
public void testSelectAllStudent() {
StudentMapper mapper = new StudentMapperImpl();
List<Student> students = mapper.selectAllStudent();
for(Student s:students)
System.out.println(s);
}
}