最近马上要开动项目了,后台是用mybatis,开始研究mybatis,发现
public interface SqlInterface { @MySelect("select * from t_user where id = 1") public UserPO select(); }
这种实现,感觉蛮有意思的。于是自己模拟写了一个,这里要求读者要有java注解,java反射,代理,java对数据库的操作等要求。如果看不懂代码的话,可以先了解下上面提到的java基础。
首先在mysql的test建个表t_user,字段id,username,password,插入一条数据1,123,123。
一个PO对象UserPO
public class UserPO { public long id; public String userName; public String password;
一个select的注解接口
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface MySelect { public String value(); }
一个sql的接口
public interface SqlInterface { @MySelect("select * from t_user where id = 1") public UserPO select(); }
由于比较懒,就直接把代理和test类写在一起
public class TestMain { public static void main(String[] args) { try { //代理 SqlInterface sqlInterface = (SqlInterface) Proxy.newProxyInstance(SqlInterface.class.getClassLoader(), new Class[] { SqlInterface.class }, new InvocationHandler() { public Object invoke(Object arg0, Method method, Object[] arg2) throws Throwable { // TODO Auto-generated method stub //获取注解的sql语句 String sqlString = null; if (method.getAnnotation(MySelect.class) != null) { sqlString = method.getAnnotation(MySelect.class).value(); System.out.println(sqlString); } String databaseDriver = "com.mysql.jdbc.Driver"; Connection conn = null; ResultSet rs = null; try { Class.forName(databaseDriver); conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8", "root", "root"); PreparedStatement stmt = conn.prepareStatement(sqlString); rs = stmt.executeQuery(); } catch (Exception e) { e.printStackTrace(); } // 获取数据库字段名称 ResultSetMetaData rsmd = rs.getMetaData(); String[] dataMetas = new String[rsmd.getColumnCount()]; int colcount = rsmd.getColumnCount(); for (int i = 1; i <= colcount; i++) { //dataMetas没有index为0的,从1开始 System.out.println(rsmd.getColumnClassName(i)); dataMetas[i-1] = rsmd.getColumnName(i); } // 获取返回值类型,就是userPO Object o = method.getReturnType().newInstance(); while (rs.next()) { Field[] fields = o.getClass().getDeclaredFields(); for (Field field : fields) { String fieldname = field.getName(); for (String dateMeta : dataMetas) { if (fieldname.toLowerCase().equals(dateMeta)) { field.set(o, rs.getObject(dateMeta)); break; } } } } try { rs.close(); conn.close(); } catch (Exception e) { } return o; } }); UserPO po = sqlInterface.select(); System.out.println(po.getUserName()); } catch (Exception e) { e.printStackTrace(); } } }
这里还是有很多问题的,比如查询带参数,如果返回对象是null或者List,如何处理。
由于只是自己写的一个demo,比较烂,特别是命名和结构,大家了解下原理就好了。
注意run的时候需要mysql-connector-java-5.1.25.jar
相关推荐
主要给大家介绍了关于mybatis中注解映射SQL的相关资料,文中给出了详细的示例代码供大家参考学习,对大家的学习或者共组具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
SSM框架的学习与应用-MyBatis的注解开发实例 1.包含以下项目所需要的架包,junit-4.7 log4j-1.2.16 mybatis-3.2.2-sources mybatis-3.3.0 mysql-connector-java-5.1.0-bin mysql-connector-java-8.0.26 2.使用了Dao....
主要介绍了 Mybatis基于注解形式的sql语句生成实例代码,需要的朋友可以参考下
springMVC+Mybatis+注解实例,带sql语句
mybatis 注解+配置文件方式完整例子 包含数据库的sql文件. 所有方法都有注解, 很明了.不知道为啥这个所需积分竟然逐步增长了,描述文字也50起步了。。
基于MyBatis注解的学生管理程序-ssm彻底掌握的练手项目 1.包含项目所有需要的离线jar junit-4.7 log4j-1.2.16 mybatis-3.2.2-sources mybatis-3.3.0 mysql-connector-java-5.1.0-bin mysql-connector-java-8.0.26 2....
MyBatis 是一款优秀的持久层框架,可以很方便的在java中实现对数据库的操作。 MyBatis 可以将sql语句映射为java接口函数,直接对实体进行操作。 MyBatis 的映射类(Mapper)在映射sql语句时有两种方式,一种是xml...
MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...
MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java ...
动态SQL的应用场景和实例。 6. 注解配置: 使用注解代替XML映射器文件。 常用的注解如@Select、@Insert、@Update、@Delete。 7. 一级缓存与二级缓存: 一级缓存的概念和使用。 二级缓存的配置和作用。 缓存策略和...
最近因为使用到springmvc和mybatis做项目,所以自己用myeclipse和mysql搭建了个小demo...这个demo整合springmvc和mybatis,使用注解方式而且配置文件很完全,附带了mysql的数据库脚本。供有需要学习的人做个参考。谢谢!
另外,MyBatis也可以替换Hibernate,正因为MyBatis的半自动特点,我们程序猿可以完全掌控SQL,这会让有数据库经验的程序猿能开发出高效率的SQL语句,而且XML配置管理起来也非常方便。 好了,如果你也认同我的看法,...
这些 SQL 语句可以在 XML 映射文件中定义,也可以使用注解的方式直接写在接口方法上。 5. 编写测试代码 在测试类中,首先加载 MyBatis 的配置文件,然后获取 SqlSession。通过 SqlSession,你可以获取 Mapper 接口...
MyBatis 是一款一流的支持自定义SQL、存储过程和高级映射的持久化框架。MyBatis 几乎消 除了所有的JDBC 代码,也基本不需要手工去设置参数和获取检索结果。MyBatis 能够使用简单的 XML 格式或者注解进行来配置,能够...
全注解MyBatis开发,没有任何mapper文件,一切sql 映射都用代码实现,全程无xml配置,对xml编写mapper有恐惧症的人的福音。 提供双向生成功能: 实体类自动生成数据库表,全过程不需要任何SQL语句,所有表自动生成 ...
MyBatis 是一个基于JDBC的数据库工具框架,使用它可以快速地实现对数据库的访问操作。与之相似的框架还有 af-sql 和 Hibernate。 二、主要内容 本篇主要包含以下内容: * 在项目中加入 MyBatis 支持 * 基于 ...
BeetSql是一个全功能DAO工具,同时具有Hibernate 优点 & Mybatis优点功能,适用于承认以SQL为中心,同时又需求工具能自动能生成大量常用的SQL的应用。 在开发效率上,无需注解,自动使用大量内置SQL,轻易完成增删...
SQL、存储过程以及高级映射。 MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式...
通用Mapper是一款非常好用的MyBatis插件,它能够帮助我们自动生成常用增删改查操作的SQL语句,克服MyBatis开发过程中需要大量编写SQL语句的弊端。由于通用Mapper是根据实体类的属性自动生成对应的SQL语句,所以可以...