mybatis基本用法
mybatis 架构
mybatis开发dao的方法:
1、原始dao开发方法,需要程序员编写dao接口和实现类,此方法在当前企业中还有使用,因为ibatis使用的就是原始dao开发方法。
2、mapper代理方法,程序员只需要写mapper接口(相当于dao接口),mybatis自动根据mapper接口和mapper接口对应的statement自动生成代理对象(接口实现类对象)。
开发需要遵循规则:
1)mapper.xml中namespace是mapper接口的全限定名
2)mapper.xml中statement的id为mapper接口方法名
3)mapper.xml中statement的输入映射类型(parameterType)和mapper接口方法输入参数类型一致
4) mapper.xml中statement的输出映射类型(resultType)和mapper接口方法返回结果类型一致
传入多个参数的情况
方案1
public List<XXXBean> getXXXBeanList(String xxId, String xxCode);
<select id="getXXXBeanList" resultType="XXBean">
select t.* from tableName where id = #{0} and name = #{1}
</select>
由于是多参数那么就不能使用parameterType, 改用#{index}是第几个就用第几个的索引,索引从0开始
方案2(推荐)基于注解
public List<XXXBean> getXXXBeanList(@Param("id")String id, @Param("code")String code);
<select id="getXXXBeanList" resultType="XXBean">
select t.* from tableName where id = #{id} and name = #{code}
</select>
由于是多参数那么就不能使用parameterType, 这里用@Param来指定哪一个
三、Map封装多参数:
public List<XXXBean> getXXXBeanList(HashMap map);
<select id="getXXXBeanList" parameterType="hashmap" resultType="XXBean">
select 字段... from XXX where id=#{xxId} code = #{xxCode}
</select>
其中hashmap是mybatis自己配置好的直接使用就行。map中key的名字是那个就在#{}使用那个,map如何封装就不用了我说了吧。
resultType和resultMap都可以完成输出映射:
resultType映射要求sql查询的列名和输出映射pojo类型的属性名一致
resultMap映射时对sql查询的列名和输出映射pojo类型的属性名作一个对应关系。
动态sql:
#{}和${}完成输入参数的属性值获取,通过OGNL获取parameterType指定pojo的属性名。
#{}:占位符号,好处防止sql注入
${}:sql拼接符号
步骤:
1、编写SqlMapConfig.xml
2、编写mapper.xml
定义了statement
3、编程通过配置文件创建SqlSessionFactory
4、通过SqlSessionFactory获取SqlSession
5、通过SqlSession操作数据库
如果执行添加、更新、删除需要调用SqlSession.commit()
6、SqlSesion使用完成要关闭
首先创建dao层接口和相关方法
package com.dao; import java.awt.List; import org.apache.ibatis.annotations.Param; import com.pojo.User; public interface IUserDao { User getUserById(@Param(value = "id") int id); // User getUserByName(String username); void deleteByid(int id); void insert(User u); java.util.List<User> getUsers(); }
其次 在IUserDao.xml 中写相关的方法的实现
1 2 | <!-- namespace 表示命名空间 必须和 该mapper对应的接口的全路径 --> <mapper namespace= "com.dao.IUserDao" > |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | <?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" > <!-- namespace 表示命名空间 必须和 该mapper对应的接口的全路径 --> <mapper namespace= "com.dao.IUserDao" > <!-- id表示 标号 必须和接口的方法一致 --> <!-- #里面的变量名 必须和方法里面参数一致 --> <!-- resultType 返回类型 必须数据库字段和属性名相同才可以赋值 --> <resultMap type= "com.pojo.User" id= "uid" > <id property= "userId" column= "user_id" /> <!-- 名字不一样必须配置 名字一样 可以不配的 --> </resultMap> <select id= "getUserById" resultMap= "uid" > select * from user where user_id =#{id} ; </select> <!-- # id和方法id一样就可以了 但是 $ 最后和 @param 一起使用 指定名字 --> <select id= "getUserByName" resultType= "com.pojo.User" > select * from user where username =#{username} ; </select> <delete id= "deleteByid" > delete from user where user_id =#{id} </delete> <!-- 如果穿入对象的时候 我们写法 直接写#{该 class 属性的属性} --> <insert id= "insert" parameterType= "com.pojo.User" keyProperty= "userId" useGeneratedKeys= "true" > insert into user values( null ,#{username}, 1 ); </insert> <!-- 返回list 跟返回单个是一样的 resultMap--> <select id= "getUsers" resultMap= "uid" > select * from user ; </select> </mapper> |
按照上面的架构具体操作如下:
1 SqlMapConfig.xml的配置 包含两个部分 1mybatis全局配置 ,运行环境 2 mapper.xml(<mapper resource="com/dao/UserMapper.xml" />)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" > <configuration> <settings> <setting name= "logImpl" value= "STDOUT_LOGGING" /> <!-- 全局配置参数 --> <!-- 延迟加载总开关 --> <setting name= "lazyLoadingEnabled" value= "true" /> <!-- 设置按需加载 --> <setting name= "aggressiveLazyLoading" value= "true" /> <!-- 开启二级缓存 --> <setting name= "cacheEnabled" value= "true" /> </settings> <!-- 和spring整合后 environments配置将废除 --> <environments default = "development" > <environment id= "development" > <transactionManager type= "JDBC" /> <dataSource type= "POOLED" > <property name= "driver" value= "com.mysql.jdbc.Driver" /> <property name= "url" value= "jdbc:mysql://localhost:3306/test" /> <property name= "username" value= "root" /> <property name= "password" value= "mysql" /> </dataSource> </environment> </environments> <!--加載mapper.xml --> <mappers> <mapper resource= "com/dao/UserMapper.xml" /> </mappers> </configuration> |
2 创建测试类
注意 : 在执行增加,修改,删除等操作的时候应该要手动提交事务,
Resources.getResourceAsReader加载文件时 默认在src目录下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import java.io.Reader; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import com.dao.IUserDao; import com.pojo.User; public class Test1Hello { public static void main(String[] args) throws Exception { // 1加载核心配置文件 Reader inputStream = org.apache.ibatis.io.Resources.getResourceAsReader( "SqlMapConfig.xml" ); // 2获取Factory SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream); // 获取session // SqlSession session = sf.openSession(); IUserDao userDao = session.getMapper(IUserDao. class ); User u = userDao.getUserById( 6 ); System.out.println( "==========" + userDao.getUsers()); // System.out.println(u.getUsername()); // 删除操作 以及插入 需要提交事务 // userDao.deleteByid(4); // session.commit(); // 插入 // User insertUser = new User(1, "cca"); // userDao.insert(insertUser); // System.out.println(insertUser.getUserId()); // session.commit(); // 查询所有的时候 } } |
主键返回:
1 2 3 4 5 6 | <!-- 如果穿日入对象的时候 我们写法 直接写#{该 class 属性的属性} --> <insert id= "insert" parameterType= "com.pojo.User" keyProperty= "userId" useGeneratedKeys= "true" > insert into user values( null ,#{username}, 1 ); </insert><br><br> |
#{}
表示一个占位符,向占位符输入参数,mybatis自动进行java类型和jdbc类型的转换。
程序员不需要考虑参数的类型,比如:传入字符串,mybatis最终拼接好的sql就是参数两边加单引号。
#{}接收pojo数据,可以使用OGNL解析出pojo的属性值
${}
表示sql的拼接,通过${}接收参数,将参数的内容不加任何修饰拼接在sql中。
${}也可以接收pojo数据,可以使用OGNL解析出pojo的属性值
缺点:不能防止sql注入。
输入和输出映射[重要]
通过parameterType完成输入映射,通过resultType和resultMap完成输出映射。
resultType :指定输出结果的类型(pojo、简单类型、hashmap..),将sql查询结果映射为java对象 。
使用resultType注意:sql查询的列名要和resultType指定pojo的属性名相同,指定相同 属性方可映射成功,如果sql查询的列名要和resultType指定pojo的属性名全部不相同,list中无法创建pojo对象的。
resultMap:将sql查询结果映射为java对象。
如果sql查询列名和最终要映射的pojo的属性名不一致,使用resultMap将列名和pojo的属性名做一个对应关系 (列名和属性名映射配置)
Collection里面的值表示类型,和mapper.java里面的属性无关
使用foreach遍历list:
<delete id="deleteByids">
delete from user where user_id in (
<foreach collection="list" item="item" separator=",">
#{item}
</foreach>
)
</delete>
自定义别名
使用别名
在parameterType、resultType中使用别名:
ResultMap的用法
where if 用法
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 从零开始:基于 PyTorch 的图像分类模型
· [WPF] 在RichTextBox中输出Microsoft.Extension.Logging库的
· 一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1