规则:
-
定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
-
设置SQL映射我呢见的namespace属性为Mapper接口的全限定名
-
在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
-
编码:
-
通过SqlSession的getMapper方法获取Mapper接口的代理对象
-
调用对应方法完成sql的执行
-
细节:若Mapper接口名称和SQL映射文件名称相同,并且在同一目录下,则可以使用包扫描的方式优化SQL映射文件的加载
<mappers> <package name="com.zkw.mapper"> </mappers>
sql片段
<sql id="brand_column"> id,brand_name as brandName,ordered,status </sql> <select id="selectAll" resultType="brand"> select <includ refid="brand_column"/> from tb_brand; </select>
比sql片段更灵活的 resultMap
<resultMap id="brandResultMap" type="brand"> <result column="brand_name" property="brandName"/> </resultMap> <select id="selectAll" resultMap="brandResultMap"> select * from tb_brand; </select>
参数占位符
1.#{}:执行SQL时,会将#{}占位符替换为?,将来自动设置参数值 2.${}:拼SQL,会存在SQL注入问题
参数接收
-
散装参数:如果方法中有多个参数,需要使用@Param(”SQL参数占位符名称")
List<Brand> selectByCondition(@Param("status") int status,@Param("companyName") String companyName);
-
封装参数
List<Brand> selectByCondition(Brand brand); //封装对象 Brand brand = new Brand(); brand.setStatus(status); brand.setCompanyName(companyName); brand.setBrandName(brandName);
4.Map
假设,我们的实体类,或者数据库中的表,字段或参数过多,我们应当考虑使用Map
//万能的Map int addUser2(Map<String,Object> map);
@Test public void addUser2() { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); Map<String, Object> map = new HashMap<String, Object>(); map.put("userid",5); map.put("password","2222333"); mapper.addUser2(map); sqlSession.close(); }
Map传递参数,直接在sql中取出key即可
对象传递参数,直接在sql中取对象的属性即可
只有一个基本类型参数的情况下,可以在sql中直接取到
5.Mybatis核心配置文件
注:配置各个标签的时候要遵守前后顺序
Mybatis核心配置文件的底层结构如下:
-
configuration(配置)
-
properties(属性)
-
setting(设置)
-
typeAliases(类型别名)
-
typeHandlers(类型处理器)
-
obecjFactory(对象工厂)
-
plugins(插件)
-
environments(环境配置)
-
environment(环境变量)
-
transactionManager(事务管理器)
-
dataSource(数据源)
-
-
databaseldProvider(数据库厂商表示)
-
mappers(映射器)
-
别名类型
<typeAliases> <package name="com.zkw.pojo"/> <typeAliases>
6.动态条件查询
SQL语句会随着yoghurt的输入或外部条件的变化而变化,我们称为动态SQL
<!-- 动态条件查询 * if:条件判断 * test:逻辑表达式 * 问题: 若缺少status,会导致sql语法错误 * 恒等式解决 --> <select id="selectByCondition" resultMap="brandResultMap"> select * from tb_brand where 1 = 1 //恒等式 <if test="status != null"> and status = #{status} </if> <if test="companyNmae != null and companyName ! = ''"> and company_name like #{companyName} </if> </select>
单条件动态查询
<select id="selectByCondition" resultMap="brandResultMap"> select * from tb_brand where <choose><!--相当于switch--> <when test="status != null"><!--相当于case--> status = #{status} </when> <when test="companyNmae != null and companyName ! = ''"> company_name = #{companyName} </when> </select>
动态修改的话用set标签
7.注解开发
使用注解的话,就不用再写相关的xml文件
@Select(select * from tb_brand where id = #{id}) public User selectById(int id);
使用注解完成简单的sql语句,复杂的语句,使用xml完成