`

利用注解定义SQL语句,实现类是iBatis的数据库访问

 
阅读更多
import java.lang.annotation.*;


@Target({ElementType.METHOD,ElementType.TYPE})   //用于 方法
@Retention(RetentionPolicy.RUNTIME) //在运行时加载到Annotation到JVM中
public @interface SqlDef {   
    String sql();    //定义一个 SQL 语句
    String name() default "";
}

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.HashMap;

import javax.persistence.NamedAttributeNode;


@Target({ElementType.TYPE})   //用于 方法
@Retention(RetentionPolicy.RUNTIME) //在运行时加载到Annotation到JVM中
public @interface SqlDefs {

SqlDef[] defs() default {};

}



import java.lang.reflect.Method;
import java.util.HashMap;

@SqlDefs(defs={@SqlDef(name="update",
      sql="update g_product set name=${name},version=#{version} where id=${id}"),
   @SqlDef(name="insert",
      sql="insert into g_product (name,version) values (${name},${version}"),
   @SqlDef(name="delete",
      sql="delete from g_product where id=${id}"),
   @SqlDef(name="selectAll",
      sql="select * from g_product"),
   @SqlDef(name="findOne",
      sql="select * from g_product where id=${id}"),
   })
public class SqlService {

protected Sql dao;

public SqlService(Sql dao){
this.dao=dao;
}

/**
* 获取 SQL 语句
* @param method_name  方法名称
* @param types        方法的参数类别  
* @return
*/
public String getSqlCommand(String sqlId){
String sql=null;
try{
Class<? extends SqlService> cls=this.getClass();
if(cls.isAnnotationPresent(SqlDefs.class)){
SqlDefs sm=(SqlDefs) cls.getAnnotation(SqlDefs.class);
SqlDef[] mps=sm.defs();
for(int i=0;i<mps.length;i++){
// System.out.println(mps[i].name()+"\t"+mps[i].sql());
if(sqlId.equalsIgnoreCase(mps[i].name())){
sql = mps[i].sql();
break;
}
}

    }catch(Exception e){
    e.printStackTrace();
    }
return sql;
}


/**
* 获取 SQL 语句
* @param method_name  方法名称
* @param types        方法的参数类别  
* @return
*/
public String getSqlCommand(String method_name,Class []types){
String sql=null;
try{
Class cls=this.getClass();
    Method method = cls.getMethod(method_name,types);
    if(method.isAnnotationPresent(SqlDef.class)){
    SqlDef ad = method.getAnnotation(SqlDef.class);
    sql=ad.sql();
    }   
    }catch(Exception e){
    e.printStackTrace();
    }

return sql;
}


@SqlDef(sql="update g_product set name=${name},version=#{version} where id=${id} ")
public int sampleUpdate(int id, String name,int version){

Class []type={int.class,String.class,int.class};

String sql=getSqlCommand("sampleUpdate",type);
if(sql==null){
return -1;
}
HashMap<String,Object> ps=new HashMap<String,Object>();
ps.put("id", id);
ps.put("name", name);
ps.put("version", version);

    int r=dao.update(sql, ps);
    return r;
}

public void testSql(int id, String name,int version){
HashMap<String,Object> ps=new HashMap<String,Object>();
ps.put("id", id);
ps.put("name", name);
ps.put("version", version);

}


public static void main(String []args){

SqlService sb=new SqlService(null);
String sql=sb.getSqlCommand("update_");
System.out.println(sql);

}


}


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.datasource.DataSourceUtils;

public class Sql {
protected Logger log = LoggerFactory.getLogger(Sql.class);

DataSource ds;
JdbcTemplate db ;

public Sql(DataSource ds){
this.ds=ds;
this.db = new JdbcTemplate(ds);
}

/**
* 更新操作, sql 中用 #{param_name}, 或者 ${param_name} 代表参数, ${param} 作为 SQL 语句的一部分
* @param sql
* @param param
* @return
*/
public int tUpdate(String sql,final HashMap<String,Object> param){
int ret=0;
long t=System.currentTimeMillis();
final ArrayList<String> pList=new ArrayList<String>();
String sqlCmd=getSqlCmd(sql,param,pList);
try{
ret=db.update(sqlCmd,new PreparedStatementSetter(){
public void setValues(PreparedStatement ps) throws SQLException{
Object v;
String key;
for(int i=0;i<pList.size();i++){
key=pList.get(i); 
v=param.get(key);
ps.setObject(i+1, v);
}
}
});
}catch(Exception e){
log.error("Update_sql["+sqlCmd+"]", e);
}
t=System.currentTimeMillis()-t;
log.debug("Exec_sql["+sqlCmd+"],time="+t);

return ret;
}

/**
* 更新操作, sql 中用 #{param_name}, 或者 ${param_name} 代表参数, ${param} 作为 SQL 语句的一部分
* @param sql
* @param param
* @return
*/
public int update(String sql,HashMap<String,Object> param){
int ret=0;
Connection con=null;
PreparedStatement st=null;
long t=System.currentTimeMillis();

ArrayList<String> pList=new ArrayList<String>();
String sqlCmd=getSqlCmd(sql,param,pList);

try{
con=DataSourceUtils.doGetConnection(ds);
st=con.prepareStatement(sqlCmd);
Object v;
String key;
for(int i=0;i<pList.size();i++){
key=pList.get(i); 
v=param.get(key);
st.setObject(i+1, v);
}
ret=st.executeUpdate();
}catch(Exception e){
log.error("Update_sql["+sqlCmd+"]", e);
}finally{
try{
if(st!=null){
st.close();
}
}catch(Exception e){}
try{
if(con!=null){
con.close();
//DataSourceUtils.doCloseConnection(con, ds);
}
}catch(Exception e){
log.error("Close Exception:", e);
}
}
t=System.currentTimeMillis()-t;
log.debug("Exec_sql["+sqlCmd+"],time="+t);

return ret;
}

public JResult select(String sql,HashMap<String,Object> param){
JResult rs=null;
Connection con=null;
PreparedStatement st=null;
long t=System.currentTimeMillis();

ArrayList<String> pList=new ArrayList<String>();
String sqlCmd=getSqlCmd(sql,param,pList);
ResultSet set=null;
try{
con=DataSourceUtils.doGetConnection(ds);
st=con.prepareStatement(sqlCmd);
Object v;
String key;
for(int i=0;i<pList.size();i++){
key=pList.get(i); 
v=param.get(key);
st.setObject(i+1, v);
}
set=st.executeQuery();
ResultSetMetaData met=set.getMetaData();
List<String[]> ls=new ArrayList<String[]>();
int num=met.getColumnCount();
String []cols=new String[num];
for(int i=0;i<cols.length;i++){
cols[i]=met.getColumnName(i+1);
}
ls.add(cols);
while(set.next()){
cols=new String[num];
for(int i=0;i<cols.length;i++){
cols[i]=set.getString(i+1);
}
ls.add(cols);
}
rs=new JResult(ls);
}catch(Exception e){
log.error("Update_sql["+sqlCmd+"]", e);
}finally{
try{
if(set!=null){
set.close();
}
if(st!=null){
st.close();
}
}catch(Exception e){}
try{
if(con!=null){
DataSourceUtils.doCloseConnection(con, ds);
}
}catch(Exception e){
log.error("Close Exception:", e);
}
}
t=System.currentTimeMillis()-t;
log.debug("Exec_sql["+sqlCmd+"],time="+t);

return rs;
}

/**
* 处理 sql , 获取 sql 中的参数名称, 将 #{p_name} 中的 p_name 加入到 pList, 且 将 #{p_name} 替换为  ? ;
* 将  ${p_name} 替换为具体的值 , p_name 不加入到 pList
* @param sql
* @param param
* @param ps
* @return
*/
public static String getSqlCmd(String sql,HashMap<String,Object> param,ArrayList<String> pList){
if(param==null || param.size()==0){
return sql;
}
StringBuilder sb=new StringBuilder();
pList.clear();
char c;
String key=null;
int i=0;
while(i<sql.length()){
key=null;
c=sql.charAt(i);
if(c=='#' || c=='$'){
if(i+1<sql.length()){
char t=sql.charAt(i+1);
if(t=='{'){
key=getKey(sql,i+1);
}
}
}
if(key!=null){
i+=key.length()+3;
if(c=='$'){ //替换为值
Object v=param.get(key);
if(v==null){
sb.append("null");
}else{
if(v instanceof Number){
sb.append(v.toString());
}else{
sb.append('\'');
if( v instanceof Date ){
sb.append(getTM((java.util.Date)v));
}else{
if( v instanceof Calendar ){
sb.append(getTM((Calendar)v));
}else{
sb.append(v.toString());
}
}
sb.append('\'');
}
}
}else{ //'#' 替换为参数
sb.append('?');
pList.add(key);
}
}else{
sb.append(c);
i++;
}
}
return sb.toString();
}

public static String getKey(String msg,int from){
int i=from+1;
int to=-1;
char c;
String key=null;
while(i<msg.length()){
c=msg.charAt(i);
if(c=='}'){
to=i;
break;
}
i++;
}
if(to>0){
key=msg.substring(from+1, to);
}
return key;
}

public static String getTM(Date d){
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
String s = df.format(d);
return s;
}

public static String getTM(Calendar c){
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
String s = df.format(new Date(c.getTimeInMillis()));  
return s;
}



}
分享到:
评论
1 楼 白云天 2014-06-26  
还可以吗?

相关推荐

    ibatis基本操作数据库

    在iBatis中,我们通常通过XML配置文件或者注解来定义SQL语句,并使用占位符(例如#{}或${})来传递参数。 1. **参数绑定**:iBatis使用占位符(#{})进行参数绑定,可以防止SQL注入攻击。当使用#{paramName}时,...

    ibatis(mybatis)的学习工程 带详细注释

    MyBatis,原名iBatis,是一款优秀的Java持久层框架,它主要解决了在Java开发中数据访问层的繁琐工作,使得开发者可以更加专注于业务逻辑的实现。本学习工程是针对MyBatis进行深入理解与实践的一个绝佳示例,特别适合...

    ibatis sql 语句的编写

    在ibatis中,可以通过XML配置文件或者注解的方式定义SQL语句。以下是一些常见的SQL语句类型及其编写方式: ##### 3.1 查询(SELECT) 查询操作是最常见的数据库操作之一,用于从数据库中检索数据。 ```xml ...

    iBatis与数据库交互

    iBatis的核心思想是将SQL语句和Java代码分离,提供了一种灵活的数据访问接口,简化了数据库操作。 一、iBatis基本概念 1. SQL映射文件:iBatis的配置文件,包含了SQL语句、参数映射和结果映射等信息。 2. Mapper...

    ibatis 注解配置文件

    Ibatis是一个轻量级的Java ORM(对象关系映射)框架,它允许我们编写SQL语句并将其与Java对象绑定,从而简化了数据访问层的开发。在传统的XML配置文件中,Ibatis允许我们定义SQL语句、参数映射以及结果集映射。然而...

    [iBATIS]sql转换工具

    它将SQL语句与Java代码分离,通过XML或注解配置文件来定义SQL与Java方法的映射关系,以及参数模型、结果模型等。这样既避免了JDBC的繁琐,又不失SQL的灵活性。 2. **SQL转换工具的必要性** 在使用iBATIS时,可能会...

    ibatis数据库示例

    Ibatis的核心理念是“SQL就是你的API”,它通过XML或注解方式来定义SQL语句,实现了SQL语句的动态执行。 在"Ibatis数据库示例"中,我们可以看到一些关于如何使用Ibatis进行数据库操作的实际代码示例。这些示例可能...

    spring mvc+ibatis+spring注解

    通过XML配置或注解,可以定义SQL映射文件,将Java对象与SQL语句关联起来。 "注解"在这里指的是Spring的注解驱动开发,它简化了配置,使得开发者能够直接在类或方法上使用注解(如@Controller、@Service、@...

    ibatis实现原理解析

    1. SQL映射文件:Ibatis通过XML或注解方式定义SQL语句,这些语句被封装在SQL映射文件中。映射文件包含了各种SQL操作,如查询、插入、更新和删除等。 2. 映射器接口:在Java代码中,开发者定义一个接口,这个接口的...

    IBatis.net 配置各种数据库

    IBatis 是一个基于.NET平台的持久层框架,它实现了SQL语句与.NET代码的解耦,通过XML或注解的方式将SQL与数据访问逻辑分离,提高了开发效率。其主要组成部分包括:SqlMapConfig.xml(全局配置文件)、Mapper.xml...

    ibatis基础知识详解

    其设计理念是将SQL语句与Java代码解耦,通过XML配置文件或注解方式定义SQL语句,使得数据库操作更加灵活且易于维护。 ## 2. Ibatis的核心概念 ### 2.1 SQL映射文件 SQL映射文件是Ibatis的核心组成部分,它包含了...

    ibatis入门--对数据库的操作

    【ibatis入门--对数据库的操作】这篇文章主要讲解了如何使用iBatis框架来操作数据库,iBatis是一个轻量级的持久层框架,它将SQL语句与Java代码分离,提高了开发效率和代码的可维护性。以下是文章涉及的关键知识点: ...

    Java封装ibatis操作数据库.rar

    然后,使用MyBatis的Mapper注解或Mapper XML文件来实现这些方法,将SQL语句绑定到接口方法上。这样,业务层只需调用DAO接口,无需关心SQL的具体执行细节。 在具体的实现中,可能会有BaseDAO类作为所有DAO的基类,...

    ibatis-sqlmaps-2_cn

    通过XML配置文件或者注解,开发者可以定义SQL语句、存储过程以及复杂的映射,避免了直接在Java代码中编写SQL的繁琐和复杂性。 在《ibatis-sqlmaps-2_cn》中,你将会学习到如何设置和配置IBATIS环境,包括引入必要的...

    Ibatis学习(通过Ibatis实现简单的数据库的添加、删除、修改)

    Ibatis 是一款轻量级的Java持久层框架,它与Hibernate和JPA等ORM框架不同,Ibatis 更强调SQL的灵活性,将SQL语句的编写和执行交给了开发者,允许在XML配置文件或者注解中定义SQL语句,从而实现了数据访问逻辑与业务...

    webwork+ibatis+sqlserver2000

    3. **DAO(数据访问对象)**:与iBATIS结合,实现数据库操作。 4. **Mapper文件**:iBATIS的XML文件,包含SQL语句。 5. **实体类**:Java对象,对应数据库中的表。 6. **JSP页面**:视图部分,展示用户界面。 7. **...

    ibatis驱动+Mysql驱动+SQL驱动

    开发者可以通过Ibatis的API编写SQL,利用MySQL JDBC驱动与数据库建立连接,执行SQL语句,最后通过SQL驱动处理结果集。这种组合的优势在于: 1. **灵活性**:Ibatis允许开发者直接编写SQL,避免了ORM框架可能带来的...

    什么是iBATIS

    iBATIS 是一个在Java应用程序中持久化数据的开源框架,它为数据库访问提供了一个中间层,使得开发者可以将SQL语句与Java代码分离,从而简化了数据库驱动的应用程序的开发过程。这个框架由Apache Software Foundation...

    mybatis自动sql生成插件源码

    MyBatis是一款流行的Java持久层框架,用于简化数据库操作,其特点是将SQL语句与Java代码分离,使得SQL和业务逻辑更加清晰。本项目提供的"mybatis自动sql生成插件源码"则进一步提升了开发效率,通过拦截器...

    ibatis.net winform搭建带数据库

    6. **编写SQL Maps**: 使用XML文件或者基于注解的方式定义SQL Maps,这些映射文件会指定SQL语句和.NET对象之间的关系。 7. **实现业务逻辑**: 在WinForm控件的事件处理程序中,使用iBATIS的SqlMapClient对象执行SQL...

Global site tag (gtag.js) - Google Analytics