mapper动态代理方式CRUD
1.原则:约定优于配置
配置方式:
abc.xml中
myProject
硬编码方式
abc.java中
Configuration conf = new Configuration();
con.setName(“myProject”);
约定:默认值就是myProject
2.具体实现步骤
1.基础环境:mybatis.java,jdbc.jar,conf.xml.mapper.xml
2.不同之处
约定的目标,省略掉statement,根据约定直接可以定位出SQL语句
a.接口 需要满足的约定
1.方法名与mapper.xml文件中标签的id值相同
2.方法的输入参数与mapper.xml文件中标签的parameterType类型一致(如果mapper.xml标签中没有parameterType,则说明方法没有输入参数)
3.方法的返回值与mapper.xml文件中标签的resultType类型一致(mapper标签中resultType不论查询结果一个还是多个,在mapper.xml的resultType中都写一个)
4.mapper.xml中的namespace值==接口全类名 (实现接口中的方法和Mapper.xml中SQL标签一一对应)
附上项目代码:项目下载地址
//mapper.xml中的代码
<select id="queryStudentByStuno" parameterType="int" resultType="person.demo.entity.Student">
select * from student where stuno = #{stuno}
</select>
//java接口中的代码
public abstract Student queryStudentByStuno(int stuno);
匹配过程
根据接口名的全类名->>到namespace相同的mapper文件
根据接口的方法名->>找到mapper文件中的sql标签 (方法名==SQL标签的id值)
(习惯:接口与mapper文件在同一个包内)
测试类
//简单查询实现
package person.demo.test;
import java.io.IOException;
import java.io.Reader;
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 person.demo.entity.Student;
import person.demo.mapper.StudentMapper;
public class Test {
//查询一个学生
public static void queryStudentByStuno() throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
System.out.println(studentMapper.queryStudentByStuno(1).toString());
session.close();
}
//查询全部学生
public static void queryAllStudents() throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactoty = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactoty.openSession();
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
List<Student> students = studentMapper.queryAllStudents();
System.out.println(students.toString());
session.close();
}
//添加学生
public static void addStudents() throws IOException {
Student student = new Student(5 , "wr" , 22 , "g4");
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
studentMapper.addStudent(student);
session.commit();
session.close();
}
//删除学生
public static void deleteStudents() throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
studentMapper.deleteStudentByStuno(5);
session.commit();
session.close();
}
//修改学生
public static void updateStudents() throws IOException {
Student student = new Student(4 , "ll" , 20 , "g4" );
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
studentMapper.updateStudentByStuno(student);
session.commit();
session.close();
}
public static void main(String[] args) throws IOException {
queryAllStudents();
addStudents();
queryAllStudents();
updateStudents();
deleteStudents();
queryAllStudents();
queryStudentByStuno();
}
}
Mapper接口
package person.demo.mapper;
import java.util.List;
import person.demo.entity.Student;
//操作mybatis的接口
public interface StudentMapper {
/*
* 1.方法名与mapper.xml文件中标签的id值相同
* 2.方法的输入参数与mapper.xml文件中标签的parameterType类型一致
* 3.方法的返回值与mapper.xml文件中标签的resultType类型一致
*/
//通过学号查询
Student queryStudentByStuno(int stuno);
//查询全部
List<Student> queryAllStudents();
//增加
void addStudent(Student student);
//删除
void deleteStudentByStuno(int stuno);
//修改
void updateStudentByStuno(Student student);
}
mapper.xml
package person.demo.mapper;
import java.util.List;
import person.demo.entity.Student;
//操作mybatis的接口
public interface StudentMapper {
/*
* 1.方法名与mapper.xml文件中标签的id值相同
* 2.方法的输入参数与mapper.xml文件中标签的parameterType类型一致
* 3.方法的返回值与mapper.xml文件中标签的resultType类型一致
*/
//通过学号查询
Student queryStudentByStuno(int stuno);
//查询全部
List<Student> queryAllStudents();
//增加
void addStudent(Student student);
//删除
void deleteStudentByStuno(int stuno);
//修改
void updateStudentByStuno(Student student);
}
实体类Student
package person.demo.entity;
public class Student {
private int stuNo;
private String stuName;
private int stuAge;
private String graName;
public Student(int stuNo, String stuName, int stuAge, String graName) {
super();
this.stuNo = stuNo;
this.stuName = stuName;
this.stuAge = stuAge;
this.graName = graName;
}
public Student() {
}
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getStuAge() {
return stuAge;
}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
public String getGraName() {
return graName;
}
public void setGraName(String graName) {
this.graName = graName;
}
@Override
public String toString() {
return "Student [stuNo=" + stuNo + ", stuName=" + stuName + ", stuAge=" + stuAge + ", graName=" + graName + "]";
}
}
优化
- 可将配置信息单独放入db.properties文件中,然后再动态引入
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
username = ***
password = ***
- MyBatis全局参数设置
再conf.xml中设置
在configuration标签内添加例如:
(最好不要添加修改)
<settings>
<setting name="cacheEnabled" value="false"/>
<setting name="***" value="***"/>
</settings>