Mybatis02
14:40:00
继续补充上次mybatis
UserMapper 接口
package cn.ttx.dao;
import cn.ttx.pojo.User;
import java.util.List;
public interface UserMapper {
// 查询所有
List<User> findAll();
}
使用xml 注解(我使用插件自动)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.ttx.dao.UserMapper">
<select id="findAll" resultType="cn.ttx.pojo.User">
select * from t_user
</select>
</mapper>
当实体类的字段名跟数据库字段名不一样的时候,你需要用到resultMap 或者重新定义字段名(个人建议:能一样尽量一样)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.ttx.dao.UserMapper">
<!--
定义映射
id:映射的名字
type:实体类
-->
<resultMap id="userResn.ttxultMap" type="User">
<!--
定义字段映射,id和result标签分别表示主键字段映射和非主键字段映射
property 实体类中的属性名
column SQL返回结果的列名
如果property和cloumn的值相同,可以省略
-->
<!-- <id property="id" column="id"/>-->
<result property="userName" column="user_name"/>
<!-- <result property="birthday" column="birthday"/>-->
<!-- <result property="sex" column="sex"/>-->
<result property="homeAddress" column="home_address"/>
</resultMap>
<select id="selectAll" resultMap="userResultMap">
select * from t_user
</select>
</mapper>
关于自增主键
<!--####################插入后获取ID方案一-->
<insert id="insert01">
<!--
resultType:主键的类型
keyProperty:实体类中的主键字段
order: AFTER表示SQL操作完成以后获取ID
-->
<selectKey resultType="int" keyProperty="id" order="AFTER" >
select LAST_INSERT_ID()
</selectKey>
INSERT INTO t_user(id,user_name,birthday, sex,home_address)
VALUES (null, #{userName}, #{birthday}, #{sex}, #{homeAddress})
</insert>
<!--####################插入后获取ID方案二-->
<!--
useGeneratedKeys:自动生成主键ID
keyProperty: 实体类中主键的属性名
-->
<insert id="insert02" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO t_user(id,user_name,birthday, sex,home_address)
VALUES (null, #{userName}, #{birthday}, #{sex}, #{homeAddress})
</insert>
关于 #{}, ${} 的区别
1.使用#传入参数是,sql语句解析变量时候将添加""包裹变量,当成字符串来解析,$则不会用""包裹; 2.#能使用PreparedStatement语句提高一定的效率; 3.#{}传参能防止sql注入,如果你传入的参数为 单引号',那么如果使用${},这种方式 那么是会报错的; 4.如果要做动态的排序,动态查询某个字段比如 order by column,这个时候务必要用${},select * from table order by 'name' ,这样是没用 5.从安全角度出发,能用#就不要用$;
动态SQL
<!-- 参考https://mybatis.org/mybatis-3/dynamic-sql.html if/where标签 if/set标签 foreach标签 sql/include标签 -->
关于复杂映射
1. 一对一, association标签
2. 一对多, collection标签
注意: resultMap和association都需要指定所有字段的映射,不能省略
SQL查询的结果集中不能有重复的字段,如果有重复字段,则映射过程中只有第一个字段可以取到正确的值,所以需要给名称重复的字段使用别名。
关于级联查询
association或者collection 标签里面有select 属性,select 子查询, 一个select标签的id column指定参数传递,格式(我知道的)为'参数名=传值给子查询字段'
关于注解开发(对于一些简单的查询,可以使用注解,但是稍微复杂点的,建议还是xml)
@Select(value="select * from t_user where id = #{id}")
User selectById(@Param("id") Integer id);
目前个人整理的mybatis 资料就这些,哈哈,如果面试需要,请百度搜索mybatis 面试题目
浙公网安备 33010602011771号