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. android中退出当前应用程序的四种方法

    android中退出当前应用程序的四种方法 [IT168 技术]Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A.在B中如何 ...

  2. MyDatePicker拆分日期显示到不同TextBox

    如图所示效果:年—月—日 时—分—秒 <tr>                <td align="center" style="background- ...

  3. iOS 根据图片URL从本地相册获取图片

    最近做一个聊天的项目,需要发送图片后读取本地图片显示到列表里.刚开始的时候,天真的认为可以用SDWebImage直接加载,然后并不能行. 于是在网上搜了搜,如何根据从相册获取的UIImagePicke ...

  4. C#实现文件批量重命名源码下载

    本文要实现的功能是 文件批量重命名,当选择一个文件夹时,通过操作可以把文件夹下面所有文件进行重命名.建立了HoverTreeBatch项目. 然后 定义文件夹信息: DirectoryInfo _Th ...

  5. .wsdl文件生成.cs文件

    1.打开VS文件命令行工具(一般在安装文件的Common7\Tools\Shortcuts下面例如[E:\VS2013安装程序\Common7\Tools\Shortcuts\VS2013 x64 本 ...

  6. Chrome NativeClient创建 (转)

    Chrome NativeClient创建 该demo目标是让chrome扩展启动本地exe 1创建一个名叫nativeMsgDemo的控制台程序 #include <Windows.h> ...

  7. LeetCode 1. twoSums

    C++: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int&g ...

  8. Asp.Net 禁用cookie后使用session

    原文地址:http://www.c-sharpcorner.com/UploadFile/deepak.sharma00/using-cookie-less-session-in-Asp-Net/ H ...

  9. hdu 4162 Shape Number 最小表示法

    题目链接 给一个字符串, 将它想象成一个环, 然后从环中任意一个位置断开, 求断开后字典序最小的那种情况. 直接上模板.. #include <iostream> #include < ...

  10. Rem & Viewport

    Rem布局 rem就是给根元素设置一个基准值 然后其他元素都以这个基准值作为单位 那么就可以在不同的手机上做出相同比例的元素了 事实上和百分比是同样的道理 网易和淘宝的rem 参考 http://ww ...