mybatis基于接口的增删改查
mybatis的mapper映射文件
MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。
001-保存操作
1 2 3 4 5 | <insert id= "saveUser" parameterType= "com.po.pf.domain.User" > insert into user(username,address,sex,birthday) values (#{username},#{address},#{sex},#{birthday}); </insert> |
002-修改操作
1 2 3 4 5 6 7 8 | <update id= "updateUser" parameterType= "com.po.pf.domain.User" > update user set username=#{username}, address=#{address}, sex=#{sex}, birthday=#{birthday} where id=#{id} </update> |
003-删除操作
1 2 3 | <delete id= "deleteUser" parameterType= "java.lang.Integer" > delete from user where id = #{uid} </delete> |
这里面的parameterType既可以写int也可以写java.lang.Integer
004-查询一条数据
1 2 3 | <select id= "findById" parameterType= "int" resultType= "com.po.pf.domain.User" > select * from user where id = #{uid} </select><select id= "selectStudent2" parameterType= "int" resultType= "hashmap" > <br>SELECT * FROM student WHERE ID = #{id} <br></select> <br><br>Student selectStudent1(Integer id); <br><br>HashMap selectStudent2(Integer id); |
005-根据名称查询
1 2 3 4 5 | List<User> findByName1(String username); <select id= "findByName1" parameterType= "string" resultType= "com.po.pf.domain.User" > select * from user where username =#{username} </select> |
#{}
使用#{}语法将使MyBatis生成PreparedStatement属性,并根据PreparedStatement参数(例如?)安全地设置值 动态解析为: select * from user where username = ?;
在mybatis是下面执行的
${}:字符串替换
这种方式只会做简单的字符串替换,在动态SQL解析阶段将会进行变量替换,假如传递的参数为H1,最终处理结果如下:select * from t_user where username = 'H1' ;
在mybatis是下面执行的
在mapper.xml中使用${}时,必须要利用一个对象封装一下你要传的参数(或者利用注解参数来实现),
如果直接在mapper接口中定义String类型的参数,不封装一层对象,报错(String 里面没有当前传递的参数属性 也可以利用mybatis提供给我们的参数注解@param("value")
1 2 3 4 5 | List<User> findByName2( @Param ( "username" ) String username); <select id= "findByName2" parameterType= "String" resultType= "com.po.pf.domain.User" > select * from user where username = '${username}' </select> |
这样也能执行成功
但是如果我们这样写 那就会有问题
1 2 3 | <select id= "findByName2" parameterType= "String" resultType= "com.po.pf.domain.User" > select * from user where username = ${username} </select> |
我们的调用方法
List<User> users = userRepository.findByName2("小二王");
006-模糊查询
1 2 3 4 5 | List<User> findByName3( @Param ( "username" ) String username); <select id= "findByName3" parameterType= "String" resultType= "com.po.pf.domain.User" > select * from user where username = '%${username}%' </select> |
或者我们也可以这么写
1 2 3 4 5 | List<User> findByName4(String username); <select id= "findByName4" parameterType= "String" resultType= "com.po.pf.domain.User" > select * from user where username like '%${value}%' </select> |
mybatis在TextSqlNode类对value进行封装了
或者也可以这么写
1 2 3 4 5 | List<User> findByName5(String username); <select id= "findByName5" parameterType= "String" resultType= "com.po.pf.domain.User" > select * from user where username like concat( '%' , #{value,jdbcType=VARCHAR} , '%' ) </select> |
007-查询用户的总记录数
1 2 3 | <select id= "findTotal" resultType= "int" > select count(id) from user; </select> |
008-mybatis保存获取数据的id
常规的save操作 我们是获取不到数据的id
System.out.println("保存操作之前:"+user);
//5.执行保存方法
userRepository.saveUser(user);
System.out.println("保存操作之后:"+user.getId());
对于不支持自增型主键的数据库(例如 Oracle),则可以使用 selectKey 子元素:selectKey 元素将会首先运行,id 会被设置,然后插入语句会被调用配置后
比如select employee_seq.nextval from dual
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <!--mybatis保存获取数据的id--> <insert id= "saveUser1" parameterType= "com.po.pf.domain.User" > <!-- 配置插入操作后,获取插入数据的id --> <selectKey keyProperty= "id" keyColumn= "id" resultType= "int" order= "AFTER" > select last_insert_id(); </selectKey> insert into user(username,address,sex,birthday) values (#{username},#{address},#{sex},#{birthday}); </insert> 对于自增型的我们可以这样获取 <insert id= "saveUser1" parameterType= "com.po.pf.domain.User" useGeneratedKeys= "true" keyColumn= "id" keyProperty= "id" > <!-- 配置插入操作后,获取插入数据的id --> insert into user(username,address,sex,birthday) values (#{username},#{address},#{sex},#{birthday}); </insert> |
System.out.println("保存操作之前:"+user);
//5.执行保存方法
userRepository.saveUser1(user);
System.out.println("保存操作之后:"+user.getId());
打印结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY