1.基础方式的增删改查crud
配置mybatis:
conf.xml 配置数据库信息 和 需要加载的映射文件
表 - 类
映射文件xxMapper.xml :
增删改查标签
若增删改使用事务类型为JDBC,则需手动session.commit提交
mybatis形式上只能有一个输入参数parameterType和一个输出参数resultType,若输入参数:
简单类型(8个基本类型+String)是可以使用任何占位符,如#{xxxx}
对象类型则必须是对象的属性 #{属性名}
测试类: session.selectOne(“需要查询SQL的namespace.id”, “SQL的参数”);
2.mapper动态代理方式的增删改查crud
原则:约定优于配置
硬编码方式
abc.java
Configuration conf = new Configuration();
con.setName("MyProject");
*配置方式(一般用这个)
abc.xml
<name>myProject</name>
具体实现方式:
a.基础环境:mybatis.jar, mysql.jar, conf,xml, mapper.xml
b.(不同之处):
约定目标:省略掉statement, 即根据约定可直接定位出SQL语句
接口中方法遵循的三个约定:
i.方法名和mapper.xml文件中标签的id值相同
ii.方法的 输入参数 和mapper.xml文件中标签的 parameterType 类型一致
iii.方法的 输出参数 和mapper.xml文件中标签的 resultType 类型一致
其他约定:
mapper.xml中namespace的值是接口全类名(接口-mapper.xml 一一对应)
接口中方法和mapper.xml中AQL标签一一对应
匹配过程(约定过程):
1.根据 接口名 找到 mapper.xml文件(根据的是namespace=接口全类名)
2.根据 接口的方法名 找到 mapper.xml 文件中的SQL标签(方法名 = SQL标签Id值)
3.优化
将配置信息单独放入db.properties文件中,然后再动态引入
db.properties:
key=values
conf.xml:
<properties resource="db.properties"/>
全局参数
在conf.xml中进行全局参数配置:
<settings>
<setting name="" value=""/>
</settings>
4.在conf.xml中设置别名(定义别名时大小写无所谓)
a.设置单个别名
b.批量设置别名
c.除了自定义别名,MyBatis还内置了一些常见类别名
<typeAliases>
<!-- 单个别名 -->
<typeAlias type="cn.mybatis.student.student" alias="student"/>
<!-- 批量定义别名 会自动将该包中所有类批量定义别名:类名-->
<package name="cn.mybatis.student"/>
</typeAliases>
5.类型处理器(类型转换器)
a.MyBatis自带一些常见的类型处理器
int - number
b.自定义的MyBatis类型处理器
java - 数据库(jdbc类型)
步骤:
Ⅰ.创建转换器:需要实现TypeHandler接口,通过阅读源码发现,此接口有一个实现类BaseTypeHandler,因此实现转换器有2种选择:
i.实现接口TypeHandler接口
ii.继承BaseTypeHandler
Ⅱ.配置转换器:conf.xml
6.输入参数:parameterType
将输入参数类型student转换为HashMap:
接口:
List<student> queryStudentBySageOrSnameWithHashMap(Map<String, Object> map);
xml:
<select id="queryStudentBySageOrSnameWithHashMap" resultType="student" parameterType="HashMap">
select * from student where sname like '${sname}' or sage = #{sage}
</select>
test.java:
Map<String, Object> stuMap= new HashMap<>();
stuMap.put("sage", 12);
stuMap.put("sname", "gigi");
List<student> student = studentMapper.queryStudentBySageOrSnameWithHashMap(stuMap);
a. 类型为 简单类型 (8个基本类型+String)
#{} 和 ${}的三个区别:
i.#{任意值}
${value}(括号里只能是英文单词value)
delete from student where sid = #{sid}
delete from student where sid = ${value}
ii.#{任意值} 该方式输出时会自动给String类型加上’’(自动类型转)
${} 该方式原样输出,但适合于动态排序(动态字段)
select * from student where sname = #{sname}
select * from student where sname = ‘${value}’
(${} 动态排序)select * from student order by ${value}
iii.#{}可以防止SQL注入
${}不防止SQL注入
#{} 和 ${}的相同之处:
i.都可以 获取对象的值
模糊查询:
#{}:
student stu = new student();
stu.setSage(12);
stu.setSname("%i%");
List<student> student = studentMapper.queryStudentBySageOrSname(stu);
<select id="queryStudentBySageOrSname" resultType="student" parameterType="student">
select * from student where sname like #{sname} or sage = #{sage}
</select>
${}:
student stu = new student();
stu.setSage(12);
stu.setSname("i");
List<student> student = studentMapper.queryStudentBySageOrSname(stu);
<select id="queryStudentBySageOrSname" resultType="student" parameterType="student">
select * from student where sname like '%${sname}%' or sage = #{sage}
</select>
ii.嵌套类型对象
Address address = new Address("ChengDu", "GuangZhou");
student stu = new student();
stu.setAddress(address);
List<student> student = studentMapper.queryStudentByAddress(stu)
<select id="queryStudentByAddress" resultType="student" parameterType="student">
select * from student where homeaddress = #{address.homeAddress}
or schooladdress = '${address.schoolAddress}'
</select>
6.MyBatis调用存储过程
xml:
<select id="queryCountByGradeWithProcedure" statementType="CALLABLE" parameterType="Map">
{
CALL queryCountByGradeWithProcedure(
#{name, jdbcType=VARCHAR, mode=IN},
#{cnt, jdbcType=INTEGER, mode=OUT}
)
}
</select>
接口:
void queryCountByGradeWithProcedure(Map<String, Object> map);
test.java:
Map<String, Object> stuMap= new HashMap<>();
stuMap.put("name", "grade1");
studentMapper.queryCountByGradeWithProcedure(stuMap);
Object cnt = stuMap.get("cnt");
7.输出参数
a.输出参数为简单类型(8个基本类型+String)
b.输出参数为实体对象类型
c.输出参数为对象的集合类型
d.输出参数为HashMap类型
一个HashMap对应一个学生多个元素(属性)
多个学生需要用List<HashMap<String, Object>>存放
e.resultMap
当 实体类的属性 和 数据表的字段 类型 和 名字 不同时需要使用该属性
但是也可以用resultType+HashMap来代替resultMap