Mybatis

作者: yzw12138 | 来源:发表于2017-07-19 15:13 被阅读0次

    一、Mybatis框架配置

    • 1、加入Mybatis驱动包 :mybatis-3.3.1.jar
    • 2、导入Mybatis配置文件:F:\java\Mybatis\mybatis包和代码\mybatis-3-mybatis-3.3.1源码包 \src\test\java\org\apache\ibatis\submitted\complex_property的Configuration.xml文件 。直接将Configuration.xml文件拷入项目中,修改其中内容。
    <dataSource type="UNPOOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"></property>
            <property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property>
            <property name="username" value="root"></property>
            <property name="password" value="123456"></property>
    </dataSource>
    

    二、Mybatis通过SqlSession对象实现Dao层的需求

    Dao需求:

    • 1、对象能与数据库交互
    • 2、能执行SQL语句

    SqlSession作用:

    • 1、向SQL语句中传入参数。
    • 2、执行SQL语句。
    • 3、获取执行SQL语句结果。
    • 4、事务的控制。

    获得SQLSession对象

    • 1、通过配置文件获得数据库连接相关信息。
      Reader reader=Resources.getResourceAsReader("包名/myBatis配置文件名");从根目录src下开始写,此时写的是路径,应该用“/”而不是“.”。
    • 2、通过配置信息构建SqlSessionFactory。
      SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
    • 3、通过SqlSessionFactory打开一个数据库会话。
      SqlSession sqlSession=sqlSessionFactory.openSession();
    Paste_Image.png
     public List<Message>queryMessageList(String command,String description)
        {
            DbAccess dbAccess=new DbAccess (); 
            List<Message>messageList=new ArrayList<Message>();
            SqlSession  sqlSession = null;
            
            try {
                 sqlSession = dbAccess.getSqlSession;
                 //通过sqlSession执行SQL语句,find表示配置文件中的id
                messageList=sqlSession.selectList("User.find")
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                if(sqlSession != null)
                {
                    sqlSession.close();
                }
            }
    }
    

    通过SqlSession执行SQL语句

    • 添加配置文件:F:\java\Mybatis\mybatis包和代码\mybatis-3-mybatis-3.3.1源码包 \src\test\java\org\apache\ibatis\submitted\complex_property的User.xml文件。直接将文件拷入项目自己新建的包中。
    <mapper namespace="User">
    <select id="find" parameterType="long" resultMap="UserResult">
        SELECT * FROM user WHERE id = #{id:INTEGER}
      </select>
      <select id="version" parameterType="long" resultType="int">
        SELECT version FROM user WHERE id = #{id,jdbcType=INTEGER}
      </select>
      <delete id="delete" parameterType="UserAlias">
        DELETE FROM user WHERE id = #{id:INTEGER}
      </delete>
      <insert id="insert" parameterType="UserAlias" useGeneratedKeys="false">
        INSERT INTO user
        ( id,
        username,
        password,
        administrator
        )
        VALUES
        ( #{id},
        #{username,jdbcType=VARCHAR},
        #{password.encrypted:VARCHAR},
        #{administrator,jdbcType=BOOLEAN}
        )
      </insert>
      <update id="update" parameterType="UserAlias">
        UPDATE user SET
        username = #{username,jdbcType=VARCHAR},
        password = #{password.encrypted,jdbcType=VARCHAR},
        administrator = #{administrator,jdbcType=BOOLEAN}
        WHERE
        id = #{id,jdbcType=INTEGER}
      </update>
      <!--   Unique constraint check -->
      <select id="isUniqueUsername" parameterType="map" resultType="boolean">
        SELECT (count(*) = 0)
        FROM user
        WHERE ((#{userId,jdbcType=BIGINT} IS NOT NULL AND id != #{userId,jdbcType=BIGINT}) OR #{userId,jdbcType=BIGINT} IS
        NULL)  <!-- other than me -->
        AND (username = #{username,jdbcType=VARCHAR})
      </select>
    </mapper>
    

    可以通过配置文件中的select中的id信息调用不同的SQL语句执行,id的名字必须唯一;如果有多个配置文件,文件中的id想要重复命名,可以通过“<mapper namespace="Message">”标签来区分。此时调用SQL语句是应该增加namespaca的名字:

    sqlSession.select("Message.find")
    
    

    数据库中的字段与Java类中的属性对应

    通过配置文件实现

    //type表示类的全名,包括包名;id同sql语句中的id
    <resultMap type="UserAlias" id="UserResult">
        <id column="id" jdbcType="INTEGER" property="id"/>
        <result column="username" jdbcType="VARCHAR" property="username"/>
        <result column="password" jdbcType="VARCHAR" property="password.encrypted"/>
        <result column="administrator" jdbcType="BOOLEAN" property="administrator"/>
     </resultMap>
    

    子标签包括id标签和result标签,如果数据库中一个字段为主键是用id标签,如果是普通的列就用result标签。column表示数据库中的字段名,property表示类中的对象名。数据库中的字段类型与jdbcType中的类型或者Type类下面的常量名有对应关系。

    最后将这个配置文件添加到核心配置文件中

     <mappers>
        <mapper resource="org/apache/ibatis/submitted/complex_property/User.xml"/>
      </mappers>
    

    三、SQL语句拼接

    配置文件中的select接受参数时(用parameterType接受传递的参数,只写传递参数的类型,不写参数名),只能接受一个,如果Java代码要传递两个或以上参数,需要进行封装,然后进行传递。

    <select id="queryMessageList" parameterType="com.imooc.bean.Message" resultMap="MessageResult">
        select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE
        <where>
            <!--&quot代表""-->
            <if test="command != null and !"".equals(command.trim())">
                and COMMAND=#{command}
            </if>
    

    ONGL表达式(区分大小写)

    Paste_Image.png Paste_Image.png
    应用log4j(日志)调试动态SQL:
    1、jar包和配置文件
    2、log4j.properties
    <1>log4j.rootLogger=DEBUG,Console:输出级别(级别<由低到高>debug/info/warn/error)和输出位置(控制台)
    <2>log4j.appender.Console=org.apache.log4j.ConsoleAppender:配置这个类才会输出在控制台(可在别处)
    <3>log4j.appender.layout=org.apache.log4j.PatternLayout:布局(按照自己的想法去输出)<4>log4j.appender.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n:
    %d:产生日志的时间
    [%t]:产生日志所处线程的线程名称
    %-5p:输出日志的级别、
    "5":代表输出的字符会占5位字符,不足则会用空格补齐;
    "-":指的是补齐的空格在右边,没有则在左边.
    [%c]:指输出这个日志时处于的那个类的全名,包括包名
    %m:输出的时候附加的信息
    %n输出换行
    <5>log4j.logger.org.apache=INFO:为不同包配不同的级别,把总的覆盖,可看到自己想看的信息
    log4j配置详解
    一、log4j.rootLogger=INFO, stdout, R
    第一个参数为等级,后面可跟一到多个参数,为输出的位置;
    例句的意思为将等级为INFO的日志信息使用stdout和R进行输出,stdout和R可以自己命名;
    等级可分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,OFF是关闭,不输出任何信息,其他级别按这个顺序依次降低,如果 指定一个级别,如INFO,则比该级别高的信息都会输出

    四、对应关系

    • 1、一对多关系
      Java代码中反应一对多关系是通过主表中包含一个子表的集合;xml中反应一对多关系,和Java代码一样,用collection标签实现。
    <resultMap type=" "id=" ">
    <id column='select语句查询出的列名,如果列名取了别名,这里应该是别名' property=""/>
    <result column=" "property='对应的实体的属性名'/>
    <!-- 一对多关系 -->
    <collection property=''子表集合对象名 "   resultMap='实体类所对应的结果集,跨文件,所以需要指定命名空间,语法是:namespace.resultMapId'/>
    </resultMap>
    

    注意:column表示数据库中的列名,此时的列名并不是数据库表中的列名,而是select语句查询结果集的列名,两者可能不相同,select语句中可以设置别名。

    五、常用标签

    Paste_Image.png

    六、接口编程

    意义:为了规范如何去访问配置文件,为了规避namespace.与sql关联的id,传入的参数,返回值这种写法容易出错的毛病,采用接口试编程。

    • mybatis接口式编程的步骤:
      1.创建一个接口
      2.统一命名空间【接口所在类的全线类名作为xml文件的namespace】
      2.想要为哪条SQL语句代言,就在接口中定义和id相同名的方法
      3.SQL语句的返回值类型就是接口的返回值类型
      Dao层中MessageDao类新建一个方法,想要查询数据表Message中的信息。首先新建一个接口IMessage,接口中创建一个方法queryMessage(),然后再Message配置文件中新建一个select标签,标签id为方法名queryMessage,并在标签中填写完整的SQL语句,MessageDao类中可以直接调用接口使用,通过SqlSession获取接口(IMessage imessage=sqlSession.getMapper(IMessage.class);),然后通过接口调用其中的方法(imessage.queryMessage),获取数据库中的信息

    相关文章

      网友评论

          本文标题:Mybatis

          本文链接:https://www.haomeiwen.com/subject/mrzecxtx.html