mybatis相关知识

来源:互联网 发布:nodejs 官网cms 编辑:程序博客网 时间:2024/06/06 01:37

构建Mybatis项目

Mybatis 相关 Jar包下载路径: https://github.com/mybatis/mybatis-3/releases

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。MyBatis使用简单的 XML 或注解来配置和映射基本体,将接口和Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。相比Hirbernate,Mybatis更加灵活。

构建Mybatis项目步骤:

    一:创建项目,导入jar包,Mybatis只有一个jar包mybatis-3.2.4.jar,和(我用的是oracle)数据库驱动包ojdbc6.jar

    二:建立XML 配置文件:src/mybatis-config.xml(名字可以随便取,随便在哪个目录下,在程序中对应就行),此配置文件(configuration XML)中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务范围和控制方式的事务管理器(TransactionManager)。

    三:建立实体(如:Emp),和实体映射文件(Emp.xml),此映射文件中主要包含了sql语句的映射。并将Emp.xml配置到mybatis-config.xml中去

四:具体数据库操作,创建SqlSessionFactory和SqlSession,进行增删改查操作

目录结构如下:

            

mybatis-config.xml示例内容如下:

    <?xmlversion="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManagertype="JDBC"/>
      <dataSource type="POOLED">
        <property name=
"driver"value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url"value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
        <propertyname="username" value="scott"/>
        <propertyname="password" value="tiger"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
   
<mapperresource="model/Emp.xml"/>//类说对应的配置文件
  </mappers>
</configuration>

 

Emp.xml示例如下:

    <?xmlversion="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper3.0//EN"
     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="model.Emp">
      <select id="selectEmpById"resultType="model.Emp">
            select * fromemp where empno = #{id}
      </select>
    </mapper>

 

创建SqlSessionFactory和SqlSession,因为根据empno查询只有一条数据所以用selectOne()方法

    String resource ="mybatis-config.xml";
    InputStream inputStream =Resources.getResourceAsStream(resource);
    sqlSessionFactory = newSqlSessionFactoryBuilder().build(inputStream);

    SqlSession session =sf.openSession();
    Emp emp =(Emp)session.selectOne("model.Emp.selectEmpById",7499);
    System.out.println(emp);

基于oracle批量insert

<insertid="batchInsertEmp" parameterType="java.util.List">
        insert intoemp(empno,ename,job,mgr,hirdate,sal,comm,dept)
        <foreach collection="list"index="index" item="item" separator="union all">
             (select 
#{item.empno ,jdbcType= INTEGER},

            #{item.empno,jdbcType= VARCHAR}, 

           #{item.job,jdbcType= VARCHAR}, 

            #{item.mgr,jdbcType= INTEGER},

            to_date(#{item.hirdate,jdbcType=VARCHAR},'yyyy-MM-dd'),
            #{item.sal,jdbcType=INTEGER},
            #{item.comm,jdbcType=INTEGER},
            #{item.dept,jdbcType=INTEGER} 
from dual)
        </foreach>
 </insert>

需要重点注意的是sql中没有values,和<foreach>标签中的(selece ..... from dual)还有foreach标签中的separator属性值为"union all".

 

        Stringresource = "mybatis-config.xml";
        InputStream inputStream =Resources.getResourceAsStream(resource);
        SqlSessionFactory sf = newSqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sf.openSession();

        List<emp>emplist = new ArrayList<Emp>();

        emplist.add(newEmp(……));

        session.insert("econ.lottery.model.Lottery.batchInsertLottery",emplist);
        session.commit();

        session.close();

在sql映射xml文件中,有以下几个灵活标签:

            if,choose (when, otherwise),trim (where, set),foreach

应用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:
为不同包配不同的级别,把总的覆盖,可看到自己想看的信息

 

1、配置文件的详细路径:
src\test\java\org\apache\ibatis\submitted\complex_property\Configuration.xml

2、Mybatis之SqlSession
SqlSession
的作用:
<1>
向SQL语句传入参数
<2>
执行SQL语句
<3>
获取执行SQL语句的结果
<4>
事物的控制
如何得到SqlSession
<1>
通过配置文件获取数据库连接相关信息
<2>
通过配置信息构建SqlSessionFactory
<3>
通过SqlSessionFactory打开数据库会话

Ctrl+shift+J生成方法注释
servlet
里面一般做的事:1.接受页面的值2.向页面传值3.根据业务需要调用service4.向页面跳转

 

1、 注意项目命名规范,用英文命名、不能用全拼;

2、 添加合理的注释有助于程序维护;

3、 页面放在web-inf下便于控制和管理;

4、 通过文件夹合理管理各类文件;

 

 

log4j配置详解

●    log4j.rootLogger=INFO, stdout, R

第一个参数为等级,后面可跟一到多个参数,为输出的位置;
例句的意思为将等级为INFO的日志信息使用stdout和R进行输出,stdout和R可以自己命名;
● 等级可分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,OFF是关闭,不输出任何信息,其他级别按这个顺序依次降低,如果指定一个级别,如INFO,则比该级别高的信息都会输出,此时会输出FATAL、ERROR、WARN、INFO级别的信息。

二、log4j.appender.stdout=org.apache.log4j.ConsoleAppender
   log4j.appender.stdout.option=value

此处的stdout要与第1条中出现的名称对应,后面出现这个名称的地方都需如此,不再复述;
● 定义stdout的输出端类型,以及属性选项配置,可以有下面几种类型:
   org.apache.log4j.ConsoleAppender(输出在控制台)
   org.apache.log4j.FileAppender(输出到文件)
   org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
   org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),可通过       log4j.appender.R.MaxFileSize=100KB设置文件大小,还可通过 log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

●    关于log4j.appender.stdout.option=value属性选项配置,此处option与value可以为以下指定的内容:

输出端共同选项:
Threshold=WARN:
指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。

○ ConsoleAppender选项:
Target=System.err
:默认情况下是:System.out,指定输出控制台

○ 文件输出端共同选项:
File=mylog.txt:
指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

○ DailyRollingFileAppender选项:
DatePattern=yyyy-ww:
每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
   1)yyyy-MM: 每月
   2)yyyy-ww: 每周
   3)yyyy-MM-dd: 每天
   4)yyyy-MM-dd-a: 每天两次
   5)yyyy-MM-dd-HH: 每小时
   6)yyyy-MM-dd-HH-mm: 每分钟

○ RollingFileAppender选项:
   MaxFileSize=100KB:
后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
   MaxBackupIndex=2:指定可以产生的滚动文件的最大数。

根据上面的说明,给出的样例配置:
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=D:\\logs\\APPName.log
此处R与stdout类似,要与第1条中出现的名称对应
定义R的输出端为输出到文件,并且文件大小到达指定尺寸的时候产生一个新的文件
定义R的输出端的文件名为D:\\logs\\APPName.log,该路径与名称可以自行修改。

●    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

定义stdout的输出端layout,layout可以有下面几种类型:
   org.apache.log4j.HTMLLayout(以HTML表格形式布局),
   org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
   org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
   org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

●    log4j.appender.stdout.layout.ConversionPattern= [APPName]%p [%t] %C.%M(%L) | %m%n

如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,具体参数:
   %m 输出代码中指定的消息
   %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
   %r 输出自应用启动到输出该log信息耗费的毫秒数
   %c 输出所属的类目,通常就是所在类的全名
   %t 输出产生该日志事件的线程名
   %n 输出一个回车换行符,Windows平台为"rn”,Unix平台为"n”
   %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
   %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
   %%: 输出一个”%”字符
   %F: 输出日志消息产生时所在的文件名称
   %M: 输出执行方法
   %L: 输出代码中的行号

可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
   1) c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
   2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。
   3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
   4) .30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。
   [APPName]是log信息的开头,可以为任意字符,一般为项目简称。

●    log4j.logger.com.johnny=DEBUG

自定义各个包中日志级别,指定com.johnny包下的所有类的等级为DEBUG。

●    加载自己的配置文件:

log4j默认加载类路径下的log4j.properties文件,如果自定义其他名称的properties文件的时候,就需要使用PropertyConfigurator.configure(“FilePath”)来加载配置文件,这里要注意一下配置文件的路径:

针对java项目:
   绝对路径 -- F:\\test\\log4jSelf.properties;
   这个就不用多说了,如果不是web项目的话,写绝对路径那就是硬盘上的全路径了
   相对路径 --  src/youFileName.properties
   log4j默认的当前路径工程下面,即跟src同级目录,了解这点相信相对路径大家都手到擒来了,或者类加载器获得路径也可以;

针对web项目:
    getRealPath获得路径加上文件名

 

定义SQL3

INSERT

UPDATE

DELETE

SELECT

配置Java对象属性与查询结果集中列名对应关系

resultMap

控制动态SQL拼接

Foreach

if

Choose---when---otherwise

格式化输出

Where 以and或or等开头的去掉

Set 以“,”等结尾的去掉

Trim

配置关联关系

Collection (主表)

Association(字表)

定义常量

Sql(不一定是完整的sql语句)

引用常量

Include

 

0 0
原创粉丝点击