具体的实现步骤:
1、基础环境:MyBatis的jar包、数据库jar包、conf.xml、mapper.xml
2、不同的地方:约定的目标,省略掉statement,根据约定可直接定位到sql语句。
接口中的方法必须遵循一下的约定:
1、方法名和mapper.xml文件中标签的id值相同
2、方法的输入参数和mapper.xml文件中标签的parameterType类型一致,如果没有paramenterType,说明方法没有输入参数。
3、方法的返回值和mapper.xml文件中标签的resultType类型一致。如果没有resultType,说明没有返回值,则方法的返回值类型为void;不管结果集是student还是List,在mapper.xml标签中的resultType只写Student的全类名。
除了以上的约定,除了满足接口中的方法名和Mapper.xml中SQL标签一一对应,还需要满足namespace的值就是接口的全类名。
匹配的过程:
1、根据接口名找到mapper.xml文件(根据namespace=接口的全类名)
2、根据接口的方法名找到mapper.xml文件中的SQL标签(方法名=SQL标签的id值)
通过以上两点就可保证:当我们调用接口中的方法时,程序能自动定位到某一个Mapper.xml文件中的sql标签。
通常将SQL映射文件(mapper.xml)和接口放在同一个包中(注意修改conf.xml中加载mapper.xml文件的路径)
通过以上的约定,即可以通过接口的方法定位到sql语句。
在执行的时候
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
studentMapper.方法名;
通过session对象获取接口,再调用该接口中的方法,程序会自动执行该方法对应的SQL。
优化
1、可以将配置信息单独放在db.properties文件中,然后再动态引入
2、MyBatis设置全局参数,但一般不应修改
在conf.xml中设置
<settings>
<setting name="cacheEnabled" value="false"/>
</settings>
3、设置别名,在conf.xml文件中进行设置
a、设置单个别名
b、批量设置别名
<typeAliases>
<!-- 单个别名,别名忽略大小写 -->
<!-- <typeAlias type="org.yao.entity.Student" alias="student"/>-->
<!-- 批量设置别名,将包中的所有类都设置别名,别名就是类名 -->
<package name="org.yao.entity"/>
</typeAliases>
以下是代码实现
数据库student表
Student实体类
private int stuNo;
private String stuName;
private int stuAge;
private String graName;
db.properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/yq
username=数据库用户名
password=数据库密码
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>
<!-- 将数据库的信息引进来 -->
<properties resource="db.properties"/>
<!-- 全局参数在这里配置,但是一般不要配置
<settings>
<setting name="cacheEnabled" value="false"/>
</settings>
-->
<!-- 设置单个/多个别名 -->
<typeAliases>
<!-- 单个别名,别名忽略大小写 -->
<!-- <typeAlias type="org.yao.entity.Student" alias="student"/>-->
<!-- 批量设置别名,将包中的所有类都设置别名,别名就是类名 -->
<package name="org.yao.entity"/>
</typeAliases>
<environments default="development">
<!-- 开发环境 -->
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 配置数据库信息 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 加载映射文件 -->
<mapper resource="org/yao/mapper/StudentMapper.xml"/>
</mappers>
</configuration>
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">
<!-- namespace是该映射文件的唯一标识符 -->
<!-- namespace和接口的全类名相同,通过接口的全类名来定义到映射文件,标签的id值和接口的方法名相同,通过接口的方法名来找到对应的标签 -->
<mapper namespace="org.yao.mapper.StudentMapper">
<!-- parameterType是输入参数的类型
resultType是返回结果值类型
-->
<select id="queryStudentById" parameterType="int" resultType="student">
select * from student1 where stuno = #{stuno}
</select>
<!-- MyBatis约定输入参数和输出参数在形式上只能有一个 -->
<insert id="addStudent" parameterType="student">
insert into student1(stuno,stuname,stuage,graname) values(#{stuNo},#{stuName},#{stuAge},#{graName})
</insert>
<delete id="deleteStudentByStuno" parameterType="int">
delete from student1 where stuno = #{stuno}
</delete>
<update id="updateStudentByStuno" parameterType="student">
update student1 set stuname=#{stuName},stuage=#{stuAge},graname=#{graName} where stuno=#{stuNo}
</update>
<!-- 不管是否返回一个集合,返回值类型都是student -->
<select id="queryAllStudents" resultType="student">
select * from student1
</select>
</mapper>
StudentMapper.java这是接口文件
package org.yao.mapper;
import java.util.List;
import org.yao.entity.Student;
//a操作MyBatis的接口
public interface StudentMapper {
/*
* 1.方法名和mapper.xml文件中标签的id值相同
* 2.方法的输入参数和mapper.xml文件中标签的parameterType类型一致
* 3.方法的返回值和mapper.xml文件中标签的resultType类型一致
*/
Student queryStudentById(int stuno);
void addStudent(Student student);
void deleteStudentByStuno(int stuno);
void updateStudentByStuno(Student student);
List<Student> queryAllStudents();
}
测试类
package org.yao.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 org.yao.entity.Student;
import org.yao.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);
Student student = studentMapper.queryStudentById(1);
System.out.println(student);
session.close();
}
// 查询全部学生
public static void queryAllStudent() throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
List<Student> students = studentMapper.queryAllStudents();
System.out.println(students);
session.close();
}
// 增加学生
public static void insertStudent() throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
Student student = new Student(3, "ww", 25, "g2");
studentMapper.addStudent(student);
// 注意要提交啊
session.commit();
System.out.println("增加成功");
session.close();
}
// 删除学生
public static void deleteStudent() 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(3);
// 注意要提交啊
session.commit();
System.out.println("删除成功");
session.close();
}
// 修改学生
public static void updateStudent() throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession();
Student student = new Student();
student.setStuNo(2);
student.setStuName("lds");
student.setStuAge(44);
student.setGraName("g1");
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
studentMapper.updateStudentByStuno(student);
// 注意要提交啊
session.commit();
System.out.println("修改成功");
session.close();
}
}