mybatis注意事项

1. #{}和${}的区别

  • #{} select * from user where id = ? 占位符 ? == '五' (带引号),若是没有指定参数名,里头的值随便写(#{v},#{value}均可以)。
  • ${} select * from user where username like '%五%' 字符串拼接(不带引号),或者能够转换成"%"#{v}"%"。若是没有指定参数名,只能用${value}(${v}会报错)。

2. 写sql语句的xml文件中mapper标签的namespace做用

多个xml文件若是有相同的id(通常是针对不一样的实体类会有不一样的xml),会用命名空间namespace进行区分。若是是Mapper动态代理开发,则为mapper接口的全路径(com.xxx.mapper.UserMapper)java

<mapper namespace="test">
    <!-- 经过id查询一个用户 -->
    <select id="findUserById" parameterType="Integer" resultType="com.xxx.User">
        select * from user where id = #{v}
    </select>
</mapper>

查询代码以下:程序员

public void testFindUserById() throws Exception{
    //加载核心配置文件
    String resource = "sqlMapConfig.xml";
    InputStream in = Resources.getResourceAsStream(resource);
    //建立SqlSessionFactory
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder.build(in);
    //建立SqlSession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    
    //执行Sql语句
    User user = sqlSession.selectOne("test.findUserById", 1);
    
    System.out.println(user);
}

若是是插入更新和删除须要提交事务,加上以下代码:sql

sqlSession.commit();

3. 添加用户的同时返回用户的id(数据库本身维护的id)

<insert id="insertUser" parameterType="com.xxx.User">
    <selectKey keyProperty="id" resultType="Integer" order="AFTER">
        select LAST_INSERT_ID()
    </selectKey>
    insert into user (username, birthday, address, sex) 
    values 
    (#{username}, #{birthday}, #{address}, #{sex})
</insert>

若是id类型是varchar或者uuid,则order应为before,由于数据库是先生成id再插入数据。数据库

4. mybatis和hibernate的区别

  • mybatis不彻底是一个orm框架,由于mybatis须要程序员本身编写sql语句,而hibernate不用。
  • mybatis简单易学,程序员直接编写原生态的sql,可严格控制sql的执行性能,灵活性高,很是适合对关系数据模型要求不高的软件开发。mybatis没法作到数据库无关性,由于不一样数据库的sql不同。
  • hibernate对象/关系映射能力强,数据库无关性好。

5. mybatis的sqlMapConfig.xml中配置别名

别名是扫描包及其子包下全部的类,按照以下配法,mapper.xml中别名的使用是该类的类名,头字母大小写均可以识别。mybatis

<typeAliases>
    <package name="com.xxx.pojo"/>
</typeAliases>

6. mybatis多表一对一映射

当进行多表查询的一对一映射时,属性名和列名彻底相同也须要写出,不然没法映射。oracle

<resultMap type="Orders" id="orders">
	<result column="user_id" property="userId"/>
</resultMap>

<select id="selectOrdersList" resultMap="orders">
	SELECT id, user_id, number, createtime, note FROM orders
</select>

单表查询可省略属性名和列明彻底相同的,resultMap中只须要配一个不一样的属性。app

<resultMap type="Orders" id="order">
    <result column="id" property="id"/>
    <result column="user_id" property="userId"/>
    <result column="number" property="number"/>
    <!-- 一对一 -->
    <association property="user" javaType="User">
        <id column="user_id" property="id"/>
        <result column="username" property="username"/>
    </association>
</resultMap>
<select id="selectOrders" resultMap="order">
    SELECT 
    o.id,
    o.user_id, 
    o.number,
    o.createtime,
    u.username 
    FROM orders o 
    left join user u 
    on o.user_id = u.id
</select>

多表一对一映射resultMap不能省略列明和属性名相同的。框架

7. mybatis在oracle建表自增主键

建立表的语句没有相关约束,只要声明主键不为空便可,重点在于插入语句性能

<!-- 插入表数据 -->
<insert id="insertData" parameterType="java.util.Map" databaseId="oracle">
    <selectKey  keyProperty="id" resultType="int" order="BEFORE">
        select nvl(max(id),0)+1 from bank_table_info
    </selectKey>
    insert into ${dataMap.table_name} (id,
    <foreach collection="dataMap.keys" separator="," item="key" close=")">
        ${key}
    </foreach>
    values (#{id},
    <foreach collection="dataMap.keys" item="key" separator="," close=")">
        #{dataMap[${key}]}
    </foreach>
</insert>