【MyBatis学习笔记】MyBatis基础知识

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

发布了46 篇原创文章 · 获赞 1 · 访问量 2408

猜你喜欢

转载自blog.csdn.net/weixin_43708069/article/details/104419851
今日推荐