一 : 使用jdbc操作数据库进行开发时会有些不方便的地方,具体如下
1、 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能.解决方案:如果使用数据库链接池可解决此问题。
2、 Sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。解决方案:mybatis的sql语句写在mapper.xml文件中
3、 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。解决方案: mybatis在mapper.xml文件的使用parameterType 传递参数,可以是基本数据类型,POJO类型,hashmap类型等,解决传递参数的问题
4、 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。解决方案:mybatis中在mapper.xml文件中使用resultType封装查询结果,可以为POJO类型等,解决对结果集解析的问题
二 : 引入Mybatis
1、 mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。加载完成后将编译好的sql语句存储到SqlsessionFactory和SqlSession中。
2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
publicinterface Executor {
// ResultHandler接口
ResultHandler NO_RESULT_HANDLER =null;
//修改
int update(MappedStatement ms, Object parameter)throws SQLException;
//查询返回list集合
<E> List<E> query(MappedStatementms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler,CacheKey cacheKey, BoundSql boundSql)throws
SQLException;
<E> List<E> query(MappedStatementms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler)throws SQLException;
List<BatchResult> flushStatements()throws SQLException;
void commit(boolean required)throws SQLException;
void rollback(boolean required)throws SQLException;
CacheKey createCacheKey(MappedStatement ms,Object parameterObject, RowBounds rowBounds, BoundSql boundSql);
boolean isCached(MappedStatement ms, CacheKey key);
void clearLocalCache();
void deferLoad(MappedStatement ms, MetaObject resultObject, String property, CacheKey key,Class<?> targetType);
Transaction getTransaction();
void close(boolean forceRollback);
boolean isClosed();
void setExecutorWrapper(Executorexecutor);
5、 MappedStatement也是mybatis一个底层封装对象,封装了mybatis中数据的实体类,就是一个POJO对象,它包装了mybatis配置信息及sql映射信息等。 mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
6、 Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数.
如下:MappedStatment就是封装了mybatis数据的实体类
publicfinalclass MappedStatement {
private Stringresource;
private Configurationconfiguration;
private Stringid;
private IntegerfetchSize;
private Integertimeout;
private StatementTypestatementType;
private ResultSetTyperesultSetType;
private SqlSourcesqlSource;
private Cachecache;
private ParameterMapparameterMap;
private List<ResultMap>resultMaps;
privatebooleanflushCacheRequired;
privatebooleanuseCache;
privatebooleanresultOrdered;
private SqlCommandTypesqlCommandType;
private KeyGeneratorkeyGenerator;
private String[]keyProperties;
private String[]keyColumns;
privatebooleanhasNestedResultMaps;
private StringdatabaseId;
private LogstatementLog;
private LanguageDriverlang;
private String[]resultSets;