MyBatis学习day3-Mapper动态代理dao层
之前我们已经学习了通过使用SqlSession提供的各种方法指定某一个Mapper中的sql语句进行各种各样的数据库操作,但是这样的方法并不是很方便,由于是通过字符串的形式指定各种数据库操作标签的id,所以要预先知道Mapper.xml文件中有哪些sql语句;其次调用不同Mapper中的语句时还要加不同的文件名前缀,比较繁琐,所以今天提供了一种新的方式来简化Dao层开发
1.为每个Mapper.xml文件创建对应的接口
首先我们在src下创建com.mybatis.Mapper(改了改了,叫MapInterface好了,不然名字重复总感觉不太舒服,下面图还没改回来,先不用管) 包,用于创建各种Mapper接口。然后我们在这个包里面新建一个接口叫UserMapper,如下图
接下来我们怎么让接口与xml文件联系起来呢?我们需要在xml文件中,在mapper标签中设定namespace属性为接口的全包名,如下图(这个.java的后缀不用写奥、刚开始我搞错了)
2.将xml文件中的sql语句id存放到接口中
做完上述准备工作以后,我们就可以在接口中声明方法指定对应的sql语句了,声明的方法名要与对应sql语句的id相同,返回类型与参数类型也要相同,最后的UserMapper接口如下所示
package com.mybatis.Mapper;
import com.mybatis.beans.User;
import java.util.List;
public interface UserMapper {
public User selectUserById(Integer id);
public List<User> selectUserByName(String username);//返回多个结果时用List
public void insertUser(User u);
public void updateUser(User u);
public void deleteUserById(User u);
}
3.Mapper接口的使用
接着我们就来看看这个接口是如何用来执行sql语句的;
首先我们按照常规的方式得到SqlSession实例,然后调用session的getMapper()函数,其内部会自动生成一个实现对应接口的对象实例,用xml文件中的sql语句重写接口的方法,这个时候我们就可以直接使用了,具体代码如下:
package com.mybatis.test;
import com.mybatis.Mappers.UserMapper;
import com.mybatis.beans.User;
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.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class HelloMyBatis {
//入门程序 通过ID查询用户
@Test
public void test() throws IOException {
//读取配置文件
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
//生成sqlSessionFactoryBuilder
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//创建sqlSessionFactory
SqlSessionFactory factory=builder.build(in);
//生产一个sqlSession
SqlSession session=factory.openSession();
//操作数据库
UserMapper um=session.getMapper(UserMapper.class);
System.out.println("条件查询");
System.out.println("------------------");
User u=um.selectUserById(1);
System.out.println(u);
System.out.println("模糊查询");
System.out.println("------------------");
List<User> arr=um.selectUserByName("王");
for(User temp:arr){
System.out.println(temp);
}
//另外两个方法就不展示了,类似
}
}
最后的结果如下所示