Mybatis自动编译

Mybatis与Hibernate和jdbc的区别 Mybatis需要开发人员自己写sql代码,性能良好,代码简洁 Hibernate开发人员可以不写sql代码,性能稍差,代码简洁,sql不易维护 jdbc需要开发人员自己写sql代码,性能最好,代码麻烦

scope在maven的依赖管理中主要负责项目的部署,scope的分类
compile:默认值  他表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去
test:依赖项目仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,例如:junit
runtime:表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过了编译而已。例如JDBC驱动,适用运行和测试阶段
provided:打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作
system:从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径
复制代码

Oracle提供了两种连接方式: OCI:需要安装Oracle的客户端,连接效率略优于thin连接 Thin:不需要安装任何软件,连接效率略低于OCI连接,一般使用这个连接方式

new OracleDriver(); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL", "yanjun", "123456"); PreparedStatement ps = conn.prepareStatement("select sysdate from dual"); ResultSet rs = ps.executeQuery(); if (rs.next()) { Date dd = rs.getTimestamp(1); System.out.println(dd); } rs.close(); ps.close(); conn.close();

配置systempath org.wltea.analyzer IKAnalyzer 2012_u6 system ${project.basedir}/src/main/webapp/WEB-INF/lib/IKAnalyzer2012_u6.jar

引入映射接口实现对调用的约束,从而使IDE的静态类型检查生效 1、定义mapper.xml,但是其中的namespace=接口的全名 2、如果在mapper.xml中定义一个statement,则在接口添加对应的方法声明 select seq1.nextval from dual insert into t_users values(#{id},#{username},#{password},#{birth},#{sex})

	public interface UserMapper {
		public int create(UserBean user);
	}
	接口不需要定义实现,这个接口对应的实现是由框架提供的

3、通过接口调用在mapper.xml中定义的statement
	SqlSession session = fac.openSession();
	UserMapper um=session.getMapper(UserMapper.class);
	UserBean user = new UserBean();  ....
	int len=um.create(user);
复制代码

MyBatis提供了反向映射工具插件,可以根据一个配置文件对数据库中的表反向生成对应的xml映射元文件和对应的接口定义以及具体的实体类 1、在IDE工具中添加插件 将压缩文件中的eclipse文件夹拷贝到Eclipse安装路径下的dropins文件夹中,然后重启eclipse即可

2、在项目中添加反向映射的配置文件generator.xml
<!DOCTYPE generatorConfiguration
复制代码

PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "mybatis.org/dtd/mybatis…">

3、在IDE中的项目上引入数据库的驱动jar,右键点击generator.xml,就可以看到弹出的菜单中多了一个操作generator mybatis/ibatis artifacts

	根据配置文件generator.xml自动生成对应的映射xml、mapper接口、实体类,但是需要注意如果多次生成,插件默认采用的是追加的方式,插件不会自动注册映射元文件,需要手工修改配置

Reader r = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(r);
SqlSession session = fac.openSession();
UserBeanMapper userMapper = session.getMapper(UserBeanMapper.class);
userMapper.deleteByPrimaryKey(100L);
session.commit();
session.close();
复制代码

在开发中不建议使用自动生成的Example类来封装查询条件

MyBatis核心API对象作用域Scope和生命周期 1、SqlSessionFactoryBuilder类用于实现对xml文件的解析,然后创建SqlSessionFactory对象。属于即用即丢型对象。实例的最佳作用域是方法作用域(也就是局部方法变量)。 2、SqlSessionFactory是SqlSession的工厂,属于线程安全的重量级对象。最佳作用域是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。 3、SqlSession充当了实体管理器管理器功能。线程不安全的轻量级对象(ThreadLocal),是Connection对象的浅封装(try/finally)。最佳的作用域是请求或方法作用域 4、映射器实例Mappe映射器是创建用来绑定映射语句的接口。属于线程不安全、轻量级、短声明周期对象。映射器实例的最大作用域是和 SqlSession相同的,最佳作用域是方法作用域

MyBatis框架架构 1、加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。

2、SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。

3、SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。

4、结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。
复制代码

MyBatis的主要的核心部件有以下几个: SqlSession作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能 Executor是MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护 StatementHandler封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。 ParameterHandler负责对用户传递的参数转换成JDBC Statement 所需要的参数, ResultSetHandler负责将JDBC返回的ResultSet结果集对象转换成List类型的集合; TypeHandler负责java数据类型和jdbc数据类型之间的映射和转换 MappedStatement用于维护了一条<select|update|delete|insert>节点的封装, SqlSource负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回 BoundSql表示动态生成的SQL语句以及相应的参数信息

Configuration是MyBatis所有的配置信息都维持在Configuration对象之中。  1、mybatis核心配置为mybatis-config.xml,它是mybatis的全局配置文件,配置了mybatis的运行环境等信息。mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中注册加载。 SqlSessionFactoryBuilder用于读取并解析xml文件以创建SqlSessionFactory,创建完毕之后,就不再需要使用它。因此SqlSessionFactoryBuilder实例的最佳范围是方法范围 (也就是本地方法变量)。也可以重用SqlSessionFactoryBuilder来创建多个 SqlSessionFactory 实例。 2、通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂。一旦被创建,SqlSessionFactory应该在整个应用程序执行期间都存在,没有理由来处理或重新创建它。使用SqlSessionFactory的最佳实践 范围应用范围。重复创建SqlSessionFactory是非常糟糕的, 最简单的就是使用单例模式或者静态单例模式创建SqlSessionFactory 。

3、由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行,它充当了实体管理器的功能。每个线程都应该有独立的SqlSession实例。SqlSession的实例不能被共享,也是线程不安全的。因此最佳的范围是请求或方法范围。

4、mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

5、Mapped Statement也是mybatis一个底层封装对象,它包装了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设置参数。
复制代码

Mapper XML 文件

select用于实现查询,select元素有很多属性允许你配置,来决定每条语句的作用细节。 id在命名空间中唯一的标识符,可以被用来引用这条语句。 parameterType 将会传入这条语句的参数类的完全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。 resultType 从这条语句中返回的期望类型的类的完全限定名或别名。注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用 resultType 或 resultMap,但不能同时使用。 resultMap 外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,对其有一个很好的理解的话,许多复杂映射的情形都能迎刃而解。使用 resultMap 或 resultType,但不能同时使用。 flushCache 将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false。 useCache 将其设置为 true,将会导致本条语句的结果被二级缓存,默认值:对 select 元素为 true。 timeout 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。 fetchSize 这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为 unset(依赖驱动)。 statementType STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。 resultSetType FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一个,默认值为 unset (依赖驱动)。 insert, update 和 delete id 命名空间中的唯一标识符,可被用来代表这条语句。 parameterType 将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。 parameterMap 这是引用外部 parameterMap 的已经被废弃的方法。使用内联参数映射和 parameterType 属性。 flushCache 将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:true(对应插入、更新和删除语句)。 timeout 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。 statementType STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。 useGeneratedKeys (仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。 keyProperty (仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 keyColumn (仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 keyProperty selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 keyColumn 匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 resultType 结果的类型。MyBatis 通常可以推算出来,但是为了更加确定写上也不会有什么问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。 order 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素 - 这和像 Oracle 的数据库相似,在插入语句内部可能有嵌入索引调用。 statementType 与前面相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 语句的映射类型,分别代表 PreparedStatement 和 CallableStatement 类型。 sql元素可以被用来定义可重用的 SQL 代码段,可以包含在其他语句中。它可以被静态地(在加载参数) 参数化. 不同的属性值通过包含的实例变化 resultMap constructor - 用于在实例化类时,注入结果到构造方法中 idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能 arg - 将被注入到构造方法的一个普通结果 id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能 result – 注入到字段或 JavaBean 属性的普通结果 id 当前命名空间中的一个唯一标识,用于标识一个result map. type 类的完全限定名, 或者一个类型别名 (内置的别名可以参考上面的表格). autoMapping 如果设置这个属性,MyBatis将会为这个ResultMap开启或者关闭自动映射。这个属性会覆盖全局的属性 autoMappingBehavior。默认值为:unset。 MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦

转载于:https://juejin.im/post/5c07bc45f265da613f2f43dd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值