当前位置: 首页 > news >正文

益阳网站建设益阳微信下载安装2023新版本

益阳网站建设益阳,微信下载安装2023新版本,自动点击器app,wordpress短网址目录 定义 需求背景 方案设计 代码展示 UML图 实现细节 测试验证 总结 源码地址#xff08;已开源#xff09;#xff1a;https://gitee.com/sizhaohe/mini-mybatis.git 跟着源码及下述UML图来理解上手会更快#xff0c;拒绝浮躁#xff0c;沉下心来搞 定义#x…目录 定义 需求背景 方案设计 代码展示 UML图 实现细节 测试验证 总结 源码地址已开源https://gitee.com/sizhaohe/mini-mybatis.git  跟着源码及下述UML图来理解上手会更快拒绝浮躁沉下心来搞 定义 ORMObject Relational Mapping  --  对象关系映射是一种程序设计技术用于实现面向对象编程语言里面不同类型系统的数据之间的转换 需求背景 记不记得刚开始学JAVA时编写一大串JDBC相关代码来进行与数据库的交互日后我们接触到的MyBatis、MyBatisPlus等都是使用ORM组件来实现的框架。           本篇文章提炼出mybatis【最】经典、【最】精简、【最】核心的代码设计来实现一个【mini-mybatis】,从而熟悉并掌握ORM框架的涉及实现。 方案设计 中间的四部分处理是ORM框架的核心内容这个框架会提供出SqlSession工厂以及调用方式 代码展示 UML图 很重要建议code前跟我一样先将类UML图整理出来整个类的依赖关系及代码执行流程会一目而然。 篇幅有限展开观看 以上为ORM框架实现核心类加载mysql配置文件、对mapper-xml解析、获取数据库session、操作数据库及封装响应结果。 实现细节 1.定义sqlsession接口 对数据库的定义和处理本篇我们只封装一个 T selectOne(Object param); public interface SqlSession {T T selectOne(String statement, Object parameter);void close(); } 2.DefaultSqlSession(SqlSession的实现) 使用rt.jar包下java.lang.sql包下 Connection接口负责与数据库进行连接及PreparedStatement执行具体sql接口来实现 public class DefaultSqlSession implements SqlSession{private Connection connection;private MapString,XNode mapperElement;public DefaultSqlSession(Connection connection, MapString, XNode mapperElement) {this.connection connection;this.mapperElement mapperElement;}Overridepublic T T selectOne(String statement, Object parameter) {XNode xNode mapperElement.get(statement);MapInteger, String parameterMap xNode.getParameter();try {PreparedStatement preparedStatement connection.prepareStatement(xNode.getSql());buildParameter(preparedStatement, parameter, parameterMap);// SQL执行结果集的行数据ResultSet resultSet preparedStatement.executeQuery();ListT objects resultSet2Obj(resultSet, Class.forName(xNode.getResultType()));return objects.get(0);} catch (Exception e) {e.printStackTrace();}return null;}private T ListT resultSet2Obj(ResultSet resultSet, Class? clazz) {ListT list new ArrayList();try {ResultSetMetaData metaData resultSet.getMetaData();int columnCount metaData.getColumnCount();// 每次遍历行值while (resultSet.next()) {T obj (T) clazz.newInstance();for (int i 1; i columnCount; i) {Object value resultSet.getObject(i);String columnName metaData.getColumnName(i);String setMethod set columnName.substring(0, 1).toUpperCase() columnName.substring(1);Method method;if (value instanceof Timestamp) {method clazz.getMethod(setMethod, Date.class);} else {method clazz.getMethod(setMethod, value.getClass());}method.invoke(obj, value);}list.add(obj);}} catch (Exception e) {e.printStackTrace();}return list;}Overridepublic void close() {if (null connection) return;try {connection.close();} catch (SQLException e) {e.printStackTrace();}}private void buildParameter(PreparedStatement preparedStatement, Object parameter, MapInteger, String parameterMap) throws SQLException, IllegalAccessException {int size parameterMap.size();// 单个参数if (parameter instanceof Long) {for (int i 1; i size; i) {preparedStatement.setLong(i, Long.parseLong(parameter.toString()));}return;}else{// TODO 后面紧跟的章节继续补充其他类型的入参}} } 3.定义SqlSessionFactory接口 每次执行一个SQL语句应用程序都需要获取一个SqlSession对象。SqlSession对象是执行持久化操作的入口点可以用于执行SQL语句、刷新缓存、提交事务等操作。建议在使用完SqlSession后及时关闭它来释放资源。 public interface SqlSessionFactory {SqlSession openSession(); } 4.DefaultSqlSessionFactory(上述接口实现类) 构造方法中向下传递了Configuration配置文件 public class DefaultSqlSessionFactory implements SqlSessionFactory {private final Configuration configuration;public DefaultSqlSessionFactory(Configuration configuration) {this.configuration configuration;}Overridepublic SqlSession openSession() {return new DefaultSqlSession(configuration.getConnection(), configuration.getMapperElement());} } 5.SqlSessionFactoryBuilder 数据库操作的核心类负责解析Mapper文件拿datasource数据库连接信息mapper文件中sql的各个信息如id入返参类型sql public class SqlSessionFactoryBuilder {public DefaultSqlSessionFactory build(Reader reader) {SAXReader saxReader new SAXReader();Document document null;try {document saxReader.read(new InputSource(reader));// 拿到根标签元素Element rootElement document.getRootElement();Configuration configuration parseConfiguration(rootElement);return new DefaultSqlSessionFactory(configuration);} catch (DocumentException e) {e.printStackTrace();}return null;}public Configuration parseConfiguration(Element rootElement) {Configuration configuration new Configuration();configuration.setDataSource(dataSource(rootElement.selectNodes(//dataSource)));configuration.setConnection(connection(configuration.getDataSource()));configuration.setMapperElement(mapperElement(rootElement.selectNodes(//mappers)));return configuration;}private MapString, String dataSource(ListElement list) {MapString, String dataSource new HashMap(4);Element element list.get(0);List content element.content();for (Object o : content) {Element e (Element) o;String name e.attributeValue(name);String value e.attributeValue(value);dataSource.put(name, value);}return dataSource;}private Connection connection(MapString, String dataSource) {try {return DriverManager.getConnection(dataSource.get(url), dataSource.get(username), dataSource.get(password));} catch (SQLException e) {e.printStackTrace();}return null;}private MapString, XNode mapperElement(ListElement list) {MapString, XNode map new HashMap();Element element list.get(0);List content element.content();try {for (Object o : content) {Element e (Element) o;// 拿到mapper文件对应地址String resource e.attributeValue(resource);Reader reader Resources.getResourceAsReader(resource);SAXReader saxReader new SAXReader();Document document saxReader.read(new InputSource(reader));Element rootElement document.getRootElement();String namespace rootElement.attributeValue(namespace);ListElement selectNodes rootElement.selectNodes(select);for (Element ele : selectNodes) {String id ele.attributeValue(id);String parameterType ele.attributeValue(parameterType);String resultType ele.attributeValue(resultType);String sql ele.getText();// ? 匹配MapInteger, String parameter new HashMap();Pattern pattern Pattern.compile((#\\{(.*?)}));Matcher matcher pattern.matcher(sql);for (int i 1; matcher.find(); i) {String g1 matcher.group(1);String g2 matcher.group(2);parameter.put(i, g2);sql sql.replace(g1, ?);}XNode xNode new XNode();xNode.setId(id);xNode.setNameSpace(namespace);xNode.setParameterType(parameterType);xNode.setResultType(resultType);xNode.setSql(sql);xNode.setParameter(parameter);map.put(namespace . id, xNode);}}}catch (Exception e){e.printStackTrace();}return map;} } 测试验证 建表 DROP TABLE IF EXISTS user; CREATE TABLE user (id bigint(20) NOT NULL COMMENT 自增id,userId varchar(9) DEFAULT NULL COMMENT 用户ID,userNickName varchar(32) DEFAULT NULL COMMENT 用户昵称,userHead varchar(255) DEFAULT NULL COMMENT 用户头像,userPassword varchar(255) DEFAULT NULL COMMENT 用户密码,createTime datetime DEFAULT NULL COMMENT 创建时间,updateTime datetime NOT NULL COMMENT 更新时间,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;-- ---------------------------- -- Records of user -- ---------------------------- BEGIN; INSERT INTO user VALUES (1, 001, xxx, 001, 123, 2023-07-14 17:33:55, 2023-07-14 17:33:58); INSERT INTO user VALUES (2, 002, xxx2, 002, 123, 2023-07-14 17:33:55, 2023-07-14 17:33:58); COMMIT;SET FOREIGN_KEY_CHECKS 1;定义POJO及DAO Data public class User {private Long id;private String userId; // 用户IDprivate String userNickName; // 昵称private String userHead; // 头像private String userPassword; // 密码private Date createTime; // 创建时间private Date updateTime; // 更新时间 } public interface IUserDao {User queryUserInfoById(Long id); } ORM配置文件--mybatis-config-datasource.xml ?xml version1.0 encodingUTF-8? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtdconfigurationenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver valuecom.mysql.jdbc.Driver/property nameurl valuejdbc:mysql://172.17.1.245:3306/airticketbasedb?useUnicodetrue/property nameusername valuewrite/property namepassword valuewrite123//dataSource/environment/environmentsmappersmapper resourcemapper/User_Mapper.xml//mappers/configuration Mapper配置 UserMapper.xml ?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.example.minimybatis.dao.IUserDaoselect idqueryUserInfoById parameterTypejava.lang.Long resultTypecom.example.minimybatis.po.UserSELECT id, userId, userNickName, userHead, userPassword, createTimeFROM userwhere id #{id}/select/mapper 测试类 public class ApiTest {Testpublic void test(){String resouce mybatis-config-datasource.xml;Reader reader;try{reader Resources.getResourceAsReader(resouce);SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(reader);SqlSession sqlSession sqlSessionFactory.openSession();User user sqlSession.selectOne(com.example.minimybatis.dao.IUserDao.queryUserInfoById,1L);System.out.println(JSONObject.toJSONString(user));}catch (Exception e){e.printStackTrace();}} }总结 比mybatis小很多取其(mybaits)精华来达到掌握ORM框架的目的
http://www.dnsts.com.cn/news/208807.html

相关文章:

  • 汽车电子商务网站建设网页版哔哩哔哩
  • 建设网站主机可以用吗广州网络
  • 网站模板安装出现预先建设数据库三合一网站方案
  • 免费做公司手机网站有域名和虚拟服务器后怎么做网站
  • 网站建立的具体步骤微信小程序游戏手游排行榜
  • 注册网站帐号注销网页视频怎么下载保存
  • 百度联盟怎么做网站建设中网站源码
  • 苏格网站建设国外学校网站模板
  • 做相亲网站需要什么流程苏州网站制作好的公司
  • 免费发帖网站大全手机app是怎么开发出来的
  • 做装修网站价格站长工具使用
  • 做3d效果图有什么好网站平面设计师证书
  • 阳东网站seo张家口城乡建设局网站
  • 网站 数据库 模板说出网站建设流程
  • 雅虎网站提交入口yy怎么一直在模板相关信息圆柱钢模板优势是什么?企业网站建设模板和定制化有什么区别呢?拼命加载中
  • 网站建设 电脑 手机大屏网页设计网站
  • 重庆网站seo建设哪家好企业网站管理系统设计与实现
  • 手机网站js电话悬浮邯郸做小程序公司
  • 网站备案信息核验单填写网站中怎么做视频直播
  • 无锡本地模板网站建设产品江苏联运建设有限公司网站
  • 哪些网站是503错误代码手机网站弹出提示框
  • asp网站例子wordpress视觉编辑器
  • 网站制作的核心要点是什么3322免费域名注册
  • 上海市建设协会网站做网站老板不发工资我拿尾款
  • 淘宝上买的网站模板怎么建设网站建筑公司企业信用分在哪里查
  • 大庆小程序制作网站排名优化电话
  • 厦门百度搜索网站排名网站二级导航制作
  • 网站开发与运维面试问题wordpress搭建影视站
  • 意见反馈的网站怎么做一 网站建设总体目标
  • 受欢迎的锦州网站建设开发一套软件app