Mybatis中什么是约定编程呢?
就是你在编程的过程中遵循它的规定,然后让它去帮你做事情;
从上一篇的文章案例中我们发现,每次都需要去手动的写statement,这是很麻烦的,那么我们来看看这种约定的接口编程。
也就是我们常说的接口映射: 接口的名字为namespace的名字,接口的方法名字为标签id的名字,这样的话一个方法就对应了一个sql了,这些方法都不需要你去自己实现,由mybaits为你自动实现的,这就是约定。
上案例
在上一篇文章的基础上我们来看看:
配置文件中我们通过了<properties>标签导入了db.properties文件,以达到将数据源存放在一个文件中,方便修改。
<?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>
</settings> -->
<!-- 单个设置别名或批量设置别名 -->
<typeAliases>
<!-- 单个 -->
<typeAlias type="Pojo.User" alias="user"/>
<!-- 批量-->
<!-- <package name="Pojo"/> -->
</typeAliases>
<!--内置的类型处理器 -->
<environments default="development">
<environment id="development">
<!-- 事务处理JDBC -->
<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="Mapper/UserMapperTest.xml" />
</mappers>
</configuration>
我们需要由一个接口去映射Mapper文件,因此建一个包里面放对应的接口与mapper文件
package Mapper;
import Pojo.User;
/**
* @author 红星
* 这是约定 主要是为了简化statement
* 1. 方法名字和mapper文件中的id值是相同的
* 2. 参数与标签中的参数值是一样的
* 3. 就是返回值和出入值
* 4. 如何去找某个mapper文件呢,接口名字就是相对应的mapper文件
*/
public interface UserMapperTest {
//接口中的方法默认public abstract
/*
* 过程就是根据接口名找namespace
* 根据方法名找id
* 根据输入输出确定一条sql
* Mapper文件 与接口放一个里面
*/
User selectUserbyid(int id);
//selectall();
}
这样的话我们在测试的时候只需要如下
package 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 Mapper.UserMapperTest;
import Pojo.User;
public class test {
/**
* @param args
* @throws IOException
*
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//需要加载数据源,加载config文件
Reader reader = Resources.getResourceAsReader("Mybaitis_config.xml");
//SqlSessionFactory
SqlSessionFactory sessionfactroy = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionfactroy.openSession();
// 查id为1的值
UserMapperTest usermapper = session.getMapper(UserMapperTest.class);
User user = usermapper.selectUserbyid(1);
System.out.println(user.toString());
session.close();
}
}
这里通过session.getmapper(),反射传入接口类,得到一个mapper对象,去调用方法,这样的话就不用我们一直去手动的写一个statement了 ,方便了许多,而且接口里门的方法本身也不需要我们自己去实现。