在Mybaits(二)中,使用的是基本方式来实现对数据库的增删改查(DRUD)操作,接下来尝试使用动态代理方式。
- 在基本方式中,需要通过命名空间
namespace
和mapper的id
值来确定sql; - 而在动态代理方式中,可以省略掉
statement
,根据约定直接定位sql。
如何使用动态代理方式
首先要建立接口,接口中必须遵循以下三个约定
- 方法名和mapper.xml文件中的标签的id
值相同
- 方法的输入参数和mapper.xml文件中标签的parameterType
类型一致
- 方法的返回值和mapper.xml文件中标签的resultType
类型一致
除了以上约定,还需要namespace
的值和接口的全类名一致
如下所示
匹配的过程:
- 根据接口名找到映射文件(根据的是namespace=接口全类名)
- 根据接口的方法名找到映射文件中的SQL标签(方法名=SQL标签id值)
以上2点可以保证:当我们调用接口中的方法时,程序能自动定位到某一个mapper.xml文件中的SQL标签
在测试类中,不需要使用statement,而是找接口StudentMapper,测试类的主要内容如下所示
工程实践
- 我们在MybatisProject2基础上进行修改,项目主要结构如下所示
- 映射文件Mapper-interface.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.santiago.mapper.StudentMapper">
<select id="queryStudentByStuNo" resultType="com.santiago.maven.Student" parameterType="int">
select * from student where stuno = #{stuno}
</select>
<insert id="addStudent" parameterType="com.santiago.maven.Student">
insert into student(stuno,stuname,stuage,gradename) values(#{stuNo},#{stuName},#{stuAge},#{gradeName})
</insert>
<delete id="deleteStudentByStuNo" parameterType="int">
delete from student where stuno = #{stuno}
</delete>
<update id="updateStudentByStuNo" parameterType="com.santiago.maven.Student">
update student set stuname = #{stuName}, stuage = #{stuAge}, gradename = #{gradeName} where stuno = #{stuNo}
</update>
<select id="queryAll" resultType="com.santiago.maven.Student">
select * from student
</select>
</mapper>
- 接口StudentMapper.java的内容如下所示
package com.santiago.mapper;
import com.santiago.maven.Student;
import java.util.List;
public interface StudentMapper {
//接口中的方法默认是抽象的,public abstract可以省略
public abstract Student queryStudentByStuNo(int stuno);
public abstract void addStudent(Student student);
public abstract void deleteStudentByStuNo(int stuno);
public abstract void updateStudentByStuNo(Student student);
public abstract List<Student> queryAll();
}
- 注意修改conf.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="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--配置数据库信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3307/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载映射文件-->
<mapper resource="mappers/Mapper-interface.xml"/>
</mappers>
</configuration>
- 测试类Test_interface.java的内容如下所示
package com.santiago.maven;
import com.santiago.mapper.StudentMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
public class Test_interface {
public static void queryStudentByStuNo(){
InputStream stream = Student.class.getClassLoader().getResourceAsStream("conf.xml");
SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(stream);
SqlSession session=ssf.openSession();
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
Student student = studentMapper.queryStudentByStuNo(1);
session.commit();
System.out.println(student);
session.close();
}
public static void queryAll(){
InputStream stream = Student.class.getClassLoader().getResourceAsStream("conf.xml");
SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(stream);
SqlSession session=ssf.openSession();
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
List<Student> students = studentMapper.queryAll();
System.out.println(students);
session.close();
}
public static void addStudent(){
Student stu = new Student(3,"lc",19,"1");
InputStream stream = Student.class.getClassLoader().getResourceAsStream("conf.xml");
SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(stream);
SqlSession session=ssf.openSession();
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
studentMapper.addStudent(stu);
session.commit();
session.close();
}
public static void deleteStudentByStuNo(){
InputStream stream = Student.class.getClassLoader().getResourceAsStream("conf.xml");
SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(stream);
SqlSession session=ssf.openSession();
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
studentMapper.deleteStudentByStuNo(3);
session.commit();
session.close();
}
public static void updateStudentByStuNo(){
Student stu = new Student(2,"wql",18,"yanyi");
InputStream stream = Student.class.getClassLoader().getResourceAsStream("conf.xml");
SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(stream);
SqlSession session=ssf.openSession();
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
studentMapper.updateStudentByStuNo(stu);
session.commit();
session.close();
}
public static void main(String[] args) {
queryAll();
updateStudentByStuNo();
queryAll();
......
}
}