package com.alibaba.sql;

import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.commons.beanutils.BeanUtils; public class DAO {
public void update(String sql, Object...args){
Connection connection = null;
PreparedStatement preparedStatement = null;
try{
connection = JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);
for(int i = 0; i < args.length; i++){
preparedStatement.setObject(i + 1, args[i]);
}
preparedStatement.executeUpdate();
}catch (Exception e) {
e.printStackTrace();
}
finally{
JDBCTools.release(null, preparedStatement, connection);
}
} public <T> T get(Class<T> clazz, String sql, Object...args){
List<T> list = getForList(clazz, sql, args);
if(list != null){
return list.get(0);
}
return null;
} public <T> List<T> getForList(Class<T> clazz, String sql, Object...args){
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
List<T> list = null;
try{
connection = JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);
for(int i = 0; i < args.length; i++){
preparedStatement.setObject(i + 1, args[i]);
}
resultSet = preparedStatement.executeQuery();
List<String> label = getLabel(resultSet);
List<Map<String, Object>> values = getValues(resultSet, label);
if(values.size() > 0){
list = valueTolist(clazz, values);
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCTools.release(resultSet, preparedStatement, connection);
}
return list;
} private <T> List<T> valueTolist(Class<T> clazz, List<Map<String, Object>> values) throws InstantiationException,
IllegalAccessException, InvocationTargetException {
List<T> list = new ArrayList<T>();
for(Map<String, Object> map:values){
T entity = clazz.newInstance();
for(Map.Entry<String, Object> entry:map.entrySet()){
String fieldName = entry.getKey();
Object fieldValue = entry.getValue();
BeanUtils.setProperty(entity, fieldName, fieldValue);
}
list.add(entity);
}
return list;
} private List<Map<String, Object>> getValues(ResultSet resultSet,
List<String> label) throws SQLException {
List<Map<String, Object>> values = new ArrayList<Map<String, Object>>();
while(resultSet.next()){
Map<String, Object> map = new HashMap<String, Object>();
for(int i = 0; i < label.size(); i++){
String fieldName = label.get(i);
Object fieldValue = resultSet.getObject(fieldName);
map.put(fieldName, fieldValue);
}
values.add(map);
}
return values;
} private List<String> getLabel(ResultSet resultSet) throws SQLException {
ResultSetMetaData rsmd = resultSet.getMetaData();
List<String> label = new ArrayList<String>();
for(int i = 0; i< rsmd.getColumnCount(); i++){
label.add(rsmd.getColumnLabel(i+1));
}
return label;
} @SuppressWarnings("unchecked")
public <E> E getForValue(String sql, Object...args){
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
E entity = null;
try{
connection = JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);
for(int i = 0; i < args.length; i++){
preparedStatement.setObject(i + 1, args[i]);
}
resultSet = preparedStatement.executeQuery();
if(resultSet.next()){
entity = (E)resultSet.getObject(1);
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCTools.release(resultSet, preparedStatement, connection);
}
return entity;
}
}

获取自动生成(auto-increment)主键

preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

ResultSet rs = preparedStatement.getGeneratedKeys();  //仅返回一列, 列名GENERATED_KEYS, 值Id

if(rs.next){

Sysout(rs.getObject(1));

}

DAO以及获取自动生成主键值的更多相关文章

  1. mybatis添加信息自动生成主键

    一.使用Oracle数据库 举例:添加员工的时候自动生成主键 1.在dao接口中声明方法 2.在mapper中实现该方法 需要先在数据表中创建序列 3.测试 注意:在调用过save方法之后,emp对象 ...

  2. ibatis实战之插入数据(自动生成主键)

    ibatis实战之插入数据(自动生成主键) --------- 如果你将数据库设计为使用自动生成的主键,就可以使用ibatis的<selectKey>元素(该元素是<insert&g ...

  3. MyBatis映射文件1(增删改、insert获取自增主键值)

    增删改 Mybatis为我们提供了<insert>.<update>.<delete>标签来对应增删改操作 在接口中写增删改的抽象方法 void addEmp(Em ...

  4. javaweb基础(37)_mysql数据库自动生成主键

    测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...

  5. MySql MyBatis 自动生成主键返回null

    <insert id="insert" parameterType="cn.zno.smse.pojo.UserScan" useGeneratedKey ...

  6. mybatis中Oracle及mysql插入时自动生成主键以及返回主键

    mysql的方式: 方式一: useGeneratedKeys="true" keyProperty="id" 方式二: <selectKey keyPr ...

  7. Mybatis获取自增主键值

    1.配置文件变化 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLI ...

  8. mysql插入数据自动生成主键uuid

    DemoMapper.java //注意方法的返回值必须是void; void add(Demo demo); ============================================ ...

  9. spring3: 对JDBC的支持 之 Spring提供的其它帮助 SimpleJdbcInsert/SimpleJdbcCall/SqlUpdate/JdbcTemplate 生成主键/批量处理

    7.4  Spring提供的其它帮助 7.4.1  SimpleJdbc方式 Spring JDBC抽象框架提供SimpleJdbcInsert和SimpleJdbcCall类,这两个类通过利用JDB ...

随机推荐

  1. 从零开始Unity3D游戏开发【4 材质球和渲染纹理】

    [创建材质球] 1.Project 面板下  create-Material 然后将材质球拖放到物体,物体的颜色便会和材质球相同: [渲染纹理 RenderTexture]

  2. api文档生成工具 C#

    要为编写的程序编写文档,这是件费力气的事,如果能自动生成就好了. 不怕做不到,就怕想不到.这不,搜索到了Sandcastle 比较好的参考文章: 1.Sandcastle官方网址: http://sh ...

  3. isEmpty()

    String a = new String(); 此时a是分配了内存空间,但值为空,是绝对的空,是一种有值(值存在为空而已) String b = ""; 此时b是分配了内存空间, ...

  4. iOS 常用第三方

    MWPhotoBrowser 非常好用的图片浏览器 FDFullscreenPopGesture 用于全屏滑动切换视图 Aspects 用于快速AOP编程 AFNetworking iOS开发中最为火 ...

  5. ubuntu菜单面板丢了怎么找回

    我的ubuntu菜单面板丢了.   我的ubuntu用的是gnome桌面环境,桌面环境分为三个区域: 1.菜单面板 (1)三个主菜单:应用程序,位置,系统. (2)快速启动区:菜单面板中间的部分称为快 ...

  6. ASP.NET MVC Controller向View传值方式总结

    Controller向View传值方式总结 总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是: ViewBag ViewData TempData 向普通Vie ...

  7. qt学习:信号,槽

    [C.GUI.Qt.4编程(第二版)](加)布兰切特,(英)萨默菲尔德.扫描版[学习库www.xuexi111.com].pdf 信号和槽是Qt编程的基础,它可以让各种对象联系在一起. 1. 使用co ...

  8. shell检测interface是否已分配ip,qt调用shell脚本

    #include <QCoreApplication>#include <QDebug>#include <QTextStream>#include <QDi ...

  9. Pull和SAX解析的区别

    Pull解析器和SAX解析器虽有区别但也有相似性.他们的区别为:SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事件的处理主动结束:而Pull解析器的工作方式为允许你的应 ...

  10. thinkPHP的常用配置项

    'URL_PATHINFO_DEPR'=>'-',//修改URL的分隔符 'TMPL_L_DELIM'=>'<{', //修改左定界符 'TMPL_R_DELIM'=>'}&g ...