标签:except 管理 大小写 运行环境 boolean owa 获得 signature 线程安全
他是java基于持久层的框架(和数据库交互的一层),它支持定制化 SQL、存储过程以及高级映射(不像hibernate把发送sql作为暗箱操作,而他是可以完全看出来的可以看的到的sql语句).MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
定制化sql,存储过程以及高级映射。
SqlSessionFactory
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。
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文件
resource属性:引入类路径下的资源
url:是引入网络路径或者磁盘路径下的资源
1 <properties resource="dbconfig.properties"></properties>
setting
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为
<settings> <!-- 设置是否使用驼峰命名法 形如last_name lastName --> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
这个标签视为一些复杂的名称对象取别名来简化书写 默认为类名首字母小写
如果一个一个取别名,那么就会显得很累!所以又有一个批量取别名的标签
<typeAliases> <!--给类名起别名 --> <typeAlias type="com.jdztc.mybatis.javabean.Employee" alias="employee"/> <!-- 批量取别名 给某个包极其子包所有的类取别名 默认为类名首字母小写 但是别名是不区分大小写的 --> <package name="com.jdztc.mybatis.javaBean"/> <!-- 会遇到一个问题 如果父包与子包的类名一致这时就会报错 解决方案:使用@Alias解决 --> </typeAliases>
类型处理器
将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); } }
然后引入
MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
通过实现拦截器接口通过@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 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>
数据库厂商配置
得到数据库厂商的标识
<databaseIdProvider type="DB_VENDOR"> <property name="MySQL" value="mysql"/> </databaseIdProvider>
导入映射文件
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支持自增主键,mybatis自增主键值的获取,也是利用statement.getGeneratekeys()
insert标签的useGeneratekeys属性是使用主键获取主键值策略
keyProperty:指定对应的主键属性,也就是mybatis获取主键以后,将这个值封装javaBean哪个属性
要想让接口有返回值,直接修改接口的方法的返回值就可以了
mybati不但支持查询返回结果,还支持增删改定义以下返回值 Integer long Boolean
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>
单个参数,mybatis不会做特殊处理
#{} 不在乎大括号内是什么
多个参数 mybatis会做特殊处理 会把多个参数封装成一个map
那怎么获取参数呢?
通过key来 注意此时的key也比较特殊是固定的param1 ....paramN
标签:except 管理 大小写 运行环境 boolean owa 获得 signature 线程安全
原文地址:http://www.cnblogs.com/fupengpeng/p/7531925.html