Mybatis 学习笔记1 不整合Spring的方式使用mybatis
两种方式都包含了:
package com.test.mybatis; import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.blog.bean.Passport; /**
* @author wangx
* @Date: Nov 25, 2016
* @func: 手工(非spring整合)的方式使用mybatis
* @Copyright: 2016 wangx. All rights reserved.
*/
public class ManualDaoHandle {
private final Logger log = LoggerFactory.getLogger(ManualDaoHandle.class);
public static void main(String[] args) {
SqlSession sqlSession = null;
try {
//第一种方式 使用sqlsesiontemplate
sqlSession = new SqlSessionTemplate(new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("com/test/mybatis/mybatis-config.xml")));
//第二种方式 直接使用session
//sqlSession = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("com/test/mybatis/mybatis-config.xml")).openSession();
List<Passport> list = sqlSession.selectList("getPassport",null);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(sqlSession != null) {
sqlSession.close();
}
}
}
}
mybatis-config.xml
<?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">
<!-- <!DOCTYPE configuration SYSTEM "mybatis-3-config.dtd"> -->
<configuration>
<properties resource="jdbc.properties" />
<settings>
<setting name="lazyLoadingEnabled" value="false" />
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value="" />
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/coremapper.xml" />
</mappers>
</configuration>
coremapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace和定义的Mapper接口对应,并实现其中的方法 -->
<mapper namespace="com.blog.interfaces.CoreMapper">
<select id="getPassport" parameterType="string" resultType="com.blog.bean.Passport">
select * from t_passport
</select>
</mapper>
==
区别在于,直接使用sqlsession在多线程中是不安全的,而sqlsessiontemplate是多线程安全,粗略看了下代码,挺复杂,sqlsessiontemplate在做操作,比如delete时,其实是调用的内部的sqlSessionProxy,即一个sqlsession的代理来完成的操作,而这个sqlsession的代理是这么来的:
this.sqlSessionProxy = (SqlSession) newProxyInstance(
SqlSessionFactory.class.getClassLoader(),
new Class[] { SqlSession.class },
new SqlSessionInterceptor());
第一个参数是指定由哪个类加载器来加载我们的代理对象,实际上不一定要使用上面代码中的这个CLASSLOADER,甚至可以随意自定义一个类比如class Shit{},无论这个类在哪个包中,都可以使用它的classloader来加载我们的SqlSessionInterceptor,但不能使用new HashMap().getClass().getClassLoader(),这样会报错:
Exception in thread "main" java.lang.IllegalArgumentException: interface com.test.pattern.proxy.Sqlsession is not visible from class loader
at java.lang.reflect.Proxy$ProxyClassFactory.apply(Proxy.java:616)
at java.lang.reflect.Proxy$ProxyClassFactory.apply(Proxy.java:592)
at java.lang.reflect.WeakCache$Factory.get(WeakCache.java:244)
at java.lang.reflect.WeakCache.get(WeakCache.java:141)
at java.lang.reflect.Proxy.getProxyClass0(Proxy.java:455)
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:738)
at com.test.pattern.proxy.Test.main(Test.java:47)
原因是因为HashMapl来自rt.jar包,该包的classloader为bootstrap classloader,而我们自定义的类,由system classloader加载。
第二个参数是我们的代理对象需要实现的接口
第三个参数是我们的动态代理类
==
Mybatis 学习笔记1 不整合Spring的方式使用mybatis的更多相关文章
- MyBatis学习笔记(一)创建第一个MyBatis项目
一.新建Maven项目 http://www.mybatis.org/mybatis-3/zh/index.html 该链接为MyBatis官方地址 创建MyBatis项目主要有两种办法,一种是导入j ...
- mybatis学习笔记(六)使用generator生成mybatis基础配置代码和目录结构
原文:http://blog.csdn.net/oh_mourinho/article/details/51463413 创建maven项目 <span style="font-siz ...
- 【MyBatis学习笔记】
[MyBatis学习笔记]系列之预备篇一:ant的下载与安装 [MyBatis学习笔记]系列之预备篇二:ant入门示例 [MyBatis学习笔记]系列之一:MyBatis入门示例 [MyBatis学习 ...
- mybatis学习笔记之基础复习(3)
mybatis学习笔记之基础复习(3) mybatis是什么? mybatis是一个持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己编写, 但是mybatis也是有映射(输 ...
- Mybatis学习笔记汇总(包括源码和jar包)
博客整理 Mybatis学习笔记(一)--对原生jdbc中问题的总结 Mybatis学习笔记(二)--Mybatis框架 Mybatis学习笔记(三)--入门程序 MyBatis学习笔记(四)--入门 ...
- mybatis学习笔记之基础框架(2)
mybatis学习笔记之基础框架(2) mybatis是一个持久层的框架,是apache下的顶级项目. mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足s ...
- mybatis 学习笔记(四):mybatis 和 spring 的整合
mybatis 学习笔记(四):mybatis 和 spring 的整合 尝试一下整合 mybatis 和 spring. 思路 spring通过单例方式管理SqlSessionFactory. sp ...
- mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)
文章介绍结构一览 一.使用maven创建web项目 1.新建maven项目 2.修改jre版本 3.修改Project Facts,生成WebContent文件夾 4.将WebContent下的两个文 ...
- mybatis学习笔记(六) -- maven+spring+mybatis从零开始搭建整合详细过程(下)
继续 mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上) 五.使用监听器启动Spring容器 1.修改pom.xml文件,添加Spring-we ...
随机推荐
- ORB-SLAM(三)地图初始化
单目SLAM地图初始化的目标是构建初始的三维点云.由于不能仅仅从单帧得到深度信息,因此需要从图像序列中选取两帧以上的图像,估计摄像机姿态并重建出初始的三维点云. ORB-SLAM中提到,地图初始化常见 ...
- 架构师养成记--4.volatile关键字
volatile修饰的变量可在多个线程间可见. 如下代码,在子线程运行期间主线程修改属性值并不对子线程产生影响,原因是子线程有自己独立的内存空间,其中有主内存中的变量副本. public class ...
- 【Beta】第四次任务发布
PM 日常管理&dev版宣传(周日开始). 后端 #99 服务发布 验收条件:使dev版能在www.buaaphylab.com下运行. 前端 #87 登录后能够查看与下载用户收藏的报告.生成 ...
- [转]eclipse重新编译
Eclipse打开时并不重新生成class文件,这就造成了eclipse找不到需要的class文件从而不能正常编译工程中的其他代码.此时就需要重新编译工程. 单击Project菜单,选择Clean菜单 ...
- apache2.4 绿色版环境配置。
http://jingyan.baidu.com/article/9faa723152c5d6473d28cb47.html http://jingyan.baidu.com/article/9faa ...
- Python Day8
Socket Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型 ...
- Charles抓Android的数据包
1. 获得Mac OS的IP地址 2. 对Android手机设置代理,主机IP是步骤1中获得的IP,端口8888
- JDK Collection 源码分析(1)—— Collection
JDK Collection JDK Collection作为一个最顶层的接口(root interface),JDK并不提供该接口的直接实现,而是通过更加具体的子接口(sub interface ...
- C语言基础(5)-有符号数、无符号数、printf、大小端对齐
1.有符号数和无符号数 有符号数就是最高位为符号位,0代表正数,1代表负数 无符号数最高位不是符号位,而就是数的一部分而已. 1011 1111 0000 1111 1111 0000 1011 10 ...
- 【09-04】java内部类学习笔记
java中的内部类 静态内部类 成员内部类 方法内部类 匿名内部类 1.静态内部类 class Outer { private static String outer = "outer&qu ...