mybatis 学习的总结

什么是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

时间: 2024-08-10 14:59:41

mybatis 学习的总结的相关文章

MyBatis学习总结(五)——实现关联表查询(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(五)--实现关联表查询 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TAB

MyBatis学习总结(七)——Mybatis缓存(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空. 2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,Hash

MyBatis:学习笔记(3)——关联查询

MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统,如果我们将用户信息和订单信息都保存在user表中,这样就不存在联结关系,因为我们仅仅操作一张表就好. 但是这是非常不明智的选择,举例来说,一个用户可以拥有多个订单,如果保存在一个表中,势必会导致用户信息的多次出现,因为每个订单绑定的用户信息都是相同的. 所以我们尽量要将不同的信息存储与不同的表中,但

MyBatis学习总结(六)——调用存储过程(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(六)--调用存储过程 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 1 create table p_user( 2 id int primary key auto_increment, 3 name varchar(10), 4 sex char(2) 5 ); 6 7 insert into p_user(name,sex) values('A',"男");

MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(八)--Mybatis3.x与Spring4.x整合 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-mybatis3 -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false 如下图所示: 创建好的项目如下

mybatis学习笔记(1)

之前做项目的时候,DAO层写了一些spring jdbc,用起来的确不是很方便,今天特意去学习了新的框架:mybatis.把之前用spring-jdbc写的内容换成了mybatis框架搭建的内容. 首先你要到mybatis的官网去下mybatis的jar包:mybatis-3.2.7.jar.由于我是在spring的基础上去搭建mybatis所以还要去弄一个mybatis-spring-1.2.2.jar, 这个连接的包好像在spring官方是找不到的,需要自己去网上找. 进入正题.首先在src

Mybatis学习笔记(二) 之实现数据库的增删改查

开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包.这些软件工具均可以到各自的官方网站上下载.首先建立一个名字为 MyBaits 的 dynamic web project 1. 可以创建maven项目,依赖的包mybatis-3.2.0-SNAPSHOT.jar,mysql-connector-java-5.1.22-bin.jar <!-- mybatis包 --> <depe

【Todo】Mybatis学习-偏理论

之前写过好几篇Mybatis相关的文章: http://www.cnblogs.com/charlesblc/p/5906431.html  <SSM(SpringMVC+Spring+Mybatis)框架程序on IDEA> 还有这个: http://www.cnblogs.com/charlesblc/p/5939505.html   <在上已个Java Spring MVC项目基础上加MyBatis> 还有这篇单独处理Mybatis内容的: http://www.cnblog

MyBatis学习总结(一)——MyBatis快速入门(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(一)--MyBatis快速入门 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 二.mybatis快速入门 2.1.准备

MyBatis学习总结(三)——优化MyBatis配置文件中的配置(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(三)--优化MyBatis配置文件中的配置 一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org