Mybatis 学习笔记1 不整合Spring的方式使用mybatis
2016-11-26 21:08
639 查看
两种方式都包含了:
mybatis-config.xml
coremapper.xml
==
区别在于,直接使用sqlsession在多线程中是不安全的,而sqlsessiontemplate是多线程安全,粗略看了下代码,挺复杂,sqlsessiontemplate在做操作,比如delete时,其实是调用的内部的sqlSessionProxy,即一个sqlsession的代理来完成的操作,而这个sqlsession的代理是这么来的:
第一个参数是指定由哪个类加载器来加载我们的代理对象,实际上不一定要使用上面代码中的这个CLASSLOADER,甚至可以随意自定义一个类比如class Shit{},无论这个类在哪个包中,都可以使用它的classloader来加载我们的SqlSessionInterceptor,但不能使用new HashMap().getClass().getClassLoader(),这样会报错:
原因是因为HashMapl来自rt.jar包,该包的classloader为bootstrap classloader,而我们自定义的类,由system classloader加载。
第二个参数是我们的代理对象需要实现的接口
第三个参数是我们的动态代理类
==
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加载。
第二个参数是我们的代理对象需要实现的接口
第三个参数是我们的动态代理类
==
相关文章推荐
- Java学习笔记32:Spring整合mybatis使用
- SpringMVC + Spring + MyBatis 学习笔记:在类和方法上都使用RequestMapping如何访问
- Spring学习笔记(15)----使用Spring注解方式管理事务
- Spring+SpringMVC+mybatis+easyui整合-----注解方式的mybatis的使用
- Spring+SpringMVC+mybatis+easyui整合实例(二)注解方式的mybatis的使用
- springboot使用之二:整合mybatis(xml方式)并添加PageHelper插件
- Spring学习笔记----三大框架(Spring+SpringMVC+MyBatis)整合详细教程
- Spring学习笔记(17)----使用Spring注解方式管理事务
- springMVC学习笔记---day02 springMVC+spring+mybatis整合开发框架搭建
- (四)mybatis学习之原始Dao开发方式及与spring整合
- MyBatis学习笔记-Spring集成DAO层实现方式记录
- 【Spring学习笔记】五、使用JDBCTemplate以对象方式操作数据库
- ITCAST视频-Spring学习笔记(使用Spring的注解方式实现AOP的细节)
- MyBatis学习笔记(十二)spring与Mybatis整合事务
- springMVC学习笔记,SpringMV与web项目的整合(xml方式)
- spring学习笔记7--使用spring进行面向切面的(AOP)编程(1)注解方式实现
- spring学习笔记(12)——使用注解方式配置bean
- myBatis学习笔记(9)——spring整合mybatis
- ITCAST视频-Spring学习笔记(使用Spring的注解方式实现AOP入门)
- Mybatis学习笔记---day04 mybatis与spring整合