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)
<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);
}
如果是插入更新和删除需要提交事务,加上如下代码:
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中别名的使用是该类的类名,头字母大小写都可以识别。
<typeAliases>
<package name="com.xxx.pojo"/>
</typeAliases>
6. mybatis多表一对一映射
当进行多表查询的一对一映射时,属性名和列名完全相同也需要写出,否则无法映射。
<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中只需要配一个不同的属性。
<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>