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 面试题目