1.Mapper接口方法名和mapper.xml中定义的每个sql的id相同;
2.Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同;
3.Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同;
4.Mapper.xml文件中的namespace即是mapper接口的类路径;
第一种:通过定义select语句中字段名的别名,让字段明的别名和实体类的属性名一致
第二种:通过ResutlMap来映射字段名和实体类属性名的一一对应的关系。
<select id="selectlike">
select * from foo where bar like #{value}
</select>
第 2 种:在 sql 语句中拼接通配符,会引起 sql 注入
<select id="selectlike">
select * from foo where bar like "%"#{value}"%"
</select>
1)MyBatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,MyBatis提供了9种动态sql标签 trim | where | set | foreach | if | choose | when | otherwise | bind。
2)其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。
Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦 截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。
Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。
MyBatis实现一对一、一对多关联查询一般有两种方式:
方式一:sqlMapper配置文件
一对一:在resultMap标签中使用 association 标签
一对多:在resultMap 标签中使用collection 标签
方式二:注解
一对一:在@Results 注解中的@Result注解中使用@One注解
一对多:在@Results 注解中的@Result 注解中使用@Many注解
useGeneratedKeys为true,持自动生成主键,keyProperty和keyColumn分别代表数据库记录主键字段和java对象成员属性名
dao层 修饰符 为 void,不需要返回任何
<insert id="insertEntity" parameterType="**" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
//dao层 修饰符 为 void,不需要返回任何
void batchInsert(List<TAlarmChannelEntity> list);
<insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO t_alarm_channel
(channel, silent_cycle, aggregation_mode,threshold,effective_start_time,effective_end_time,inform_obj,selected,create_time)
VALUES
<foreach collection="list" index="index" item="bo" separator=",">
(
#{bo.channel}, #{bo.silentCycle}, #{bo.aggregationMode},#{bo.threshold},#{bo.effectiveStartTime},#{bo.effectiveEndTime},#{bo.informObj},#{bo.selected},now()
)
</foreach>
</insert>
ResultMap是⾃⼰指定返回值与对象及与对象内部属性名和数据库列名的绑定
ResultType是直接返回值与别名库当中的java对象的映射
1,第一种:
public UserselectUser(String name,String area); 对应的 xml,#{0}代表接收的是 dao 层中的第一个参数,#{1}代表 dao 层中第二 参数,更多参数一致往后加即可。
<select id="selectUser"resultMap="BaseResultMap">
select * from user_user_t where user_name = #{0} and user_area=#{1}
</select>
2,第二种:使用@param注解:
public interface UserMapper {
User selectUser(@param("username") String username,
@param("hashedpassword") sString hashedpassword);
}
然后,就可以在 xml 像下面这样使用(推荐封装为一个 map,作为单个参数传递给mapper):
<select id="selectuser" resulttype="user">
select id, username, hashedpassword
from some_table
where username = #{username} and hashedpassword = #{hashedpassword}
</select>
3、第三种:多个参数封装成 map
try {
//映射文件的命名空间.SQL 片段的 ID,就可以调用对应的映射文件中的SQL
//由于我们的参数超过了两个,而方法中只有一个 Object 参数收集,因此我们使用 Map 集合来装载我们的参数
Map < String, Object > map = new HashMap();
map.put("start", start);
map.put("end", end);
return sqlSession.selectList("StudentID.pagination", map);
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
throw e;
} finally {
MybatisUtil.closeSqlSession();
}