码迷,mamicode.com
首页 > 其他好文 > 详细

mybatis 学习的总结

时间:2017-09-16 18:58:51      阅读:535      评论:0      收藏:0      [点我收藏+]

标签:except   管理   大小写   运行环境   boolean   owa   获得   signature   线程安全   

什么是mybatis?

他是java基于持久层的框架(和数据库交互的一层),它支持定制化 SQL、存储过程以及高级映射(不像hibernate把发送sql作为暗箱操作,而他是可以完全看出来的可以看的到的sql语句).MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

mybatis有什么用?

定制化sql,存储过程以及高级映射。

mybatis怎么使用?

重要对象

SqlSessionFactory

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。

怎么构建一个SqlSessionFacrory?

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

SqlSession

sqlsession表示与数据库之间的会话,用完必须关闭,与conection一样都是非线程安全(使用非线程安全对象将会导致bug);

mybatis采用的是接口式编程

一个dao接口对应一个高级映射配置文件

虽然这个接口没有实现类,但是mybaits会为其生成一个代理对象.

@Test
	public void getEmployees2() {
		SqlSession session=null;
		try {
			session=getSqlSessionFactory().openSession();
			//得到的是一个接口实现类代理对象
			EmployeeMapper mapper=session.getMapper(EmployeeMapper.class);
			System.out.println(mapper.getEmployeeById(1).toString());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			session.close();
		}
	}

 核心配置文件的详解

properties

使用这个标签来引入外部的properties文件

resource属性:引入类路径下的资源

url:是引入网络路径或者磁盘路径下的资源

1  <properties resource="dbconfig.properties"></properties>

setting

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为

<settings>
       <!-- 设置是否使用驼峰命名法   形如last_name lastName -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

typealiases

这个标签视为一些复杂的名称对象取别名来简化书写       默认为类名首字母小写

如果一个一个取别名,那么就会显得很累!所以又有一个批量取别名的标签

  <typeAliases>
       <!--给类名起别名   -->
       <typeAlias type="com.jdztc.mybatis.javabean.Employee" alias="employee"/>
       <!-- 批量取别名   给某个包极其子包所有的类取别名  默认为类名首字母小写      但是别名是不区分大小写的 -->
       <package name="com.jdztc.mybatis.javaBean"/>
       <!-- 会遇到一个问题  如果父包与子包的类名一致这时就会报错    解决方案:使用@Alias解决 -->
    </typeAliases>

 

typehandlers

类型处理器

将java中的sting类型转化为数据库中的varchar()类型     要想自定义类型处理器   需要实现typeHandler接口或者继承basetypeHandler

和上面的标签一样,引入你自定义的类型处理器   还有批量引入自定义的类型处理器    默认的类型处理器很多

自定义类型处理器

// ExampleTypeHandler.java
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ExampleTypeHandler extends BaseTypeHandler<String> {

  @Override
  public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
    ps.setString(i, parameter);
  }

  @Override
  public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
    return rs.getString(columnName);
  }

  @Override
  public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    return rs.getString(columnIndex);
  }

  @Override
  public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    return cs.getString(columnIndex);
  }
}

然后引入

plugins

MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

通过实现拦截器接口通过@inceptor注解来配置拦截的sql语句方法

// ExamplePlugin.java
@Intercepts({@Signature(
  type= Executor.class,
  method = "update",
  args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
  public Object intercept(Invocation invocation) throws Throwable {
    return invocation.proceed();
  }
  public Object plugin(Object target) {
    return Plugin.wrap(target, this);
  }
  public void setProperties(Properties properties) {
  }
}
<!-- mybatis-config.xml -->
<plugins>
  <plugin interceptor="org.mybatis.example.ExamplePlugin">
    <property name="someProperty" value="100"/>
  </plugin>
</plugins>

 

environments

配置运行环境,比如事务管理器等

<environments default="development">
       <!--  <environment id="">
             事务管理器     要想自定义事务管理器   实现TransactionFactory接口     Managed
            <transactionManager type="JDBC"></transactionManager>
            不使用连接池技术   还有一个JDNI技术 
            <dataSource type="UNPOOLED"></dataSource>
        </environment> -->
        <environment id="development">
            <transactionManager type="JDBC" />
            <!--使用连接池技术  -->
            <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>

 

databaseisProvider

数据库厂商配置

得到数据库厂商的标识

<databaseIdProvider type="DB_VENDOR">
       <property name="MySQL" value="mysql"/>
    </databaseIdProvider>

 

mappers

导入映射文件

class属性   直接引用接口

接口与其对应的sql映射文件在一块并且名字要相同,class引用的全类名接口才有效

1.有接口对应的映射文件

2.没有,在接口上用注解来编写sql语句

<!--批量导入映射文件  -->
    <mappers>
        <package name="com.jdztc.mybatis.mapper"/>
    </mappers>

 

这些标签是有顺序的不能随便打乱顺序

映射文件的详解

几个主要标签

cache

命名空间的二级缓存配置

cache-ref

其他命名空间缓存配置的引用   表示和那个命名空间的缓存一致

resultmap

自定义结果集映射

sql

抽取可重用语句块

 -->
    <sql id="insertColumn">
        <if test="_databaseId==‘mysql‘">
           <if test="_parameter!=null">
               lastname,password,email,did<!-- ,${testColumn} -->
           </if>
        </if>
        <if test="_databaseId==‘oracle‘">
           <if test="_parameter!=null">
               lastname,password,email,did
           </if>
        </if>
    </sql>

 

insert

update

delete

select

 

数据库自增主键问题

mysql

mysql支持自增主键,mybatis自增主键值的获取,也是利用statement.getGeneratekeys()

insert标签的useGeneratekeys属性是使用主键获取主键值策略

keyProperty:指定对应的主键属性,也就是mybatis获取主键以后,将这个值封装javaBean哪个属性

 

要想让接口有返回值,直接修改接口的方法的返回值就可以了

mybati不但支持查询返回结果,还支持增删改定义以下返回值  Integer long  Boolean

 

oracle

oracle不支持自增        oracle使用序列来模拟自增

如何获取这个序列值

before 在sql运行之前运行

after   在sql运行之后运行

    <insert id="addEmp" parameterType="com.jdztc.mybatis.javabean.Employee" databaseId="oracle">
       <!-- 得到next的序列值 -->
       <!-- 得到序列中的值来作为主键    order是因为要在下面插入之前得到主键  所以selectkey要在那个插入之前先查询-->
       <!-- <selectKey keyProperty="eid" order="BEFORE">
        编写查询主键的sql语句 
         select tb_employee_seq.nextval from dual    
       </selectKey>
insert into tb_employee(id,lastname,password,email) values(#{eid},#{lastName},#{password},#{email})
--> <!-- order="AFTER" 如果同时插入多个记录,currval获取的可能是最后一次记录的值,不是当前的的值--> <!-- 可以的到当前的序列值 --> <selectKey keyProperty="eid" order="AFTER"> select tb_employee_seq.currval from dual </selectKey> insert into tb_employee(id,lastname,password,email) values(tb_employee_seq.nextval,#{lastName},#{password},#{email}) </insert>

 

参数处理

dao的方法中的参数

单个参数,mybatis不会做特殊处理

#{}  不在乎大括号内是什么

多个参数   mybatis会做特殊处理    会把多个参数封装成一个map  

那怎么获取参数呢?

通过key来   注意此时的key也比较特殊是固定的param1 ....paramN

mybatis 学习的总结

标签:except   管理   大小写   运行环境   boolean   owa   获得   signature   线程安全   

原文地址:http://www.cnblogs.com/fupengpeng/p/7531925.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!