mybatis基础学习

1.curd(增删查改)

<mapper namespace="Dao.StudentDao">
    <!---->
    <select id="selectStudent" resultType="pojo.Student">
    select * from student where id = #{id}
  </select>
    
    <!---->
    <insert id="add" parameterType="pojo.Student">
        insert into student values(#{Id},#{Name})
    </insert>
    
    <!---->
    <delete id="delete" parameterType="int">
        delete from student
        <where>
            id =#{id}
        </where>
    </delete>
    
    <!---->
    <update id="update" parameterType="pojo.Student">
        update student set name = '${Name}'
        <where>
            id =${Id}
        </where>
    </update>
</mapper>

2.日志

常用日志类别:log4j,
使用log4j的步骤:
①设置日志为log4j

 <settings>
    <setting name="logImpl" value="LOG4J"/>
</settings>

②导入依赖
③创建一个log4j的xml配置文件,配置如下,可做修改:

# priority  :debug<info<warn<error
#you cannot specify every priority with different file for log4j
log4j.rootLogger=debug,stdout,info,debug,warn,error 

#console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern= [%d{yyyy-MM-dd HH:mm:ss a}]:%p %l%m%n
#info log
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.info.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.info.File=./src/com/hp/log/info.log
log4j.appender.info.Append=true
log4j.appender.info.Threshold=INFO
log4j.appender.info.layout=org.apache.log4j.PatternLayout 
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#debug log
log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.debug.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.debug.File=./src/com/hp/log/debug.log
log4j.appender.debug.Append=true
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.layout=org.apache.log4j.PatternLayout 
log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#warn log
log4j.logger.warn=warn
log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.warn.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.warn.File=./src/com/hp/log/warn.log
log4j.appender.warn.Append=true
log4j.appender.warn.Threshold=WARN
log4j.appender.warn.layout=org.apache.log4j.PatternLayout 
log4j.appender.warn.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#error
log4j.logger.error=error
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.error.File = ./src/com/hp/log/error.log 
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR 
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n

④在要打印日志的类中实现logger类即可使用相应的日志方法。如:

public class test {
    static Logger logger=Logger.getLogger(test.class);
    public static void main(String args[]) throws IOException {
        logger.info("开始执行测试");
        Reader reader= Resources.getResourceAsReader("MapperConfigure.xml");
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);       
        SqlSession sqlSession=sqlSessionFactory.openSession();
        }
}    

3.注解开发

说明:一般只在简单的接口方法上面使用注解,对于复杂的sql语句,还是需要在mapper.xml中配置resultMap来映射复杂的结果集。
使用方法:直接在接口方法上加上注解,注解参数是对应的sql语句,如@select(“select * from student where id=#{StudentId}”)
@Param注解的使用
这个注解一般只使用在基本类型并且多个参数,且参数名称与sql语句中#{}中的参数名称不一致的时候。对于引用数据类型是不使用的,因为在#{}中使用的是引用对象的属性名称,即id,你改变了student的名称无用。
在这里插入图片描述

4. 一对多

association 标签用来设置一个对象,collection 标签用来设置一个集合
一对多的实现:

   <!--一对多实现方法一-->
    <!--<select id="getAllSchoolStudent" resultMap="SchoolStudent">-->
      <!--SELECT * FROM student JOIN student_school ON student.id=student_school.studentId JOIN school ON school.schoolId=student_school.schoolId WHERE school.schoolId=#{schoolId}-->
    <!--</select>-->
    <!--<resultMap id="SchoolStudent" type="School">-->
        <!--<result property="sid" column="schoolId"/>-->
        <!--<result property="schoolName" column="schoolName"/>-->
        <!--<collection property="students" ofType="Student" javaType="ArrayList">-->
        <!--<result property="Id" column="id" />-->
        <!--<result property="Name" column="name"/>-->
            <!--<result property="schoolId" column="schoolId"/>-->
        <!--</collection>-->
    <!--</resultMap>-->

    <!--一对多实现方法二-->
    <select id="getAllSchoolStudent" resultMap="SchoolStudent">
      SELECT * From school where schoolId=#{id}
    </select>

    <resultMap id="SchoolStudent" type="School">
        <result property="sid" column="schoolId"/>
        <result property="schoolName" column="schoolName"/>
        <collection property="students" ofType="Student" javaType="ArrayList">
            <result property="Id" column="id" />
            <result property="Name" column="name"/>
            <result property="schoolId" column="schoolId"/>
        </collection>
    </resultMap>

    <select id="getAllStudent" resultType="Student">
        select * from student join student_school on id=student_school.studentId where id =#{id}
    </select>

5.动态sql

动态sql常用的有①where-if ②set-if ③choose-when-otherwise ④foreach
使用方法如下:
使用where-if语句,如果子句开头是and或者or结尾,会自动被删掉(如果想使用and和or之外的其他,将where标签换为trim,可以自定义删除开头)

<select id="getAllSchoolStudent" resultMap="SchoolStudent" parameterType="map">
      SELECT * FROM student JOIN student_school ON student.id=student_school.studentId JOIN school ON school.schoolId=student_school.schoolId
        <where>
            <if test="sid!=null">
                school.schoolId=#{sid}
            </if>
            <if test="studentName!=null">
                and name=#{studentName}
            </if>
        </where>
  </select>

使用choose语句来选择条件,类似于java的switch语句,有满足的条件则不选择后面的了,如果所有都不满足则选择otherwise

    <select id="getAllSchoolStudent" resultMap="SchoolStudent" parameterType="map">
    SELECT * FROM student JOIN student_school ON student.id=student_school.studentId JOIN school ON school.schoolId=student_school.schoolId
    <where>
    <choose>
        <when test="sid!=null">
           and school.schoolId=#{sid}
        </when>
        <when test="studentName!=null">
            and name=#{studentName}
        </when>
        <otherwise>
            and 1==1
        </otherwise>
    </choose>
    </where>
  </select>

使用set语句,可以删掉最后一个逗号,当然也可以使用trim自定义,如果说一个条件都不满足那没必要执行修改了吧!

<update id="update" parameterType="map">
    update school
    <set>
        <if test="schoolName!=null">
            schoolName=#{schoolName},
        </if>
    </set>
</update>

foreach语句,一般用于遍历得到sql的in( ,)的参数

<select id="selectStudentByList" parameterType="list" resultType="Student">
    select * from student where id in
    <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>

6.缓存机制

mybatis分为一级缓存和二级缓存
一级缓存的作用域是同一个sqlSession对象,二级缓存的作用域是一个namespace,即同一个mapper下的接口,如果sqlSeesion关闭了,那么会查看是否开启二级缓存,如果开启,则将缓存信息存入二级缓存中,否则缓存数据消失;一级缓存是一直存在的,不需要手动开启。
使用二级缓存的步骤
①开启缓存功能:<setting name="lazyLoadingEnabled" value="false"/>
<cache/>开启二级缓存
下面是开启二级缓存的情况下,执行的流程:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值