Mybatis入门学习笔记1

注:当sql语句需要参数时,可以用parameter指定参数类型,但事实上即使不予指定mybatis也可以自行解析。

       当sql语句是查询时,需要指定resultType,即返回值类型,但增删改是受影响的行数,不需要指定

1.什么是框架?

        软件的半成品,解决了软件开发过程中的普适性问题,我们可以在此基础上快速开发公司定制的化的软件应用

        特点:简单易学,灵活,开发速度快,提高软件质量 框架已经把关键的代码业务实现,我们只是站在巨人肩膀上

2.什么是ORM框架?

        ORM(Object Relational Mapping ) 对象关系映射,将程序中的一个对象与表中的一行数据一一对应

        读取:将数据库表中的每一行数据映射为对象

        写入:将java对象映射为数据库中的每一行数据

        mybatis就是一个orm框架,用来取代JDBC,queryRunner等

3. mybatis与hibernate特点

        mybatis:持久层和orm框架

        特点:

             1)简单易用      2)灵活      3)sql与jiava代码解耦

             4)提供高级映射功能 : 数据库列表和java属性不一致问题

                                                一对一、一对多关系

             5)动态sql语句,解决模糊查询等类似问题

         hibernate:持久层框架,已经渐渐被淘汰

         特点:功能强大,重量级,不需要写sql语句(开发者不能自定义sql语句,不能优化,不灵活)

4.持久层配置文件XXXDao.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">

<!--
namespace="com.wp.dao.IStudentDao"  和mybatis二级缓存相关
mybatis 根据当前xml文件生成IStudentDao对应的实现类
-->
<mapper namespace="com.wp.dao.IStudentDao">

    <!--
        id 对应dao中的方法名
        #{id} 获取方法传来的参数
        resultType : 返回值类型
        parameterType
    -->
    <!--<select id="findStudentById" resultType="com.wp.entity.Student" parameterType="int">
        select * from student_tb where id = #{id}
    </select>-->

    <select id="findAllStudent" resultType="com.wp.entity.Student">
        select * from student_tb
    </select>

</mapper>

5.mybatis配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--加载mysql配置信息-->
   <properties resource="mysql.properties"></properties>

    <!--
        value="true"  开启驼峰写法 自动将数据库表字段h_type等按驼峰形式映射为java属性hType
    -->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--起别名-->
    <typeAliases>
        <package name="com.qfedu.entity"/>
    </typeAliases>

    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>

        </environment>
    </environments>

    <!--mappers一定要在environments之后-->
    <mappers>
           <!--告诉mybatis 要根据IHouseDao.xml的业务创建一个代理对象-->
       <!-- <mapper resource="com/qfedu/dao/IHouseDao.xml"></mapper>
-->
        <!--也是告诉mybatis 要创建一个IHouseDao代理对象,并且业务按照IHouseDao.xml -->
      <!--  <mapper class="com.qfedu.dao.IHouseDao"></mapper>-->

        <!--推荐!!!-->
        <!--告诉mybatis com.qfedu.dao所有的接口都要 创建对应的代理对象-->
        <package name="com.qfedu.dao"/>
    </mappers>
</configuration>

6.获取自增id的两种方式:

      1.使用selectKey方式获取

 <!--
        第一种:插入学生 获取id
        selectKey 获取自增id
        resultType="int" 自增id 类型
        keyColumn:对应数据库表自增主键列名
        keyProperty:传入的实体类中 主键对应的的属性
        order="AFTER" 插入完成之后执行   select last_insert_id()
    -->
    <insert id="addStudentGetId" parameterType="com.qfedu.entity.Student">
        insert  into student_tb(name,age,sex,height) values(#{name},#{age},#{sex},#{height})
        <selectKey resultType="int" keyColumn="id" keyProperty="id" order="AFTER">
            select last_insert_id()
        </selectKey>

        2.useGeneratedKeys="true" 设置使用自增主键;

   <!--
        第二种获取自增id
        useGeneratedKeys="true"  获取自增id
        将数据库表自增id  keyColumn="id" 设置到student对象的属性id  keyProperty="id"
    -->
    <insert id="addStudentGetId" parameterType="Student" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        insert  into student_tb(name,age,sex,height) values(#{name},#{age},#{sex},#{height})
    </insert>

7.模糊查询两种方式

 List<Student> studentList = iStudentDao.getStudentByLikeName("%小%");
 for (Student student:studentList){
    System.out.println("student:"+student);
}

方式一: #{name}

  <!--
        模糊查询
        #{name}  占位符  只是替换值  禁止sql 拼接  常用
    -->
    <select id="getStudentByLikeName" resultType="com.qfedu.entity.Student">
        select * from student_tb where name like #{name}
    </select>

方式二:

<!--
        '${value}'  mybatis 字符串的替换拼接
        ${value} 获取到值 sql 字符串会拼接进来  最大的风险是sql注入
       '${value}'  select name from student_tb  where id = 1
    -->
    <select id="getStudentByLikeName" resultMap="studentMap1">
        select * from student_tb where name like '${value}'
    </select>

8.面试题:${} #{} 区别????

  • 获取值方式不同  ${value}   #{参数名}

  • ${}字符串替换,然后sql拼接   #{}占位符

  • ${} 有sql注入风险

9.别名的配置

typeAliases标签,写在mybatis配置文件最上方位置

别名就是mybatis 给 Java实体类起一个小名(简短的名字,而不需要全限定名)

<typeAliases>
        <!--单个类 起别名-->
       <!-- <typeAlias type="com.qfedu.entity.Student" alias="student"></typeAlias>-->

        <!--
            为当前包下面所有实体类 取别名 不区分大小写
            Student 别名 Student student sTudent 不区分大小写
        -->
        <package name="com.qfedu.entity"/>
    </typeAliases>

10.resultMap属性与列名不匹配解决方式

 <!--
       定义一个resultMap
       使用resultMap 完成 数据库 列名到 实体类的映射
       <id property="id" column="id"></id> 实体类属性id 到数据库主键i列名d的映射
       <result property="name" column="name"></result>实体类属性和数据库普通列名的映射
    -->
    <resultMap id="studentMap1" type="Student">
        <id property="id" column="id"></id>
        <result property="name" column="name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="height" column="height"></result>
        <result property="address" column="s_address"></result>
    </resultMap>
    <select id="findStudentById" resultMap="studentMap1" parameterType="int">
        select * from student_tb where id = #{id}
    </select>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值