一、开发方式
MyBatis-Dao层Mapper接口化开发
二、注意事项
1、Mapper接口与Mapper.xml映射文件要满足4个对应
(1)Mapper接口的全类名必须与Mapper映射文件中的namespace相同
(2)Mapper接口中的每一个方法名在Mapper映射文件中都要有一个id为方法名的标签相对应
(3)Mapper映射文件中的标签的参数类型必须与Mapper接口中的对应方法的参数类型相同
(4)Mapper映射文件中的标签的结果类型必须与Mapper接口中的对应方法的结果类型相同
三、参数传递
1、单参数传递
直接使用方法的参数名传递参数
Admin findAdminById(int id);
<select id="findAdminById" parameterType="int" resultType="Admin">select * from admin where id = #{id}</select>
2、少参数传递
使用注解标签传递参数
Admin login(@Param("acc") String account, @Param("pwd") String password);
<select id="login" resultType="Admin">select * from admin where account = #{acc} and password = #{pwd}</select>
3、多参数传递
使用对象传递参数
void saveAdmin(Admin admin);
<insert id="saveAdmin" parameterType="admin">insert into admin(account,password,gender)value(#{account},#{password},#{gender})</insert>
注意:执行增删改sql语句时必须要提交数据库事务(一次与数据库交互的过程管理)
两种提交数据库事务的方式
方式一
给定参数设置为自动提交数据库事务
sqlSessionFactory.openSession(true);
方式二
调用方法手动提交数据库事务
sqlSession.commit();
对比两种方式,最好使用第二种,可以使得多条sql在遇到异常时保持状态一致,要么都提交成功,要么都提交失败,避免出现交钱不下单问题
四、#{}表达式和${}表达式
1、#{}表达式
(1)作用:传递参数值
(2)传递方式:预编译方式传递
(3)优点:安全,避免出现or 1=1表内数据全部删除的情况
2、${}表达式
(1)作用:传递列名
(2)传递方式:字符串拼接方式传递
(3)优点:
优点一:通过加‘’可实现参数值传递
优点二:可以实现排序列名传递和数据显示列名传递两个功能
五、insert标签的3个属性,获取插入数据的主键值
1、useGeneratedKeys 设置方法是否返回此条数据的主键值
2、keyColumn 设置类中谁来接收主键值
3、keyProperty 设置表中谁为主键(只针对当前返回主键值这个过程)
<insert id="saveAdmin" parameterType="admin" useGeneratedKeys="true" keyColumn="id" keyProperty="id">insert into admin(account,password,gender)value(#{account},#{password},#{gender})</insert>
六、单元测试
1、功能:实现对单个方法进行测试
2、配置:
将junit包导入到项目中
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>provided</scope>
</dependency>
3、使用:注意:单元测试的方法必须是public访问权限修饰符
@Testpublic void find(){System.out.println("你好");}
七、查询接口
1、返回值为一个值
int findAdminCount();
<select id="findAdminCount" resultType="java.lang.Integer">select count(*) from admin</select>
2、返回值为一个对象
Admin findAdminById(int id);
<select id="findAdminById" parameterType="int" resultType="Admin">select * from admin where id = #{id}</select>
3、返回值为多个对象
List<Admin> findAdmins();
<select id="findAdmins" resultType="com.ffyc.mybatispro.model.Admin">select * from admin</select>
注意:必须使用集合去接收返回回来的多个对象,否则就会
八、单表自动将查询结果中的记录封装为一个对象需要注意的事项
1、模型类中一定要有无参构造方法,否则就会
并且在模型类中一定要对私有属性全部实现get和set方法
2、数据库表中的列名一定要与对应模型类中的属性名相同,否则就会
快捷方式:java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局设置实现自动转换,即就是adminPhone与admin_phone相对应
实现方式:在全局配置中添加此配置
<setting name="mapUnderscoreToCamelCase" value="true"/>
九、方法中传递String类型的参数时,必须使用注解标签@Param与参数值绑定才能将将参数值正确传到sql中,否则就会
正确做法:
List<Admin> findAdmins(@Param("col") String col);
<select id="findAdmins" resultType="com.ffyc.mybatispro.model.Admin" parameterType="string">select * from admin order by ${col}</select>
十、resultType特殊处理结果集
1、作用:
处理模型类的属性名与数据库列名不对应的问题
2、使用
<resultMap id="adminMap" type="admin"><id property="id" column="id"></id><result property="account" column="account"></result><result property="password" column="password"></result><result property="gender" column="gen"></result><result property="adminPhone" column="admin_phone"></result></resultMap><select id="findAdminById" parameterType="int" resultMap="adminMap">select id,password,account,gen as gender,admin_phone from admin where id = #{id}</select>
解析:resultMap中的id属性是POJO类,是唯一标识,sql语句的查询结果被对应的resultMap接收,type属性是结果类,内部的id标签映射主键,result标签映射非主键,property设置POJO类的属性名,column设置查询结果的列名