18.5.4,mybatis总结1
1.mybatis优秀的持久层框架,使开发者注重sql而不是注册驱动、创建connection、创建statement等繁琐操作。
2.Mybatis通过xml或注解的方式将要执行的各种(statment、preparestatement,callableStatement)配置起来。将duix和statement中的sql进行映射生成sql语句。最后由框架运行sql并将结果映射成java对象并返回。
3.Jdbc编程步骤:
注册驱动-获取数据库连接-创建statement对象-设置sql语句-设置sql的参
数-preparestatement执行sql语句并获得结果-处理结果集-释放资源
(resultset-preparestatement-connention)。
Class.forName(“”)-driverManager.getConnection-conn.getpreparestatement()...
4.sqlMapConfigure.xml是mybatis的全局配置文件,配置了mybatis的配置信息。
Mapper.xml是sql映射文件,此文件需要在sqlMapperConfigure.xml中加载。
通过mybatis环境等配置信息构造sqlsessionfactory即会话工厂。
由sqlsessionfactory创建sqlsession即会话。操作数据库需要sqlsession执行。
Mybatis底层定义了Executor执行器接口操作数据库。Executor有两个实现,一个是基本执行器,一个是缓存执行器。
MapperStatement是mybatis底层封装的一个对象。他包装了mybatis配置信息以及sql映射信息。Mapper.xml文件中一个sql对应一个mapperStatement对象,sql的id即是
mappersatement的id。
Mapperedstatement对sql执行输入参数进行定义,包括hashmap,基本类型,pojo。
Executor通过MapperedStatement在执行sql前将输入的java对象映射到sql中,(输入参数映射就是jdbc编程中对preparestatement进行参数设置)。
MapperedStatement对sql执行输出结果进行定义,包括hashmap、基本类型、pojo,Executor通过MapperStatement对执行sql后输出的结果映射到java对象里面(这个过程相当于jdbc编程中对结果集进行解析)。
5.mybatis-3.2.7.jar mybatis的核心包。lib文件夹 mybatis的依赖包
6.Mybatis搭建:
导入mybatis核心包,依赖包,数据库驱动包。
创建config文件夹,加入log4j和SqlMapConfig.xml配置文件。(mybatis默认使用log4j作为日志输出)。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
</configuration>
SqlMapConfig.xml是mybatis的核心配置文件,内容为数据源和事务管理。
7.pojo类作为mybatis进行sql映射使用,pojo类与数据库表相对应。
8.在SqlMapConfig.xml中加载映射文件。
<configuration>
<mappers >
<mapper resource=””/>
</mappers>
</configuration>
9.映射文件跟标签是mapper 有namesapce名空间。
#{}:输入参数的占位符,相当于jdbc的?
自动进行java类型和jdbc类型转换。如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
测试步骤:
1. 创建new SqlSessionFactoryBuilder对象
2. 加载SqlMapConfig.xml配置文件
3. 创建SqlSessionFactory对象
4. 创建SqlSession对象
5. 执行SqlSession对象执行查询,获取结果User
6. 打印结果
7. 释放资源(sqlsession)
10.parametertype指定入参,mybatis通过ognl表达式从输入对象中获得参数拼接在sql中。
Resulttype:出参,映射为对象,如果有多条则放入list集合中。
11.selectone和selectList如果使用selectone查询多条记录则抛出异常。
12.自增朱健返回:
修改映射文件,可以实现自增朱健返回。
<!-- 保存用户 -->
<insert id="saveUser" parameterType="cn.itcast.mybatis.pojo.User">
<!-- selectKey 标签实现主键返回 -->
<!-- keyColumn:主键对应的表中的哪一列 -->
<!-- keyProperty:主键对应的pojo中的哪一个属性 -->
<!-- order:设置在执行insert语句前执行查询id的sql,孩纸在执行insert语句之后执行查询id的sql -->
<!-- resultType:设置返回的id的类型 -->
<selectKey keyColumn="id" keyProperty="id" order="AFTER"
resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO `user`
(username,birthday,sex,address) VALUES
(#{username},#{birthday},#{sex},#{address})
</insert>
当mysql使用uuid做主键时获取主键需要做以下更改:
Order=“BEFORE” resulttype=“string”
13.执行增删改差都是sqlsession执行。
14.spring-jdbc.jar提供自带的连接池
15.sqlSession封装了对数据库的操作,增删改差。(创建过程:
sqlsessionFactoryBuilder(创建完工厂即无用了)-sqlsessionfactory-sqlsession)
sqlsessionFactory是一个接口:其中定义了opensession的不同重载方法,通常它的使用范围是整个应用运行期间,单例模式存在。
Sqlsession是操作数据库的,每个线程都应该有自己的sqlsession实例,sqlsession不能共享,同样它也是线程不安全的。最佳范围是请求或方法范围。绝不能放在类的静态字段或实例字段中。(sqlsession使用完毕需要关闭,放在finally中)
16.Mybatis的Dao开发方法两种:
原始dao需要自己开发dao接口和dao实现类。
动态代理开发:
Mapper的动态代理开发只需要声明接口,mybatis根据接口创建动态代理对象,该代理对象的方法体同该接口的实现类方法。
Mapper开发需要遵循一下规范:
1.mapper.xml文件中的namespace与mapper接口的类路径相同。
2.Mapper接口的方法名和mapper.xml文件定义的statement的id相同。
3.Mapper接口方法的出参和入参和mapper.xml定义的相同
步骤:从spring容器获得sqlsession,获得接口的代理对象
sqlsession.getMapper(“UserMapper.class”);
动态代理开发调用selectOne和selectList是根据配置文件的返回值指定。
入参可以使用pojo包装。
17.
Sqlmapconfig.xml中节点的顺序中properties在最上面
sqlmapconfig.xml文件中可以引用java属性文件的配置信息(db.properties)。
<configuration>
<properties resource=”db.properties”>
<!-- 如果外部配置文件有该属性,则内部定义属性被外部属性覆盖 -->
<property name=”’ value=”’/>
<property name=”’ value=”’/>
<property name=”’ value=”’/>
</properties>
</configuration>
18.<transactionManager type=”JDBC”/>使用数据库自己的事务(局部事务)
19.Properties元素内部的首先会先辈读取,然后读取resource或url,他会覆盖已经读取的同名属性。
<typeAliases>
<!-- 单个别名定义 -->
<typeAlias alias="user" type="cn.itcast.mybatis.pojo.User" />
<!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) -->
<package name="cn.itcast.mybatis.pojo" />
<package name="其它包" />
</typeAliases>
别名定义写在<properties resource下面>,别名大小写不敏感
20.
Mappers映射
<mapper resource=””/>
<mapper class=””/>此种方法要求mapper接口和mapper映射文件名相同,并放在同一个目录。