本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等,如果刚开始学习Java的小伙伴可以点击下方连接查看专栏
本专栏地址:JavaWeb
Java入门篇: Java基础学习篇
Java进阶学习篇(持续更新中):Java进阶学习篇
在前面使用MyBatis优化了JDBC代码以后,仍然存在着一些问题,比如下面这两行代码也存在着硬编码问题,这里调用 selectList()
方法传递的参数是映射配置文件中namespace.id
值,这样写也不便于后期的维护,所以要使用Mapper代理来解决问题,并简化代码
//执行SQL
List<User> user = sqlSession.selectList("test.selectALL");
//打印结果
System.out.println(user);
上一篇文章传送门:JavaWeb-MyBatis | MyBatis简介及入门案例详解
使用Mapper代理方式,必须满足以下要求:定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
由于我们会把配置文件单独放在一个文件夹中,又想要把Mapper的配置文件(UserMapper.xml)
和接口文件(UserMapper
)放在一起,所以要保证其目录相同,由于是新建目录,所以要写成com/itheima/mapper
才能创建,但在IDEA中显示的还是com.itheima.mapper
便于查看是否在同一目录下
这里直接选中我们要移动的Mapper的配置文件(UserMapper.xml)
移动到刚刚新建好的目录下即可,直接摁回车确认就可以了
这里我们要把namespace改一下,设置SQL映射文件的namespace属性为Mapper接口全限定名,这里要注意不需要写根路径,只要写在这个项目中哪个包下的即可
<mapper namespace="com.itheima.mapper.UserMapper">
在这里只需要compile一下项目,然后再去查看生成的Mapper的配置文件(UserMapper.xml)
和接口文件(UserMapper
)是否在一个目录下MyBatisDemo\target\classes\com\itheima\mapper
;注意是在target目录下的mapper文件夹中,具体效果如下图所示
接口命名一般为表的名字+Mapper ,所以这里接口的名字命名为UserMapper
接口文件一般存放在mapper包下,即域名下再新建一个包,因此在新建的时候可以选中Java包,右键新建Java类,并输入com.itheima.mapper.UserMapper
语句的含义为:将SQL语句执行完毕后查询到的结果封装到一个集合中,集合的名字应该与我们新建的实体类(类中的成员属性与表中字段一致)
package com.itheima.mapper;
import com.itheima.pojo.User;
import java.util.List;
public interface UserMapper {
List<User> selectALL();
}
这里与前面不同的是执行SQL语句可以省略,取而代之的是获取UserMapper接口代理对象,如果不知道左边写什么,可以直接使用快捷键Ctrl+Alt+V
快速生成左边,然后再自己修改变量名或者选择提示的变量名
package com.itheima;
import com.itheima.mapper.UserMapper;
import com.itheima.pojo.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MyBatisDemo2 {
public static void main(String[] args) throws IOException {
//加载MyBatis的核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//SqlSession获取对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取UserMapper接口代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectALL();
//打印结果
System.out.println(users);
//释放资源
sqlSession.close();
}
}