ibatis 3 学习笔记 6

Java API

SqlSessionFactoryBuilder
SqlSessionFactory build(Reader reader)
SqlSessionFactory build(Reader reader, String environment)
SqlSessionFactory build(Reader reader, Properties properties)
SqlSessionFactory build(Reader reader, String env, Properties props)
SqlSessionFactory build(Configuration config)

前四种方法前面已经叙述了,通过Reader接口读取sqlMapConfig.xml配置文件进行配置,注意properties加载顺序。基本流程如下:
String resource = "org/apache/ibatis/builder/MapperConfig.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(reader);
这里我们用到了Reader接口,在org.apache.ibatis.io包下,其主要接口为:
URL getResourceURL(String resource)
URL getResourceURL(ClassLoader loader, String resource)
InputStream getResourceAsStream(String resource)
InputStream getResourceAsStream(ClassLoader loader, String resource)
Properties getResourceAsProperties(String resource)
Properties getResourceAsProperties(ClassLoader loader, String resource)
Reader getResourceAsReader(String resource)
Reader getResourceAsReader(ClassLoader loader, String resource)
File getResourceAsFile(String resource)
File getResourceAsFile(ClassLoader loader, String resource)
InputStream getUrlAsStream(String urlString)
Reader getUrlAsReader(String urlString)
Properties getUrlAsProperties(String urlString)
Class classForName(String className)
刚才提到最后一种build方法参数是Configation,具体可以这样使用:
DataSource dataSource = BaseDataTest.createBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment =
new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.setLazyLoadingEnabled(true);
configuration.setEnhancementEnabled(true);
configuration.getTypeAliasRegistry().registerAlias(Blog.class);
configuration.getTypeAliasRegistry().registerAlias(Post.class);
configuration.getTypeAliasRegistry().registerAlias(Author.class);
configuration.addMapper(BoundBlogMapper.class);
configuration.addMapper(BoundAuthorMapper.class);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(configuration);

SqlSessionFactory

主要配置一下三个属性
Transaction:是否将事务的范围定义为session,或者auto-commit。
Connection:是否让ibatis从datasource配置中获取连接,还是自己提供数据库连接。
Execution:是否重用PerparedStatement 和 批量操作

SqlSession openSession()
SqlSession openSession(boolean autoCommit)
SqlSession openSession(Connection connection)
SqlSession openSession(ExecutorType execType)
SqlSession openSession(ExecutorType execType, boolean autoCommit)
SqlSession openSession(ExecutorType execType, Connection connection)
Configuration getConfiguration();
默认的openSession()方法不带参数,将会默认启动以下配置:
启动事务(Not auto commit)
根据DataSource配置产生数据库连接Connection对象
不重用PreparedStatements 不启用批量操作

autoCommit 和 connection参数并不陌生,execType参数有如下三个值
ExecutorType.SIMPLE 为每条语句的执行创建一个PreparedStatement对象
ExecutorType.REUSE 重用PreparedStatement对象
ExecutorType.BATCH 批量执行

SqlSession

1、Statement Execution Methods

Object selectOne(String statement)
List selectList(String statement)
int insert(String statement)
int update(String statement)
int delete(String statement)

Object selectOne(String statement, Object parameter)
List selectList(String statement, Object parameter)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)

List selectList
(String statement, Object parameter, RowBounds rowBounds)
void select
(String statement, Object parameter, ResultHandler handler)
void select
(String statement, Object parameter, RowBounds rowBounds,
ResultHandler handler)
selectOne和selectList的区别在于selectOne只能返回一个结果,而在返回多个结果或者返回null时抛出异常

RwoBounds可以这样使用:
int offset = 100;
int limit = 25;
RowBounds rowBounds = new RowBounds(offset, limit);
ResultHandler可以自由控制数据集的每一行数据,需要继承以下接口
package org.apache.ibatis.executor.result;
public interface ResultHandler {
void handleResult(ResultContext context);
}

Transaction Control Methods

void commit()
void commit(boolean force)
void rollback()
void rollback(boolean force)
如果设置了auto commit那么这四个方法将没有效果
一般情况下不用使用rollback,ibatis会在没有调用commit的情况下自动rollback,不过还是rollback写一下的好,毕竟习惯了

保证session关闭
SqlSession session = sqlSessionFactory.openSession();
try {
    // following 3 lines pseudocod for “doing some work”
    session.insert(…);
    session.update(…);
    session.delete(…);
    session.commit();
} finally {
    session.close();
}

Using Mappers

接口:
T getMapper(Class type)

使用:
public class AuthorMapper {
// (Author) selectOne(“selectAuthor”,5);
Author selectAuthor(int id);
// (List ) selectList(“selectAuthors”)
List selectAuthors();
// insert(“insertAuthor”, author)
void insertAuthor(Author author);
// updateAuthor(“updateAuhor”, author)
void updateAuthor(Author author);
// delete(“deleteAuthor”,5)
void deleteAuthor( int id);
}


Mapper Annotations

不喜欢使用annotations进行配置,简略列一下表格:
AnnotationTargetXML Equivalent
@CacheNamespaceClass
@CacheNamespaceRefClass
@ConstructorArgsMethod
@ArgMethod
@TypeDiscriminatorMethod
@CaseMethod
@ResultsMethod
@ResultMethod
@OneMethod
@ManyMethod
@OptionsMethodAttribuates of mapped statements
@Insert
@Update
@Delete
@Select
Method


@InsertProvider
@UpdateProvider
@DeleteProvider
@SelectProvider
Method


  • Allows for creation of dynamic SQL
  • @ParamParameterN/A

    SelectBuilder

    在java代码中创建sql语句,可以使用SelectBuilder来辅助:
    public String selectBlogsSql() {
    BEGIN(); // Clears ThreadLocal variable
    SELECT("*");
    FROM("BLOG");
    return SQL();
    }

    private String selectPersonSql() {
    BEGIN(); // Clears ThreadLocal variable
    SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
    SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
    FROM("PERSON P");
    FROM("ACCOUNT A");
    INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
    INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
    WHERE("P.ID = A.ID");
    WHERE("P.FIRST_NAME like ?");
    OR();
    WHERE("P.LAST_NAME like ?");
    GROUP_BY("P.ID");
    HAVING("P.LAST_NAME like ?");
    OR();
    HAVING("P.FIRST_NAME like ?");
    ORDER_BY("P.ID");
    ORDER_BY("P.FULL_NAME");
    return SQL();
    }
    等价的sql语句:
    "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, "
    "P.LAST_NAME,P.CREATED_ON, P.UPDATED_ON " +
    "FROM PERSON P, ACCOUNT A " +
    "INNER JOIN DEPARTMENT D on D.ID = P.DEPARTMENT_ID " +
    "INNER JOIN COMPANY C on D.COMPANY_ID = C.ID " +
    "WHERE (P.ID = A.ID AND P.FIRST_NAME like ?) " +
    "OR (P.LAST_NAME like ?) " +
    "GROUP BY P.ID " +
    "HAVING (P.LAST_NAME like ?) " +
    "OR (P.FIRST_NAME like ?) " +
    "ORDER BY P.ID, P.FULL_NAME";
    动态拼接sql:
    private String selectPersonLike(Person p){
    BEGIN(); // Clears ThreadLocal variable
    SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME");
    FROM("PERSON P");
    if (p.id != null) {
    WHERE("P.ID like #{id}");
    }
    if (p.firstName != null) {
    WHERE("P.FIRST_NAME like #{firstName}");
    }
    if (p.lastName != null) {
    WHERE("P.LAST_NAME like #{lastName}");
    }
    ORDER_BY("P.LAST_NAME");
    return SQL();
    }
    MethodDescription
    BEGIN()/RESET()重置ThreadLocal状态
    SELECT(String)select 参数
    FROM(String)from 表名
    JOIN(String)
    INNER_JOIN(String)
    LEFT_OUTER_JOIN(String)
    RIGHT_OUTER_JOIN(String)
    表连接
    WHERE(String)where子句
    OR()or 子句
    AND()and 子句
    GROUP_BY()group by 子句
    HAVING(String)having 子句
    ORDER_BY(String)order by 子句
    SQL()返回拼接的sql语句
    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值