mybatis研究:select性能对比

Posted 寻梦人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis研究:select性能对比相关的知识,希望对你有一定的参考价值。

 

  1 package sss.mybatis_1;
  2 
  3 import java.io.InputStream;
  4 import java.security.Principal;
  5 import java.util.ArrayList;
  6 import java.util.List;
  7 import java.util.Properties;
  8 import java.sql.*;
  9 
 10 import com.mysql.jdbc.ConnectionImpl;
 11 import com.mysql.jdbc.JDBC4Connection;
 12 import com.mysql.jdbc.JDBC4MySQLConnection;
 13 //import org.apache.commons.lang.time.StopWatch;
 14 import com.sun.javafx.Logging;
 15 import org.apache.commons.dbcp.BasicDataSource;
 16 import org.apache.commons.dbcp.DataSourceConnectionFactory;
 17 import org.apache.commons.lang3.time.StopWatch;
 18 import org.apache.ibatis.io.Resources;
 19 import org.apache.ibatis.session.Configuration;
 20 import org.apache.ibatis.session.SqlSession;
 21 import org.apache.ibatis.session.SqlSessionFactory;
 22 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 23 
 24 import org.apache.ibatis.transaction.TransactionFactory;
 25 import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
 26 
 27 import javax.sql.DataSource;
 28 
 29 /**
 30  * Created by fenggq on 2016/3/2.
 31  */
 32 public class PerformanceTest {
 33 
 34 
 35     public class Record {
 36 
 37         public int Times;
 38 
 39         public long OpenSessionEveryTime_XMLMapper;
 40         public long OpenSessionOneTime_XMLMapper;
 41         public long OpenSessionOneTime_AnnotionMapper;
 42         public long OpenSessionEveryTime_AnnotionMapper;
 43         public long JDBCOneTime;
 44         public long JDBCEveryTime;
 45         public long BDCPOneTime;
 46 
 47 
 48     }
 49 
 50 
 51     public static void main(String[] args) throws Exception {
 52         PerformanceTest performanceTest = new PerformanceTest();
 53         performanceTest.Test();
 54     }
 55 
 56     private void Test() throws Exception {
 57         {
 58 
 59 
 60           //org.apache.ibatis.logging.LogFactory.useLog4J2Logging();
 61             //             org.apache.ibatis.logging.LogFactory.useJdkLogging();
 62 
 63 
 64 
 65             InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
 66 
 67             SqlSessionFactory sqlSessionFactory = null;
 68             SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
 69             sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
 70 
 71             is.close();
 72             StopWatch sw1 = new StopWatch();
 73 
 74 
 75             fgq.mybatis_1.UI ui;
 76             UI2 ui2;
 77 
 78             List<?> result;
 79 
 80             SqlSession sqlSession = null;
 81 
 82 
 83             //region 为了公平,SessionFactory预先加载
 84             sqlSession = sqlSessionFactory.openSession();
 85             ui = sqlSession.selectOne("selectbutton", "buttonAdd");
 86             UI2Mapper ui2Mapper = sqlSession.getMapper(UI2Mapper.class);
 87             sqlSession.close();
 88             //endregion
 89 
 90 
 91             Integer times = 10;
 92             ArrayList<Integer> AllTime = new ArrayList<Integer>();
 93             ArrayList<Record> records = new ArrayList<Record>();
 94             Record record;
 95 
 96             AllTime.add(1);
 97             AllTime.add(2);
 98             AllTime.add(10);
 99             AllTime.add(100);
100             AllTime.add(200);
101             AllTime.add(1000);
102 
103 
104             for (int ii = 0; ii < AllTime.size(); ii++) {
105 
106                 times = AllTime.get(ii);
107                 record = new Record();
108                 records.add(record);
109                 record.Times = times;
110 
111 
112 ///////////////////////////////////////////////
113 
114                 sw1.start();
115                 for (Integer i = 0; i < times; i++) {
116                     sqlSession = sqlSessionFactory.openSession();
117                     ui = sqlSession.selectOne("selectbutton", "buttonAdd" + i);
118                     sqlSession.close();
119                 }
120                 record.OpenSessionEveryTime_XMLMapper = sw1.getTime();
121                 sw1.stop();
122                 sw1.reset();
123 
124 //////////////////////////////////////////
125                 sw1.start();
126                 sqlSession = sqlSessionFactory.openSession();
127                 for (Integer i = 0; i < times; i++) {
128 
129                     ui = sqlSession.selectOne("selectbutton", "buttonAdd" + i);
130 
131                 }
132                 sqlSession.close();
133 
134                 record.OpenSessionOneTime_XMLMapper = sw1.getTime();
135                 sw1.stop();
136                 sw1.reset();
137 
138 //////////////////////////////////////////
139 
140                 sw1.start();
141                 sqlSession = sqlSessionFactory.openSession();
142                 ui2Mapper = sqlSession.getMapper(UI2Mapper.class);
143 
144                 for (Integer i = 0; i < times; i++) {
145                     ui2 = ui2Mapper.SelectOne("buttonAdd" + i);
146                 }
147                 sqlSession.close();
148                 //System.out.println("OpenSessionOneTime_AnnotionMapper:" + sw1.getTime());
149                 record.OpenSessionOneTime_AnnotionMapper = sw1.getTime();
150                 sw1.stop();
151                 sw1.reset();
152 //////////////////////////////////////////
153 
154                 sw1.start();
155 
156                 for (Integer i = 0; i < times; i++) {
157                     sqlSession = sqlSessionFactory.openSession();
158                     ui2Mapper = sqlSession.getMapper(UI2Mapper.class);
159                     ui2 = ui2Mapper.SelectOne("buttonAdd" + i);
160                     sqlSession.close();
161                 }
162 
163                 //System.out.println("OpenSessionEveryTime_AnnotionMapper:" + sw1.getTime());
164                 record.OpenSessionEveryTime_AnnotionMapper = sw1.getTime();
165                 sw1.stop();
166                 sw1.reset();
167 //////////////////////////////////////////
168 
169 
170                 // 驱动程序名
171                 String driver = "com.mysql.jdbc.Driver";
172                 String uri = "jdbc:mysql://*******:*********/*********";
173 
174 
175                 Properties p = new Properties();
176 
177                 p.setProperty("username", "root");
178                 p.setProperty("password", "oracle");
179 
180                 Connection connection;
181 
182 
183                 sw1.reset();
184                 sw1.start();
185                 connection = DriverManager.getConnection(uri, "root", "oracle");
186                 for (Integer i = 0; i < times; i++) {
187 
188                     PreparedStatement s = connection.prepareStatement("select e.button_id,e.text_value\\n" +
189                             "        from kingkoo_wms.ui_button e\\n" +
190                             "        WHERE e.button_id=?");
191 
192                     s.setString(1, "buttonAdd" + i);
193                     ResultSet rs = s.executeQuery();
194 
195 
196                     while (rs.next()) {
197 
198                 ui = new fgq.mybatis_1.UI();
199                 ui.setButton_id(rs.getString("button_id"));
200                 ui.setText_value(rs.getString("text_value"));
201 
202                     }
203 
204                 }
205                 connection.close();
206 
207                 record.JDBCOneTime = sw1.getTime();
208                 sw1.stop();
209                 sw1.reset();
210 
211 
212 //////////////////////////////////////////////////////////////////
213 
214 
215                 sw1.start();
216 
217                 for (Integer i = 0; i < times; i++) {
218                     connection = DriverManager.getConnection(uri, "root", "oracle");
219 
220                     PreparedStatement s = connection.prepareStatement("select e.button_id,e.text_value\\n" +
221                             "        from kingkoo_wms.ui_button e\\n" +
222                             "        WHERE e.button_id=?");
223 
224                     s.setString(1, "buttonAdd" + i);
225                     ResultSet rs = s.executeQuery();
226 
227 
228                     while (rs.next()) {
229 
230                 ui = new fgq.mybatis_1.UI();
231                 ui.setButton_id(rs.getString("button_id"));
232                 ui.setText_value(rs.getString("text_value"));
233 
234                     }
235                     connection.close();
236                 }
237 
238 
239 
240                 record.JDBCEveryTime = sw1.getTime();
241                 sw1.stop();
242                 sw1.reset();
243 
244 
245 //////////////////////////////////////////////////////////////////
246 
247 
248                 org.apache.commons.dbcp.BasicDataSource dataSource = new BasicDataSource();
249                 dataSource.setDriverClassName("com.mysql.jdbc.Driver");
250                 dataSource.setUrl("jdbc:mysql://*******:*****/*******");
251                 dataSource.setUsername("root");
252                 dataSource.setPassword("oracle");
253 
254 
255                 org.apache.commons.dbcp.DataSourceConnectionFactory dataSourceConnectionFactory = null;
256 
257 
258                 dataSourceConnectionFactory = new DataSourceConnectionFactory(dataSource);
259                 connection = dataSourceConnectionFactory.createConnection();
260 
261                 sw1.start();
262                 for (Integer i = 0; i < times; i++) {
263 
264                     PreparedStatement s = connection.prepareStatement("select e.button_id,e.text_value\\n" +
265                             "        from kingkoo_wms.ui_button e\\n" +
266                             "        WHERE e.button_id=?");
267 
268                     s.setString(1, "buttonAdd" + i);
269                     ResultSet rs = s.executeQuery();
270 
271 
272                     while (rs.next()) {
273 
274                         ui = new fgq.mybatis_1.UI();
275                         ui.setButton_id(rs.getString("button_id"));
276                         ui.setText_value(rs.getString("text_value"));
277 
278                     }
279 
280                 }
281 
282                 connection.close();
283 
284                 record.BDCPOneTime = sw1.getTime();
285 
286                 sw1.stop();
287                 sw1.reset();
288 
289 
290             }
291 
292             System.out.println(String.format("%s %s %s %s %s %s %s %s", "Times", "BDCPOneTime", "JDBCEveryTime", "JDBCOneTime", "OpenSessionEveryTime_AnnotionMapper", "OpenSessionEveryTime_XMLMapper"
293                     , "OpenSessionOneTime_AnnotionMapper", "OpenSessionOneTime_XMLMapper"
294             ));
295 
296             for (int i = 0; i < records.size(); i++) {
297                 record = records.get(i);
298 
299 
300                 System.out.println(String.format("%d %d %d %d %d %d %d %d"
301                         , record.Times, record.BDCPOneTime, record.JDBCEveryTime, record.JDBCOneTime, record.OpenSessionEveryTime_AnnotionMapper, record.OpenSessionEveryTime_XMLMapper
302                         , record.OpenSessionOneTime_AnnotionMapper, record.OpenSessionOneTime_XMLMapper
303                 ));
304 
305             }
306 
307         }
308 
309 
310     }
311 }
312  
View Code

 

<mapper namespace="org.mybatis.example.BlogMapper">
    <resultMap id="BlogMapper" type="fgq.mybatis_1.UI">
        <id column="button_id" property="button_id"  ></id>
    </resultMap>
    <select id="selectbutton"   resultType="fgq.mybatis_1.UI" useCache="false">
        select e.button_id,e.text_value
        from mysql_test.ui_button e
        WHERE e.button_id=#{id}

    </select>

</mapper>
xml mapper

 

 

 

public interface UI2Mapper {



    @Select("select e.button_id,e.text_value from mysql_test.ui_button e WHERE e.button_id=#{id}")
    @Options( useCache = false)
    UI2 SelectOne(String id);



}

  

 

 

 

 

 

 

从结果看,mybatis方式的select比原生态的代码,速度慢两倍,相比dapper而言差距还是很大的。 (https://github.com/StackExchange/dapper-dot-net)

不过两者可比性不大,毕竟不是同一种东西,功能也不一样。

 

以上是关于mybatis研究:select性能对比的主要内容,如果未能解决你的问题,请参考以下文章

浅谈Mybatis

MyBatis源码分析select源码分析及小结

基于mybatis向oracle中插入数据的性能对比

mybatis与hibernate的区别持久层对比面试题

对比JPA 和Hibernate 和 Mybatis的区别

6.mybatis里面的动态sql是怎么设定的,常用标签有那些以及其