一、select
XML
<mapper namespace="mapper接口类">
<!-- 注意:mapper接口不能重载,因为mapper.xml根据方法名识别。 无法识别重载方法-->
<select id="mapper接口的方法名" resultType="返回值类型">
select emp_id empId, emp_name empName, emp_salary empSalary from t_emp where emp_id=#{empId}
</select>
</mapper>
示例:
XML
<mapper namespace="com.gcy.mapper.EmployeeMapper">
<!-- 注意:mapper接口不能重载,因为mapper.xml根据方法名识别。 无法识别重载方法-->
<select id="queryById" resultType="com.gcy.pojo.Employee">
select emp_id empId, emp_name empName, emp_salary empSalary from t_emp where emp_id=#{empId}
</select>
</mapper>
java
public interface EmployeeMapper {
Employee queryById(Integer id);
}
二、 #{key} 和 ${key} 的区别;传入对象、map时的取值规则;@Param的使用时机
java
<mapper namespace="com.xx.mapper.EmployeeMapper(mapper接口类的全路径)">
<!--
#{key}和${key}的区别:
#{ key }:占位符 + 赋值 sql先添加占位符,emp_id=? 然后给?占位符取值。
${key}:字符串拼接, "emp_id=" + id
推荐使用#{key} 防止【sql注入攻击】的问题
? 只能替代值的位置,不能替代容器名(标签,列名,sql关键字) emp_id=? 不能写成?=?
方法名(cName,cValue)
select * from t_emp where 列名是动态的${cName} = 动态列值#{cValue}
总结:动态值使用#{key}。 动态的列名、容器名 关键字用 ${key}
-->
<select id="queryById" resultType="com.xxx.pojo.Employee(返回值类型)">
select emp_id empId, emp_name empName, emp_salary empSalary from t_emp where emp_id=${empId}
</select>
<!-- 场景1:传入的单个简单类型,key随便写一般情况下推荐使用参数名-->
<delete id="deleteById">
delete from t_emp where id = #{id}
</delete>
<select id="queryBySalary" resultType="com.xxx.pojo.Employee">
select emp_id empId, emp_name empName, emp_salary empSalary from t_emp where emp_salary=${salary}
</select>
<!-- 场景2:传入的是一个实体对象
key=实体对象的变量名
-->
<insert id="insertEmp">
insert into t_emp (emp_name,emp_salary) values (#{empName},#{empSalary})
</insert>
<!-- 场景3:传入多个简单类型数据如何取值 key
不能随便写
不能按照形参名称取值
方案1:注解指定 @param注解 指定多个简单参数的key key = Param("value值") 【推荐】
方案2:mybatis默认机制
arg0 arg1.. 形参从左到右依次对应 arg0 arg1..
(name,salary) emp_name = #{arg0} emp_salary = #{arg1}
param1,param2..
(name,salary) emp_name = #{param1} emp_salary = #{param2}
-->
<select id="queryByNameAndSalary" resultType="com.gcy.pojo.Employee">
select emp_id empId, emp_name empName, emp_salary empSalary from t_emp where emp_name=#{a} and emp_salary=#{b}
</select>
<!-- 场景4:传入map 如何指定key的值
key = map的key即可
-->
<insert id="insertEmpMap">
insert into t_emp(emp_name,emp_salary) values (#{name},#{salary})
</insert>
</mapper>
java
public interface EmployeeMapper {
Employee queryById(int id);
int deleteById(int id);
Employee queryBySalary(Double salary);
int insertEmp(Employee employee);
List<Employee> queryByNameAndSalary(@Param("a") String name, @Param("b") Double salary);
int insertEmpMap(Map map);
}
三、给自己声明的pojo类起别名;开启驼峰映射;返回集合或者map;设置主键回显。
XML
<mapper namespace="com.gcy.mapper.EmployeeMapper">
<delete id="deleteById">
delete from t_emp where emp_id = #{id}
</delete>
<!--
场景1:返回单个简单类型如何指定 resultType的写法。 返回值的数据类型
resultType语法:
-类的全限定符
-别名简称
mybatis给我们提供了72种默认的别名。都是常用的Java数据类型
基本数据类型 int double -> _int _double
包装数据类型 Integer Double -> int double
集合容器类型 Map List HashMap -> map list hashMap
扩展:如果没有提供,需要自己定义别名 或者写类的全限定符
给自己声明的类如何定义别名
1、给自己的类定义别名,在查询返回结果集中指定返回值类型使用
在mybatis-config.xml中配置
<typeAliases>
<typeAlias type="com.gcy.pojo.Employee" alias="employee"/>
</typeAliases>
2、批量设置别名:在mybatis-config.xml中配置
<typeAliases>
批量将包下的类定义别名,别名为类的首字母小写
<package name="com.gcy.pojo"/>
</typeAliases>
3、扩展:如果不想使用批量的别名,可以在单个类上使用注解单独指定别名!
@Alias("empe")
4、ssm整合的时候,还可以通过配置统一给pojo类设置别名:
//指定pojo包下的所有类的别名为首字母小写的类名。
sqlSessionFactoryBean.setTypeAliasesPackage("com.xx.pojo");
-->
<select id="queryNameById" resultType="string">
select emp_name from t_emp where emp_id = #{id}
</select>
<select id="querySalaryById" resultType="double">
select emp_salary from t_emp where emp_id = #{id}
</select>
<!--
场景2:返回单个自定义类的类型
默认要求:
查询,返回单个实体类型,要求列名和属性名要一致。
这样才可以进行实体类的属性映射。
但是可以进行设置,设置支持驼峰式自动映射。
emp_id -> empId ==empId
mybatis-config.xml中设置
<setting name="mapUnderscoreToCamelCase" value="true"/>
ssm整合时也可以在配置类中开启驼峰映射:configuration.setMapUnderscoreToCamelCase(true); //开启驼峰映射
-->
<select id="queryById" resultType="employee">
select * from t_emp where emp_id = #{id}
</select>
<!-- 场景3. 返回map
当没有实体类可以使用接值的时候
可以使用map接收数据!
key -> 查询的列
value ->查询的值
-->
<select id="queryEmployeeByIdAsMap" resultType="map">
select emp_id,emp_name,emp_salary from t_emp where emp_id = #{id}
</select>
<!--
场景4. 返回的是集合类型如何指定
切记:返回的是集合类型 resultType不需要指定集合类型,只需要指定泛型即可
mybatis -> ibatis -> selectOne 方法查单个 底层调用的是 selectList方法, 直接返回集合。
-->
<select id="queryNameBySalary" resultType="string">
select emp_name from t_emp where emp_salary = #{salary}
</select>
<select id="queryAll" resultType="employee">
select * from t_emp
</select>
<!--
场景5:主键回显
1.自增长主键回显
useGeneratedKeys="true" 返回数据库自增长主键的值
keyColumn="emp_id" 主键列名
keyProperty="empId" 对象中与主键列名对应的字段名。
-->
<insert id="insertEmp" useGeneratedKeys="true" keyColumn="emp_id" keyProperty="empId">
insert into t_emp (emp_name,emp_salary) values (#{empName},#{empSalary});
</insert>
</mapper>
java
public interface EmployeeMapper {
int deleteById(Integer id);
String queryNameById(Integer id);
Double querySalaryById(Integer id);
Employee queryById(Integer id);
Map<String, Object> queryEmployeeByIdAsMap(Integer id);
List<String> queryNameBySalary(Double salary);
List<Employee> queryAll();
int insertEmp(Employee employee);
}
四、resultMap用法
1、association属性
XML
<!-- 自定义映射关系,定义嵌套对象的映射关系 -->
<resultMap id="orderMap" type="order">
<!-- 第一层属性 order对象 -->
<!-- order的主键 id标签 -->
<id column="order_id" property="orderId"/>
<!-- 普通列 -->
<result column="order_name" property="orderName"/>
<result column="customer_id" property="customerId"/>
<!-- 给对象属性赋值 一对一的对象属性赋值
property 对象属性名
javaType 对象类型
-->
<association property="customer" javaType="customer">
<id column="customer_id" property="customerId"/>
<result column="customer_name" property="customerName"/>
</association>
</resultMap>
<select id="queryOrderById" resultMap="orderMap">
select * from t_order tor join t_customer tc on tor .customer_id = tc.customer_id
where tor.order_id = #{id};
</select>
java
@Data
public class Order {
private Integer orderId;
private String orderName;
private Integer customerId;
private Customer customer;
}
2、collection属性
XML
<!--
默认情况下,resultMap会自动映射单层的result标签[列名和属性名相同,或者开启驼峰式映射开关]
对于嵌套association|collection mybatis就不会自动映射result标签 列名 和属性名
-->
<resultMap id="customerMap" type="customer">
<id column="customer_id" property="customerId"/>
<!-- <result column="customer_name" property="customerName"/>-->
<!-- <association property="" javaType="" 一对一的对象属性赋值-->
<!-- 给集合属性赋值 用<collection标签
property 集合属性名
ofType 集合的泛型类型
-->
<collection property="orderList" ofType="order">
<id column="order_id" property="orderId"/>
<!-- <result column="order_name" property="orderName"/>-->
<!-- <result column="customer_id" property="customerId"/>-->
</collection>
</resultMap>
<select id="queryList" resultMap="customerMap">
select * from t_order tor join t_customer tc on tor .customer_id = tc.customer_id;
</select>
</mapper>
java
@Data
public class Customer {
private Integer customerId;
private String customerName;
List<Order> orderList;
}