Mybatis

一、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),获取数据库中的信息
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容