Mybatis开发Dao
一、Mybatis进行原始的Dao开发
原始Dao开发需要编写Dao接口和Dao实现类,步骤如下:
1、Dao接口
public interface UserDao { public User findUserById(int id); }
2、Dao实现类
public class UserDaoImpl implements UserDao { SqlSessionFactory sqlSessionFactory; public UserDaoImpl(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory=sqlSessionFactory; } @Override public User findUserById(int id) { SqlSession sqlSession=sqlSessionFactory.openSession(); User user=sqlSession.selectOne("test.findUserById", id); sqlSession.close(); return user; } }
3、映射文件
<?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"> <mapper namespace="test"> <select id="findUserById" parameterType="int" resultType="com.test.pojo.User"> select * from user where id=#{id} </select> </mapper>
4、加载映射文件
<mappers> <mapper resource="User.xml"/> </mappers>
原始的Dao开发存在两个问题:
1、Dao方法体存在重复代码:通过SqlSessionFactory创建SqlSession。
2、调用sqlSession的数据库操作方法需要指定statement的id,这里存在硬编码,不得于开发维护。
二、Mapper动态代理方式
1、实现原理
该种方式只需要编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上面的Dao接口实现类方法。
Mapper接口开发需要遵循的规范:
1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同。
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同。
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同。
2、实现步骤
1、Mapper接口
注意:Mapper接口需要满足上述2、3、4三个条件,内容如下:
2、Mapper.xml映射文件
新建UserMapper.xml文件,内容同User.xml,但是要修改namespace为mapper接口的类路径。
3、加载UserMapper.xml文件
<mappers> <mapper resource="UserMapper.xml"/> </mappers>
4、测试代码
public class UserMapperTest { private SqlSessionFactory sqlSessionFactory; @Before public void setUp() throws IOException { String resource="SqlMapConfig.xml"; InputStream inputStream=Resources.getResourceAsStream(resource); sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindUserById() { SqlSession sqlSession=sqlSessionFactory.openSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); User user=userMapper.findUserById(5); System.out.println(user); sqlSession.close(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗