Mybatis手写Mybatis框架实现Mybatis封装的JDBC功能-----Mybatis框架

红太狼 2024-03-24 22:18 155阅读 0赞
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>org.god.ibatis</groupId>
  7. <artifactId>godbatis</artifactId>
  8. <version>1.0</version>
  9. <packaging>jar</packaging>
  10. <dependencies>
  11. <dependency>
  12. <groupId>org.dom4j</groupId>
  13. <artifactId>dom4j</artifactId>
  14. <version>2.1.3</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>jaxen</groupId>
  18. <artifactId>jaxen</artifactId>
  19. <version>1.2.0</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>junit</groupId>
  23. <artifactId>junit</artifactId>
  24. <version>4.13.2</version>
  25. <scope>test</scope>
  26. </dependency>
  27. <dependency>
  28. <groupId>mysql</groupId>
  29. <artifactId>mysql-connector-java</artifactId>
  30. <version>8.0.30</version>
  31. </dependency>
  32. </dependencies>
  33. <properties>
  34. <maven.compiler.source>17</maven.compiler.source>
  35. <maven.compiler.target>17</maven.compiler.target>
  36. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  37. </properties>
  38. </project>
  39. <?xml version="1.0" encoding="UTF-8"?>
  40. <project xmlns="http://maven.apache.org/POM/4.0.0"
  41. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  42. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  43. <modelVersion>4.0.0</modelVersion>
  44. <groupId>org.god.ibatis</groupId>
  45. <artifactId>godbatis</artifactId>
  46. <version>1.0</version>
  47. <packaging>jar</packaging>
  48. <dependencies>
  49. <dependency>
  50. <groupId>org.dom4j</groupId>
  51. <artifactId>dom4j</artifactId>
  52. <version>2.1.3</version>
  53. </dependency>
  54. <dependency>
  55. <groupId>jaxen</groupId>
  56. <artifactId>jaxen</artifactId>
  57. <version>1.2.0</version>
  58. </dependency>
  59. <dependency>
  60. <groupId>junit</groupId>
  61. <artifactId>junit</artifactId>
  62. <version>4.13.2</version>
  63. <scope>test</scope>
  64. </dependency>
  65. <dependency>
  66. <groupId>mysql</groupId>
  67. <artifactId>mysql-connector-java</artifactId>
  68. <version>8.0.30</version>
  69. </dependency>
  70. </dependencies>
  71. <properties>
  72. <maven.compiler.source>17</maven.compiler.source>
  73. <maven.compiler.target>17</maven.compiler.target>
  74. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  75. </properties>
  76. </project>
  77. package org.god.ibatis.core;
  78. public class Const
  79. {
  80. private Const(){}
  81. //整个框架的常量类
  82. public static final String UN_POOLED_DATASOURCE = "UNPOOLED";
  83. public static final String POOLED_DATASOURCE = "POOLED";
  84. public static final String JNDI_DATASOURCE = "JNDI";
  85. public static final String JDBC_TRANSACTION = "JDBC";
  86. public static final String MANAGED_TRANSACTION = "MANAGED";
  87. }
  88. package org.god.ibatis.core;
  89. public class Const
  90. {
  91. private Const(){}
  92. //整个框架的常量类
  93. public static final String UN_POOLED_DATASOURCE = "UNPOOLED";
  94. public static final String POOLED_DATASOURCE = "POOLED";
  95. public static final String JNDI_DATASOURCE = "JNDI";
  96. public static final String JDBC_TRANSACTION = "JDBC";
  97. public static final String MANAGED_TRANSACTION = "MANAGED";
  98. }
  99. package org.god.ibatis.core;
  100. import javax.sql.DataSource;
  101. import java.sql.Connection;
  102. import java.sql.SQLException;
  103. public class JdbcTransaction implements Transaction
  104. {
  105. //Jdbc事务管理器
  106. //godBatis只实现这个
  107. //我们控制事务需要调用connection的方法实现
  108. //需要调用连接对象的方法
  109. //我们的连接对象是从数据源来的
  110. //数据源属性必须要有,不然无法做事务的操作
  111. private DataSource dataSource = null;
  112. //数据源属性,是获取Connection对象的,所以这个数据源要实现DataSource
  113. //我们只需要三个实现即可,POOLED,UNPOOLED,JNDI
  114. public JdbcTransaction(DataSource dataSource, boolean autoCommit) {
  115. //创建事务管理器对象
  116. this.dataSource = dataSource;
  117. this.autoCommit = autoCommit;
  118. }
  119. //将connection对外暴露,可以执行SQL语句,必须在同一个事务管理器下,是同一个连接
  120. @Override
  121. public Connection getConnection()
  122. {
  123. return connection;
  124. }
  125. //因为openConnection已经创建对象了,就不会再生成新的连接,就能保证是同一个连接对象了
  126. private Connection connection;
  127. @Override
  128. public void openConnection()
  129. {
  130. try
  131. {
  132. connection = dataSource.getConnection();
  133. connection.setAutoCommit(autoCommit);
  134. }
  135. catch (SQLException e)
  136. {
  137. throw new RuntimeException(e);
  138. }
  139. }
  140. private boolean autoCommit;
  141. //自动提交的标记,
  142. @Override
  143. public void commit()
  144. {
  145. try
  146. {
  147. connection.commit();
  148. }
  149. catch (SQLException e)
  150. {
  151. e.printStackTrace();
  152. }
  153. }
  154. @Override
  155. public void rollback()
  156. {
  157. try {
  158. connection.rollback();
  159. } catch (SQLException e) {
  160. e.printStackTrace();
  161. }
  162. }
  163. @Override
  164. public void close()
  165. {
  166. try {
  167. connection.close();
  168. } catch (SQLException e) {
  169. e.printStackTrace();
  170. }
  171. }
  172. }
  173. package org.god.ibatis.core;
  174. import javax.sql.DataSource;
  175. import java.sql.Connection;
  176. import java.sql.SQLException;
  177. public class JdbcTransaction implements Transaction
  178. {
  179. //Jdbc事务管理器
  180. //godBatis只实现这个
  181. //我们控制事务需要调用connection的方法实现
  182. //需要调用连接对象的方法
  183. //我们的连接对象是从数据源来的
  184. //数据源属性必须要有,不然无法做事务的操作
  185. private DataSource dataSource = null;
  186. //数据源属性,是获取Connection对象的,所以这个数据源要实现DataSource
  187. //我们只需要三个实现即可,POOLED,UNPOOLED,JNDI
  188. public JdbcTransaction(DataSource dataSource, boolean autoCommit) {
  189. //创建事务管理器对象
  190. this.dataSource = dataSource;
  191. this.autoCommit = autoCommit;
  192. }
  193. //将connection对外暴露,可以执行SQL语句,必须在同一个事务管理器下,是同一个连接
  194. @Override
  195. public Connection getConnection()
  196. {
  197. return connection;
  198. }
  199. //因为openConnection已经创建对象了,就不会再生成新的连接,就能保证是同一个连接对象了
  200. private Connection connection;
  201. @Override
  202. public void openConnection()
  203. {
  204. try
  205. {
  206. connection = dataSource.getConnection();
  207. connection.setAutoCommit(autoCommit);
  208. }
  209. catch (SQLException e)
  210. {
  211. throw new RuntimeException(e);
  212. }
  213. }
  214. private boolean autoCommit;
  215. //自动提交的标记,
  216. @Override
  217. public void commit()
  218. {
  219. try
  220. {
  221. connection.commit();
  222. }
  223. catch (SQLException e)
  224. {
  225. e.printStackTrace();
  226. }
  227. }
  228. @Override
  229. public void rollback()
  230. {
  231. try {
  232. connection.rollback();
  233. } catch (SQLException e) {
  234. e.printStackTrace();
  235. }
  236. }
  237. @Override
  238. public void close()
  239. {
  240. try {
  241. connection.close();
  242. } catch (SQLException e) {
  243. e.printStackTrace();
  244. }
  245. }
  246. }
  247. package org.god.ibatis.core;
  248. import javax.sql.DataSource;
  249. import java.io.PrintWriter;
  250. import java.sql.Connection;
  251. import java.sql.SQLException;
  252. import java.sql.SQLFeatureNotSupportedException;
  253. import java.util.logging.Logger;
  254. //数据源的实现类JNDI
  255. //使用第三方的数据库连接池获取Connection对象
  256. public class JndiDataSource implements DataSource
  257. {
  258. @Override
  259. public Connection getConnection() throws SQLException {
  260. return null;
  261. }
  262. @Override
  263. public Connection getConnection(String username, String password) throws SQLException {
  264. return null;
  265. }
  266. @Override
  267. public PrintWriter getLogWriter() throws SQLException {
  268. return null;
  269. }
  270. @Override
  271. public void setLogWriter(PrintWriter out) throws SQLException {
  272. }
  273. @Override
  274. public void setLoginTimeout(int seconds) throws SQLException {
  275. }
  276. @Override
  277. public int getLoginTimeout() throws SQLException {
  278. return 0;
  279. }
  280. @Override
  281. public Logger getParentLogger() throws SQLFeatureNotSupportedException {
  282. return null;
  283. }
  284. @Override
  285. public <T> T unwrap(Class<T> iface) throws SQLException {
  286. return null;
  287. }
  288. @Override
  289. public boolean isWrapperFor(Class<?> iface) throws SQLException {
  290. return false;
  291. }
  292. }
  293. package org.god.ibatis.core;
  294. import javax.sql.DataSource;
  295. import java.io.PrintWriter;
  296. import java.sql.Connection;
  297. import java.sql.SQLException;
  298. import java.sql.SQLFeatureNotSupportedException;
  299. import java.util.logging.Logger;
  300. //数据源的实现类JNDI
  301. //使用第三方的数据库连接池获取Connection对象
  302. public class JndiDataSource implements DataSource
  303. {
  304. @Override
  305. public Connection getConnection() throws SQLException {
  306. return null;
  307. }
  308. @Override
  309. public Connection getConnection(String username, String password) throws SQLException {
  310. return null;
  311. }
  312. @Override
  313. public PrintWriter getLogWriter() throws SQLException {
  314. return null;
  315. }
  316. @Override
  317. public void setLogWriter(PrintWriter out) throws SQLException {
  318. }
  319. @Override
  320. public void setLoginTimeout(int seconds) throws SQLException {
  321. }
  322. @Override
  323. public int getLoginTimeout() throws SQLException {
  324. return 0;
  325. }
  326. @Override
  327. public Logger getParentLogger() throws SQLFeatureNotSupportedException {
  328. return null;
  329. }
  330. @Override
  331. public <T> T unwrap(Class<T> iface) throws SQLException {
  332. return null;
  333. }
  334. @Override
  335. public boolean isWrapperFor(Class<?> iface) throws SQLException {
  336. return false;
  337. }
  338. }
  339. package org.god.ibatis.core;
  340. import javax.sql.DataSource;
  341. import java.sql.Connection;
  342. public class ManagedTransaction implements Transaction
  343. {
  344. //godBatis对这个类就不实现了
  345. private DataSource dataSource;
  346. @Override
  347. public void openConnection() {
  348. }
  349. @Override
  350. public void commit() {
  351. }
  352. @Override
  353. public Connection getConnection() {
  354. return null;
  355. }
  356. @Override
  357. public void rollback() {
  358. }
  359. @Override
  360. public void close() {
  361. }
  362. }
  363. package org.god.ibatis.core;
  364. import javax.sql.DataSource;
  365. import java.sql.Connection;
  366. public class ManagedTransaction implements Transaction
  367. {
  368. //godBatis对这个类就不实现了
  369. private DataSource dataSource;
  370. @Override
  371. public void openConnection() {
  372. }
  373. @Override
  374. public void commit() {
  375. }
  376. @Override
  377. public Connection getConnection() {
  378. return null;
  379. }
  380. @Override
  381. public void rollback() {
  382. }
  383. @Override
  384. public void close() {
  385. }
  386. }
  387. package org.god.ibatis.core;
  388. public class MappedStatement
  389. {
  390. //这是一个普通的java类,封装了一个SQL标签
  391. //一个MappedStatement对象对应一个SQL标签
  392. //一个sql标签中所有的信息封装到该对象中
  393. //体现了面向对象编程实现
  394. //要封装的结果集类型
  395. //当select语句的时候,会对应一个resultType的值
  396. public MappedStatement(){}
  397. private String sql;
  398. private String resultType;
  399. @Override
  400. public String toString() {
  401. return "MappedStatement{" +
  402. "sql='" + sql + '\'' +
  403. ", resultType='" + resultType + '\'' +
  404. '}';
  405. }
  406. public String getSql() {
  407. return sql;
  408. }
  409. public void setSql(String sql) {
  410. this.sql = sql;
  411. }
  412. public String getResultType()
  413. {
  414. return resultType;
  415. }
  416. public void setResultType(String resultType)
  417. {
  418. this.resultType = resultType;
  419. }
  420. public MappedStatement(String sql, String resultType)
  421. {
  422. this.sql = sql;
  423. this.resultType = resultType;
  424. }
  425. }
  426. package org.god.ibatis.core;
  427. public class MappedStatement
  428. {
  429. //这是一个普通的java类,封装了一个SQL标签
  430. //一个MappedStatement对象对应一个SQL标签
  431. //一个sql标签中所有的信息封装到该对象中
  432. //体现了面向对象编程实现
  433. //要封装的结果集类型
  434. //当select语句的时候,会对应一个resultType的值
  435. public MappedStatement(){}
  436. private String sql;
  437. private String resultType;
  438. @Override
  439. public String toString() {
  440. return "MappedStatement{" +
  441. "sql='" + sql + '\'' +
  442. ", resultType='" + resultType + '\'' +
  443. '}';
  444. }
  445. public String getSql() {
  446. return sql;
  447. }
  448. public void setSql(String sql) {
  449. this.sql = sql;
  450. }
  451. public String getResultType()
  452. {
  453. return resultType;
  454. }
  455. public void setResultType(String resultType)
  456. {
  457. this.resultType = resultType;
  458. }
  459. public MappedStatement(String sql, String resultType)
  460. {
  461. this.sql = sql;
  462. this.resultType = resultType;
  463. }
  464. }
  465. package org.god.ibatis.core;
  466. import javax.sql.DataSource;
  467. import java.io.PrintWriter;
  468. import java.sql.Connection;
  469. import java.sql.SQLException;
  470. import java.sql.SQLFeatureNotSupportedException;
  471. import java.util.logging.Logger;
  472. //数据源的实现类POOLED
  473. //使用GodBatis内置的数据库连接池获取对象
  474. public class PooledDataSource implements DataSource {
  475. @Override
  476. public Connection getConnection() throws SQLException {
  477. //从数据库连接池中获取connection对象
  478. //需要自己写一个连接池(自己封装)
  479. return null;
  480. }
  481. @Override
  482. public Connection getConnection(String username, String password) throws SQLException {
  483. return null;
  484. }
  485. @Override
  486. public PrintWriter getLogWriter() throws SQLException {
  487. return null;
  488. }
  489. @Override
  490. public void setLogWriter(PrintWriter out) throws SQLException {
  491. }
  492. @Override
  493. public void setLoginTimeout(int seconds) throws SQLException {
  494. }
  495. @Override
  496. public int getLoginTimeout() throws SQLException {
  497. return 0;
  498. }
  499. @Override
  500. public Logger getParentLogger() throws SQLFeatureNotSupportedException {
  501. return null;
  502. }
  503. @Override
  504. public <T> T unwrap(Class<T> iface) throws SQLException {
  505. return null;
  506. }
  507. @Override
  508. public boolean isWrapperFor(Class<?> iface) throws SQLException {
  509. return false;
  510. }
  511. }
  512. package org.god.ibatis.core;
  513. import javax.sql.DataSource;
  514. import java.io.PrintWriter;
  515. import java.sql.Connection;
  516. import java.sql.SQLException;
  517. import java.sql.SQLFeatureNotSupportedException;
  518. import java.util.logging.Logger;
  519. //数据源的实现类POOLED
  520. //使用GodBatis内置的数据库连接池获取对象
  521. public class PooledDataSource implements DataSource {
  522. @Override
  523. public Connection getConnection() throws SQLException {
  524. //从数据库连接池中获取connection对象
  525. //需要自己写一个连接池(自己封装)
  526. return null;
  527. }
  528. @Override
  529. public Connection getConnection(String username, String password) throws SQLException {
  530. return null;
  531. }
  532. @Override
  533. public PrintWriter getLogWriter() throws SQLException {
  534. return null;
  535. }
  536. @Override
  537. public void setLogWriter(PrintWriter out) throws SQLException {
  538. }
  539. @Override
  540. public void setLoginTimeout(int seconds) throws SQLException {
  541. }
  542. @Override
  543. public int getLoginTimeout() throws SQLException {
  544. return 0;
  545. }
  546. @Override
  547. public Logger getParentLogger() throws SQLFeatureNotSupportedException {
  548. return null;
  549. }
  550. @Override
  551. public <T> T unwrap(Class<T> iface) throws SQLException {
  552. return null;
  553. }
  554. @Override
  555. public boolean isWrapperFor(Class<?> iface) throws SQLException {
  556. return false;
  557. }
  558. }
  559. package org.god.ibatis.core;
  560. import java.lang.reflect.Constructor;
  561. import java.lang.reflect.Field;
  562. import java.lang.reflect.Method;
  563. import java.sql.*;
  564. import java.util.HashMap;
  565. import java.util.Iterator;
  566. import java.util.Map;
  567. public class SqlSession
  568. {
  569. protected SqlSession(SqlSessionFactory sqlSessionFactory)
  570. {
  571. this.sqlSessionFactory = sqlSessionFactory;
  572. }
  573. private SqlSessionFactory sqlSessionFactory;
  574. //insert
  575. public int insert(String sqlId,Object obj)
  576. {
  577. PreparedStatement statement = null;
  578. Connection connection = sqlSessionFactory.getTransaction().getConnection();
  579. int count = 0;
  580. try
  581. {
  582. //JDBC代码,执行insert语句,完成插入操作
  583. String oldSql = sqlSessionFactory.getMappedStatements().get(sqlId).getSql();
  584. String newSql = oldSql.replaceAll("#\\{[a-zA-Z0-9_$]*}","?");
  585. statement = connection.prepareStatement(newSql);
  586. //给?传值
  587. Map transfer = Transfer(oldSql);
  588. Iterator iterator = transfer.entrySet().iterator();
  589. while(iterator.hasNext())
  590. {
  591. Map.Entry entry = (Map.Entry)iterator.next();
  592. Integer index = (Integer)entry.getKey();
  593. String value = (String)entry.getValue();
  594. String methodName = "get" + value.toUpperCase().charAt(0) + value.substring(1);
  595. Method declaredMethod = obj.getClass().getDeclaredMethod(methodName);
  596. Object invoke = declaredMethod.invoke(obj);
  597. statement.setString(index,invoke.toString());
  598. }
  599. //执行SQL
  600. count = statement.executeUpdate();
  601. }
  602. catch (Exception e)
  603. {
  604. e.printStackTrace();
  605. }
  606. finally
  607. {
  608. if (statement != null)
  609. {
  610. try
  611. {
  612. statement.close();
  613. }
  614. catch (SQLException e)
  615. {
  616. throw new RuntimeException(e);
  617. }
  618. }
  619. }
  620. return count;
  621. }
  622. public Object SelectOne(String sqlId,Object obj)
  623. {
  624. Object o = null;
  625. if(sqlSessionFactory.getMappedStatements().get(sqlId) != null)
  626. {
  627. Connection connection = null;
  628. PreparedStatement statement = null;
  629. ResultSet resultSet = null;
  630. try
  631. {
  632. connection = sqlSessionFactory.getTransaction().getConnection();
  633. MappedStatement mappedStatement = sqlSessionFactory.getMappedStatements().get(sqlId);
  634. String oldSql = mappedStatement.getSql();
  635. String newSql = oldSql.replaceAll("#\\{[a-zA-Z0-9_$]*}","?");
  636. statement = connection.prepareStatement(newSql);
  637. //给占位符传值
  638. Map map = Transfer(oldSql);
  639. Iterator iterator = map.entrySet().iterator();
  640. while(iterator.hasNext())
  641. {
  642. Map.Entry entry = (Map.Entry) iterator.next();
  643. Integer integer = (Integer)entry.getKey();
  644. statement.setString(integer,obj.toString());
  645. }
  646. //查询返回结果集
  647. resultSet = statement.executeQuery();
  648. if(resultSet.next())
  649. {
  650. String resultType = mappedStatement.getResultType();
  651. Class<?> aClass = Class.forName(resultType);
  652. Constructor<?> declaredConstructor = aClass.getDeclaredConstructor();
  653. o = declaredConstructor.newInstance();
  654. //赋值
  655. ResultSetMetaData metaData = resultSet.getMetaData();
  656. int columnCount = metaData.getColumnCount();
  657. for (int i = 1; i < columnCount + 1; i++)
  658. {
  659. String columnName = metaData.getColumnName(i);
  660. String value = resultSet.getString(columnName);
  661. //直接赋值法
  662. // Field declaredField = aClass.getDeclaredField(columnName);
  663. // declaredField.setAccessible(true);
  664. // declaredField.set(o,value);
  665. String MethodName = "set" + columnName.toUpperCase().charAt(0) + columnName.substring(1);
  666. Method declaredMethod = aClass.getDeclaredMethod(MethodName,String.class);
  667. declaredMethod.invoke(o,value);
  668. }
  669. }
  670. }
  671. catch (Exception e)
  672. {
  673. throw new RuntimeException(e);
  674. }
  675. finally
  676. {
  677. if (statement != null)
  678. {
  679. try
  680. {
  681. statement.close();
  682. }
  683. catch (SQLException e)
  684. {
  685. throw new RuntimeException(e);
  686. }
  687. }
  688. if (resultSet != null)
  689. {
  690. try
  691. {
  692. resultSet.close();
  693. }
  694. catch(SQLException e)
  695. {
  696. throw new RuntimeException(e);
  697. }
  698. }
  699. }
  700. }
  701. return o;
  702. }
  703. public Map Transfer(String oldSql) throws Exception
  704. {
  705. Map<Integer,String> map = new HashMap<>();
  706. int fromIndex = 0;
  707. int index = 1;
  708. while(true)
  709. {
  710. int starIndex = oldSql.indexOf("#",fromIndex);
  711. if(starIndex < 0)
  712. {
  713. break;
  714. }
  715. int endIndex = oldSql.indexOf("}",fromIndex);
  716. String value = oldSql.substring(starIndex + 2,endIndex).trim();
  717. map.put(index,value);
  718. fromIndex = endIndex + 1;
  719. index++;
  720. }
  721. return map;
  722. }
  723. public void commit()
  724. {
  725. sqlSessionFactory.getTransaction().commit();
  726. }
  727. public void rollback()
  728. {
  729. sqlSessionFactory.getTransaction().rollback();
  730. }
  731. public void close()
  732. {
  733. sqlSessionFactory.getTransaction().close();
  734. }
  735. }
  736. package org.god.ibatis.core;
  737. import java.lang.reflect.Constructor;
  738. import java.lang.reflect.Field;
  739. import java.lang.reflect.Method;
  740. import java.sql.*;
  741. import java.util.HashMap;
  742. import java.util.Iterator;
  743. import java.util.Map;
  744. public class SqlSession
  745. {
  746. protected SqlSession(SqlSessionFactory sqlSessionFactory)
  747. {
  748. this.sqlSessionFactory = sqlSessionFactory;
  749. }
  750. private SqlSessionFactory sqlSessionFactory;
  751. //insert
  752. public int insert(String sqlId,Object obj)
  753. {
  754. PreparedStatement statement = null;
  755. Connection connection = sqlSessionFactory.getTransaction().getConnection();
  756. int count = 0;
  757. try
  758. {
  759. //JDBC代码,执行insert语句,完成插入操作
  760. String oldSql = sqlSessionFactory.getMappedStatements().get(sqlId).getSql();
  761. String newSql = oldSql.replaceAll("#\\{[a-zA-Z0-9_$]*}","?");
  762. statement = connection.prepareStatement(newSql);
  763. //给?传值
  764. Map transfer = Transfer(oldSql);
  765. Iterator iterator = transfer.entrySet().iterator();
  766. while(iterator.hasNext())
  767. {
  768. Map.Entry entry = (Map.Entry)iterator.next();
  769. Integer index = (Integer)entry.getKey();
  770. String value = (String)entry.getValue();
  771. String methodName = "get" + value.toUpperCase().charAt(0) + value.substring(1);
  772. Method declaredMethod = obj.getClass().getDeclaredMethod(methodName);
  773. Object invoke = declaredMethod.invoke(obj);
  774. statement.setString(index,invoke.toString());
  775. }
  776. //执行SQL
  777. count = statement.executeUpdate();
  778. }
  779. catch (Exception e)
  780. {
  781. e.printStackTrace();
  782. }
  783. finally
  784. {
  785. if (statement != null)
  786. {
  787. try
  788. {
  789. statement.close();
  790. }
  791. catch (SQLException e)
  792. {
  793. throw new RuntimeException(e);
  794. }
  795. }
  796. }
  797. return count;
  798. }
  799. public Object SelectOne(String sqlId,Object obj)
  800. {
  801. Object o = null;
  802. if(sqlSessionFactory.getMappedStatements().get(sqlId) != null)
  803. {
  804. Connection connection = null;
  805. PreparedStatement statement = null;
  806. ResultSet resultSet = null;
  807. try
  808. {
  809. connection = sqlSessionFactory.getTransaction().getConnection();
  810. MappedStatement mappedStatement = sqlSessionFactory.getMappedStatements().get(sqlId);
  811. String oldSql = mappedStatement.getSql();
  812. String newSql = oldSql.replaceAll("#\\{[a-zA-Z0-9_$]*}","?");
  813. statement = connection.prepareStatement(newSql);
  814. //给占位符传值
  815. Map map = Transfer(oldSql);
  816. Iterator iterator = map.entrySet().iterator();
  817. while(iterator.hasNext())
  818. {
  819. Map.Entry entry = (Map.Entry) iterator.next();
  820. Integer integer = (Integer)entry.getKey();
  821. statement.setString(integer,obj.toString());
  822. }
  823. //查询返回结果集
  824. resultSet = statement.executeQuery();
  825. if(resultSet.next())
  826. {
  827. String resultType = mappedStatement.getResultType();
  828. Class<?> aClass = Class.forName(resultType);
  829. Constructor<?> declaredConstructor = aClass.getDeclaredConstructor();
  830. o = declaredConstructor.newInstance();
  831. //赋值
  832. ResultSetMetaData metaData = resultSet.getMetaData();
  833. int columnCount = metaData.getColumnCount();
  834. for (int i = 1; i < columnCount + 1; i++)
  835. {
  836. String columnName = metaData.getColumnName(i);
  837. String value = resultSet.getString(columnName);
  838. //直接赋值法
  839. // Field declaredField = aClass.getDeclaredField(columnName);
  840. // declaredField.setAccessible(true);
  841. // declaredField.set(o,value);
  842. String MethodName = "set" + columnName.toUpperCase().charAt(0) + columnName.substring(1);
  843. Method declaredMethod = aClass.getDeclaredMethod(MethodName,String.class);
  844. declaredMethod.invoke(o,value);
  845. }
  846. }
  847. }
  848. catch (Exception e)
  849. {
  850. throw new RuntimeException(e);
  851. }
  852. finally
  853. {
  854. if (statement != null)
  855. {
  856. try
  857. {
  858. statement.close();
  859. }
  860. catch (SQLException e)
  861. {
  862. throw new RuntimeException(e);
  863. }
  864. }
  865. if (resultSet != null)
  866. {
  867. try
  868. {
  869. resultSet.close();
  870. }
  871. catch(SQLException e)
  872. {
  873. throw new RuntimeException(e);
  874. }
  875. }
  876. }
  877. }
  878. return o;
  879. }
  880. public Map Transfer(String oldSql) throws Exception
  881. {
  882. Map<Integer,String> map = new HashMap<>();
  883. int fromIndex = 0;
  884. int index = 1;
  885. while(true)
  886. {
  887. int starIndex = oldSql.indexOf("#",fromIndex);
  888. if(starIndex < 0)
  889. {
  890. break;
  891. }
  892. int endIndex = oldSql.indexOf("}",fromIndex);
  893. String value = oldSql.substring(starIndex + 2,endIndex).trim();
  894. map.put(index,value);
  895. fromIndex = endIndex + 1;
  896. index++;
  897. }
  898. return map;
  899. }
  900. public void commit()
  901. {
  902. sqlSessionFactory.getTransaction().commit();
  903. }
  904. public void rollback()
  905. {
  906. sqlSessionFactory.getTransaction().rollback();
  907. }
  908. public void close()
  909. {
  910. sqlSessionFactory.getTransaction().close();
  911. }
  912. }
  913. package org.god.ibatis.core;
  914. import java.util.Map;
  915. public class SqlSessionFactory
  916. {
  917. //一个数据库对应一个SqlSessionFactory对象
  918. //通过这个对象可以开启会话,建立与数据库的连接
  919. //一个SqlSessionFactory对象可以开启多个SqlSession会话
  920. //所以这个事务管理器应该是一个接口,面向接口编程
  921. protected SqlSessionFactory(){}
  922. public SqlSession openSession()
  923. {
  924. //开启会话的前提就是开启连接
  925. transaction.openConnection();
  926. //创建SqlSession对象
  927. SqlSession sqlSession = new SqlSession(this);
  928. return sqlSession;
  929. }
  930. protected SqlSessionFactory(Transaction transaction, Map<String, MappedStatement> mappedStatements) {
  931. this.transaction = transaction;
  932. this.mappedStatements = mappedStatements;
  933. }
  934. public Transaction getTransaction() {
  935. return transaction;
  936. }
  937. public void setTransaction(Transaction transaction) {
  938. this.transaction = transaction;
  939. }
  940. public Map<String, MappedStatement> getMappedStatements() {
  941. return mappedStatements;
  942. }
  943. public void setMappedStatements(Map<String, MappedStatement> mappedStatements) {
  944. this.mappedStatements = mappedStatements;
  945. }
  946. //事务管理器属性
  947. private Transaction transaction;
  948. //存放sql对象的map集合,key是SqlId,Value是对应的SQL标签对象
  949. private Map<String,MappedStatement> mappedStatements;
  950. }
  951. package org.god.ibatis.core;
  952. import java.util.Map;
  953. public class SqlSessionFactory
  954. {
  955. //一个数据库对应一个SqlSessionFactory对象
  956. //通过这个对象可以开启会话,建立与数据库的连接
  957. //一个SqlSessionFactory对象可以开启多个SqlSession会话
  958. //所以这个事务管理器应该是一个接口,面向接口编程
  959. protected SqlSessionFactory(){}
  960. public SqlSession openSession()
  961. {
  962. //开启会话的前提就是开启连接
  963. transaction.openConnection();
  964. //创建SqlSession对象
  965. SqlSession sqlSession = new SqlSession(this);
  966. return sqlSession;
  967. }
  968. protected SqlSessionFactory(Transaction transaction, Map<String, MappedStatement> mappedStatements) {
  969. this.transaction = transaction;
  970. this.mappedStatements = mappedStatements;
  971. }
  972. public Transaction getTransaction() {
  973. return transaction;
  974. }
  975. public void setTransaction(Transaction transaction) {
  976. this.transaction = transaction;
  977. }
  978. public Map<String, MappedStatement> getMappedStatements() {
  979. return mappedStatements;
  980. }
  981. public void setMappedStatements(Map<String, MappedStatement> mappedStatements) {
  982. this.mappedStatements = mappedStatements;
  983. }
  984. //事务管理器属性
  985. private Transaction transaction;
  986. //存放sql对象的map集合,key是SqlId,Value是对应的SQL标签对象
  987. private Map<String,MappedStatement> mappedStatements;
  988. }
  989. package org.god.ibatis.core;
  990. import org.dom4j.Document;
  991. import org.dom4j.DocumentException;
  992. import org.dom4j.Element;
  993. import org.dom4j.Node;
  994. import org.dom4j.io.SAXReader;
  995. import org.god.ibatis.utils.Resources;
  996. import javax.sql.DataSource;
  997. import java.io.InputStream;
  998. import java.util.ArrayList;
  999. import java.util.HashMap;
  1000. import java.util.List;
  1001. import java.util.Map;
  1002. public class SqlSessionFactoryBuilder
  1003. {
  1004. //通过godBatis-config文件,创建SqlSessionFactory对象
  1005. public SqlSessionFactoryBuilder(){}
  1006. public SqlSessionFactory build(InputStream is)
  1007. {
  1008. //解析godBatis-config文件创建SqlSessionFactory对象
  1009. //build操作的核心就是要解析XML文件
  1010. //解析完成要构建SqlSessionFactory对象
  1011. //解析GodBatis-config文件
  1012. SAXReader reader = new SAXReader();
  1013. Document document = null;
  1014. SqlSessionFactory sqlSessionFactory = null;
  1015. try
  1016. {
  1017. document = reader.read(is);
  1018. Element rootElement = (Element)document.selectSingleNode("/configuration/environments");
  1019. String defaultId = rootElement.attributeValue("default");
  1020. Element environment = (Element) document.selectSingleNode("/configuration/environments/environment[@id='" + defaultId +"']");
  1021. Element transactionManagerEle = environment.element("transactionManager");
  1022. Element dataSourceEle = environment.element("dataSource");
  1023. DataSource dataSource = getDataSource(dataSourceEle);
  1024. //获取事务管理器
  1025. Transaction transaction = getTransaction(transactionManagerEle,dataSource);
  1026. //获取MappedStatements
  1027. List<Node> mappers = document.selectNodes("//mapper");
  1028. List<String> mapperList = new ArrayList<>();
  1029. mappers.forEach(node ->
  1030. {
  1031. Element mapper = (Element)node;
  1032. String resource = mapper.attributeValue("resource");
  1033. mapperList.add(resource);
  1034. });
  1035. //获取整个文件中所有的mapper标签
  1036. Map<String,MappedStatement> mappedStatements = getMappedStatements(mapperList);
  1037. sqlSessionFactory = new SqlSessionFactory(transaction,mappedStatements);
  1038. }
  1039. catch (Exception e)
  1040. {
  1041. e.printStackTrace();
  1042. }
  1043. return sqlSessionFactory;
  1044. }
  1045. private Map<String, MappedStatement> getMappedStatements(List<String> mapperList)
  1046. {
  1047. Map<String,MappedStatement> map = new HashMap<>();
  1048. mapperList.forEach(resource ->
  1049. {
  1050. SAXReader reader = new SAXReader();
  1051. InputStream ip = Resources.getResourceAsStream(resource);
  1052. Document document = null;
  1053. try
  1054. {
  1055. document = reader.read(ip);
  1056. }
  1057. catch (DocumentException e)
  1058. {
  1059. throw new RuntimeException(e);
  1060. }
  1061. Element mapper = document.getRootElement();
  1062. String namespace = mapper.attributeValue("namespace");
  1063. List<Element> elements = mapper.elements();
  1064. elements.forEach(element ->
  1065. {
  1066. MappedStatement mappedStatement = new MappedStatement();
  1067. String resultType = element.attributeValue("resultType");
  1068. String id = element.attributeValue("id");
  1069. if(resultType != null)
  1070. {
  1071. mappedStatement.setResultType(resultType);
  1072. }
  1073. else
  1074. {
  1075. mappedStatement.setResultType("null");
  1076. }
  1077. String sql = element.getTextTrim();
  1078. mappedStatement.setSql(sql);
  1079. String sqlId = namespace + "." + id;
  1080. map.put(sqlId,mappedStatement);
  1081. });
  1082. });
  1083. return map;
  1084. }
  1085. private Transaction getTransaction(Element transactionManagerEle,DataSource dataSource)
  1086. {
  1087. //获取事务管理器对象
  1088. String type = transactionManagerEle.attributeValue("type").trim().toUpperCase();
  1089. Transaction transaction = null;
  1090. if(Const.JDBC_TRANSACTION.equals(type))
  1091. {
  1092. //默认是开启事务的,将来需要手动提交的
  1093. transaction = new JdbcTransaction(dataSource,false);
  1094. }
  1095. if(Const.MANAGED_TRANSACTION.equals(type))
  1096. {
  1097. transaction = new ManagedTransaction();
  1098. }
  1099. return transaction;
  1100. }
  1101. private DataSource getDataSource(Element dataSourceEle)
  1102. {
  1103. //获取数据源对象
  1104. String type = dataSourceEle.attributeValue("type").trim().toUpperCase();
  1105. DataSource dataSource = null;
  1106. List<Element> elements = dataSourceEle.elements();
  1107. Map<String,String> map = new HashMap<>();
  1108. elements.forEach(element ->
  1109. {
  1110. String name = element.attributeValue("name");
  1111. String value = element.attributeValue("value");
  1112. map.put(name,value);
  1113. });
  1114. String driver = map.get("driver");
  1115. String url = map.get("url");
  1116. String username = map.get("username");
  1117. String password = map.get("password");
  1118. if(Const.UN_POOLED_DATASOURCE.equals(type))
  1119. {
  1120. dataSource = new UnPooledDataSource(driver,url,username,password);
  1121. }
  1122. else if(Const.POOLED_DATASOURCE.equals(type))
  1123. {
  1124. dataSource = new PooledDataSource();
  1125. }
  1126. else if(Const.JNDI_DATASOURCE.equals(type))
  1127. {
  1128. dataSource = new JndiDataSource();
  1129. }
  1130. return dataSource;
  1131. }
  1132. }
  1133. package org.god.ibatis.core;
  1134. import org.dom4j.Document;
  1135. import org.dom4j.DocumentException;
  1136. import org.dom4j.Element;
  1137. import org.dom4j.Node;
  1138. import org.dom4j.io.SAXReader;
  1139. import org.god.ibatis.utils.Resources;
  1140. import javax.sql.DataSource;
  1141. import java.io.InputStream;
  1142. import java.util.ArrayList;
  1143. import java.util.HashMap;
  1144. import java.util.List;
  1145. import java.util.Map;
  1146. public class SqlSessionFactoryBuilder
  1147. {
  1148. //通过godBatis-config文件,创建SqlSessionFactory对象
  1149. public SqlSessionFactoryBuilder(){}
  1150. public SqlSessionFactory build(InputStream is)
  1151. {
  1152. //解析godBatis-config文件创建SqlSessionFactory对象
  1153. //build操作的核心就是要解析XML文件
  1154. //解析完成要构建SqlSessionFactory对象
  1155. //解析GodBatis-config文件
  1156. SAXReader reader = new SAXReader();
  1157. Document document = null;
  1158. SqlSessionFactory sqlSessionFactory = null;
  1159. try
  1160. {
  1161. document = reader.read(is);
  1162. Element rootElement = (Element)document.selectSingleNode("/configuration/environments");
  1163. String defaultId = rootElement.attributeValue("default");
  1164. Element environment = (Element) document.selectSingleNode("/configuration/environments/environment[@id='" + defaultId +"']");
  1165. Element transactionManagerEle = environment.element("transactionManager");
  1166. Element dataSourceEle = environment.element("dataSource");
  1167. DataSource dataSource = getDataSource(dataSourceEle);
  1168. //获取事务管理器
  1169. Transaction transaction = getTransaction(transactionManagerEle,dataSource);
  1170. //获取MappedStatements
  1171. List<Node> mappers = document.selectNodes("//mapper");
  1172. List<String> mapperList = new ArrayList<>();
  1173. mappers.forEach(node ->
  1174. {
  1175. Element mapper = (Element)node;
  1176. String resource = mapper.attributeValue("resource");
  1177. mapperList.add(resource);
  1178. });
  1179. //获取整个文件中所有的mapper标签
  1180. Map<String,MappedStatement> mappedStatements = getMappedStatements(mapperList);
  1181. sqlSessionFactory = new SqlSessionFactory(transaction,mappedStatements);
  1182. }
  1183. catch (Exception e)
  1184. {
  1185. e.printStackTrace();
  1186. }
  1187. return sqlSessionFactory;
  1188. }
  1189. private Map<String, MappedStatement> getMappedStatements(List<String> mapperList)
  1190. {
  1191. Map<String,MappedStatement> map = new HashMap<>();
  1192. mapperList.forEach(resource ->
  1193. {
  1194. SAXReader reader = new SAXReader();
  1195. InputStream ip = Resources.getResourceAsStream(resource);
  1196. Document document = null;
  1197. try
  1198. {
  1199. document = reader.read(ip);
  1200. }
  1201. catch (DocumentException e)
  1202. {
  1203. throw new RuntimeException(e);
  1204. }
  1205. Element mapper = document.getRootElement();
  1206. String namespace = mapper.attributeValue("namespace");
  1207. List<Element> elements = mapper.elements();
  1208. elements.forEach(element ->
  1209. {
  1210. MappedStatement mappedStatement = new MappedStatement();
  1211. String resultType = element.attributeValue("resultType");
  1212. String id = element.attributeValue("id");
  1213. if(resultType != null)
  1214. {
  1215. mappedStatement.setResultType(resultType);
  1216. }
  1217. else
  1218. {
  1219. mappedStatement.setResultType("null");
  1220. }
  1221. String sql = element.getTextTrim();
  1222. mappedStatement.setSql(sql);
  1223. String sqlId = namespace + "." + id;
  1224. map.put(sqlId,mappedStatement);
  1225. });
  1226. });
  1227. return map;
  1228. }
  1229. private Transaction getTransaction(Element transactionManagerEle,DataSource dataSource)
  1230. {
  1231. //获取事务管理器对象
  1232. String type = transactionManagerEle.attributeValue("type").trim().toUpperCase();
  1233. Transaction transaction = null;
  1234. if(Const.JDBC_TRANSACTION.equals(type))
  1235. {
  1236. //默认是开启事务的,将来需要手动提交的
  1237. transaction = new JdbcTransaction(dataSource,false);
  1238. }
  1239. if(Const.MANAGED_TRANSACTION.equals(type))
  1240. {
  1241. transaction = new ManagedTransaction();
  1242. }
  1243. return transaction;
  1244. }
  1245. private DataSource getDataSource(Element dataSourceEle)
  1246. {
  1247. //获取数据源对象
  1248. String type = dataSourceEle.attributeValue("type").trim().toUpperCase();
  1249. DataSource dataSource = null;
  1250. List<Element> elements = dataSourceEle.elements();
  1251. Map<String,String> map = new HashMap<>();
  1252. elements.forEach(element ->
  1253. {
  1254. String name = element.attributeValue("name");
  1255. String value = element.attributeValue("value");
  1256. map.put(name,value);
  1257. });
  1258. String driver = map.get("driver");
  1259. String url = map.get("url");
  1260. String username = map.get("username");
  1261. String password = map.get("password");
  1262. if(Const.UN_POOLED_DATASOURCE.equals(type))
  1263. {
  1264. dataSource = new UnPooledDataSource(driver,url,username,password);
  1265. }
  1266. else if(Const.POOLED_DATASOURCE.equals(type))
  1267. {
  1268. dataSource = new PooledDataSource();
  1269. }
  1270. else if(Const.JNDI_DATASOURCE.equals(type))
  1271. {
  1272. dataSource = new JndiDataSource();
  1273. }
  1274. return dataSource;
  1275. }
  1276. package org.god.ibatis.core;
  1277. import java.sql.Connection;
  1278. public interface Transaction
  1279. {
  1280. //事务管理器接口
  1281. //所有的事务管理都应该遵循此规范
  1282. //JDBC和MANAGED事务管理器都应该实现这个接口
  1283. //Transaction事务管理器通过事务方法
  1284. //提交事务,回滚事务,关闭事务
  1285. void openConnection();
  1286. //真正的开启数据库连接
  1287. void commit();
  1288. //获取数据库连接对象的方法
  1289. Connection getConnection();
  1290. void rollback();
  1291. void close();
  1292. }
  1293. package org.god.ibatis.core;
  1294. import java.sql.Connection;
  1295. public interface Transaction
  1296. {
  1297. //事务管理器接口
  1298. //所有的事务管理都应该遵循此规范
  1299. //JDBC和MANAGED事务管理器都应该实现这个接口
  1300. //Transaction事务管理器通过事务方法
  1301. //提交事务,回滚事务,关闭事务
  1302. void openConnection();
  1303. //真正的开启数据库连接
  1304. void commit();
  1305. //获取数据库连接对象的方法
  1306. Connection getConnection();
  1307. void rollback();
  1308. void close();
  1309. }
  1310. package org.god.ibatis.core;
  1311. import javax.sql.DataSource;
  1312. import java.io.PrintWriter;
  1313. import java.sql.Connection;
  1314. import java.sql.DriverManager;
  1315. import java.sql.SQLException;
  1316. import java.sql.SQLFeatureNotSupportedException;
  1317. import java.util.logging.Logger;
  1318. //数据源的实现类UNPOOLED
  1319. //不使用连接池,每一次都新建Connection对象
  1320. public class UnPooledDataSource implements DataSource {
  1321. //数据库驱动,值从配置文件中来
  1322. private String url;
  1323. private String username;
  1324. private String password;
  1325. public UnPooledDataSource() {}
  1326. public UnPooledDataSource(String driver, String url, String username, String password) {
  1327. //直接注册驱动
  1328. try
  1329. {
  1330. Class.forName(driver);
  1331. }
  1332. catch (ClassNotFoundException e)
  1333. {
  1334. throw new RuntimeException(e);
  1335. }
  1336. //创建一个数据源对象
  1337. this.url = url;
  1338. this.username = username;
  1339. this.password = password;
  1340. }
  1341. @Override
  1342. public Connection getConnection() throws SQLException
  1343. {
  1344. Connection connection = DriverManager.getConnection(url, username, password);
  1345. return connection;
  1346. }
  1347. @Override
  1348. public Connection getConnection(String username, String password) throws SQLException
  1349. {
  1350. Connection connection = DriverManager.getConnection(url, username, password);
  1351. return null;
  1352. }
  1353. @Override
  1354. public PrintWriter getLogWriter() throws SQLException {
  1355. return null;
  1356. }
  1357. @Override
  1358. public void setLogWriter(PrintWriter out) throws SQLException {
  1359. }
  1360. @Override
  1361. public void setLoginTimeout(int seconds) throws SQLException {
  1362. }
  1363. @Override
  1364. public int getLoginTimeout() throws SQLException {
  1365. return 0;
  1366. }
  1367. @Override
  1368. public Logger getParentLogger() throws SQLFeatureNotSupportedException {
  1369. return null;
  1370. }
  1371. @Override
  1372. public <T> T unwrap(Class<T> iface) throws SQLException {
  1373. return null;
  1374. }
  1375. @Override
  1376. public boolean isWrapperFor(Class<?> iface) throws SQLException {
  1377. return false;
  1378. }
  1379. }
  1380. package org.god.ibatis.core;
  1381. import javax.sql.DataSource;
  1382. import java.io.PrintWriter;
  1383. import java.sql.Connection;
  1384. import java.sql.DriverManager;
  1385. import java.sql.SQLException;
  1386. import java.sql.SQLFeatureNotSupportedException;
  1387. import java.util.logging.Logger;
  1388. //数据源的实现类UNPOOLED
  1389. //不使用连接池,每一次都新建Connection对象
  1390. public class UnPooledDataSource implements DataSource {
  1391. //数据库驱动,值从配置文件中来
  1392. private String url;
  1393. private String username;
  1394. private String password;
  1395. public UnPooledDataSource() {}
  1396. public UnPooledDataSource(String driver, String url, String username, String password) {
  1397. //直接注册驱动
  1398. try
  1399. {
  1400. Class.forName(driver);
  1401. }
  1402. catch (ClassNotFoundException e)
  1403. {
  1404. throw new RuntimeException(e);
  1405. }
  1406. //创建一个数据源对象
  1407. this.url = url;
  1408. this.username = username;
  1409. this.password = password;
  1410. }
  1411. @Override
  1412. public Connection getConnection() throws SQLException
  1413. {
  1414. Connection connection = DriverManager.getConnection(url, username, password);
  1415. return connection;
  1416. }
  1417. @Override
  1418. public Connection getConnection(String username, String password) throws SQLException
  1419. {
  1420. Connection connection = DriverManager.getConnection(url, username, password);
  1421. return null;
  1422. }
  1423. @Override
  1424. public PrintWriter getLogWriter() throws SQLException {
  1425. return null;
  1426. }
  1427. @Override
  1428. public void setLogWriter(PrintWriter out) throws SQLException {
  1429. }
  1430. @Override
  1431. public void setLoginTimeout(int seconds) throws SQLException {
  1432. }
  1433. @Override
  1434. public int getLoginTimeout() throws SQLException {
  1435. return 0;
  1436. }
  1437. @Override
  1438. public Logger getParentLogger() throws SQLFeatureNotSupportedException {
  1439. return null;
  1440. }
  1441. @Override
  1442. public <T> T unwrap(Class<T> iface) throws SQLException {
  1443. return null;
  1444. }
  1445. @Override
  1446. public boolean isWrapperFor(Class<?> iface) throws SQLException {
  1447. return false;
  1448. }
  1449. }
  1450. package org.god.ibatis.utils;
  1451. import java.io.InputStream;
  1452. public class Resources
  1453. {
  1454. //godBatis提供的资源工具类,完成类路径中资源的加载
  1455. private Resources(){}
  1456. //工具类的构造方法都是私有化的,因为方法都是静态的
  1457. //为了避免new对象,所以构造方法私有化
  1458. public static InputStream getResourceAsStream(String resource)
  1459. {
  1460. //从类路径下加载资源
  1461. //从类路径中获取资源作为一个输入流
  1462. return ClassLoader.getSystemClassLoader().getResourceAsStream(resource);
  1463. }
  1464. }
  1465. package org.god.ibatis.utils;
  1466. import java.io.InputStream;
  1467. public class Resources
  1468. {
  1469. //godBatis提供的资源工具类,完成类路径中资源的加载
  1470. private Resources(){}
  1471. //工具类的构造方法都是私有化的,因为方法都是静态的
  1472. //为了避免new对象,所以构造方法私有化
  1473. public static InputStream getResourceAsStream(String resource)
  1474. {
  1475. //从类路径下加载资源
  1476. //从类路径中获取资源作为一个输入流
  1477. return ClassLoader.getSystemClassLoader().getResourceAsStream(resource);
  1478. }
  1479. }

发表评论

表情:
评论列表 (有 0 条评论,155人围观)

还没有评论,来说两句吧...

相关阅读