GVKun编程网logo

使用JdbcTemplate插入多行(jdbctemplate执行多条insert)

14

在本文中,我们将给您介绍关于使用JdbcTemplate插入多行的详细内容,并且为您解答jdbctemplate执行多条insert的相关问题,此外,我们还将为您提供关于21JDBC_事务&JDBCT

在本文中,我们将给您介绍关于使用JdbcTemplate插入多行的详细内容,并且为您解答jdbctemplate执行多条insert的相关问题,此外,我们还将为您提供关于21JDBC_事务&JDBCTemplate、H2数据库:使用jdbcTemplate插入记录时,“ ID”列不允许NULL、java – simpleJdbcTemplate. – 插入和检索ID、java-使用jdbcTemplate分页的知识。

本文目录一览:

使用JdbcTemplate插入多行(jdbctemplate执行多条insert)

使用JdbcTemplate插入多行(jdbctemplate执行多条insert)

如何使用在mySQL上运行的JdbcTemplate以可扩展的方式执行以下SQL
。在这种情况下,可伸缩意味着:

  1. 服务器上仅执行一条SQL语句
  2. 它适用于任何数量的行。

声明如下:

INSERT INTO myTable (foo, bar) VALUES ("asdf", "asdf"), ("qwer", "qwer")

假设我有一个带有foobar字段的POJO列表。我意识到我可以遍历列表并执行:

jdbcTemplate.update("INSERT INTO myTable(foo, bar) VALUES (?, ?)", paramMap)

但这并不能满足第一个条件。

我相信我也可以执行:

jdbcTemplate.batchUpdate("INSERT INTO myTable(foo, bar) VALUES (?, ?)", paramMapArray)

但是据我所知,这只会编译一次SQL并多次执行它,从而再次使第一个条件失败。

似乎通过了这两个标准的最终可能性是,自己使用来简单地构建SQL StringBuffer,但我想避免这种情况。

答案1

小编典典

实际上,多行插入(使用“行值构造函数”)是SQL-92标准的一部分。请参阅
http://en.wikipedia.org/wiki/Insert_(SQL)#Multirow_inserts。

一些数据库不支持此语法,但许多数据库支持。根据我的经验,Derby / Cloudscape,DB2,Postgresql和较新的Hypersonic
2。* +发行版都支持此功能。

您担心将其用作PreparedStatement是可以理解的,但是我已经看到类似的情况,其中Spring
JDBC会自动处理某些查询的项目集合(例如(?)中的where),但是我不能保证这种情况。

我确实在(无法在此帖子中添加第二个链接)找到了一些可能有用的信息,这可能会有所帮助。

我可以告诉您,从最严格的意义上讲,它可能无法满足您的第二个要求(适用于任意数量的参数):我使用的每个数据库都施加了查询长度限制,这将发挥作用。

21JDBC_事务&JDBCTemplate

21JDBC_事务&JDBCTemplate

一、JDBC_事务

通过JDBC来操作银行转账的事务

1.API介绍

    Connection接口中与事务有关的方法
void setAutoCommit(boolean autoCommit) throws SQLException;
false:开启事务, ture:关闭事务
void commit() throws SQLException;
提交事务
void rollback() throws SQLException;
回滚事务
 
 
 
6
 
 
 
 
 
1
void setAutoCommit(boolean autoCommit) throws SQLException;
2
false:开启事务, ture:关闭事务
3
void commit() throws SQLException;
4
提交事务
5
void rollback() throws SQLException;
6
回滚事务
 
 
案例:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCTransactionTest {
    public static void main(String[] args) {

        Connection conn = null;
        PreparedStatement stmt = null;

        try {
            // 1. 获取连接对象
            conn = JDBCUtils.getConnection();

            // 第一步 : 开启事务
            conn.setAutoCommit(false);

            // 2. 操作数据
            // 2.1 账户转出
            String outSql = "update account set money = money - ? where name = ?;";
            stmt = conn.prepareStatement(outSql);
            stmt.setInt(1, 1000);
            stmt.setString(2, "tom");
            stmt.executeUpdate();

            // 模拟异常 ...
            // int num = 10 / 0;

            // 2.2 账户转入
            String inSql = "update account set money = money + ? where name = ?;";
            stmt = conn.prepareStatement(inSql);
            stmt.setInt(1, 1000);
            stmt.setString(2, "jery");
            stmt.executeUpdate();

            // 第二步 : 提交事务
            conn.commit();

            System.out.println("转账成功!");

        } catch (Exception e) {
            // 如果出现异常, 需要进行事务回滚.
            // 第三步 : 回滚事务
            try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }

            System.out.println("转账失败!");

        } finally {
            // 3. 释放资源
            JDBCUtils.release(conn, stmt);
        }
    }
}
 
 
 
57
 
 
 
 
 
1
import java.sql.Connection;
2
import java.sql.PreparedStatement;
3
import java.sql.SQLException;
4
5
public class JDBCTransactionTest {
6
    public static void main(String[] args) {
7
8
        Connection conn = null;
9
        PreparedStatement stmt = null;
10
11
        try {
12
            // 1. 获取连接对象
13
            conn = JDBCUtils.getConnection();
14
15
            // 第一步 : 开启事务
16
            conn.setAutoCommit(false);
17
18
            // 2. 操作数据
19
            // 2.1 账户转出
20
            String outSql = "update account set money = money - ? where name = ?;";
21
            stmt = conn.prepareStatement(outSql);
22
            stmt.setInt(1, 1000);
23
            stmt.setString(2, "tom");
24
            stmt.executeUpdate();
25
26
            // 模拟异常 ...
27
            // int num = 10 / 0;
28
29
            // 2.2 账户转入
30
            String inSql = "update account set money = money + ? where name = ?;";
31
            stmt = conn.prepareStatement(inSql);
32
            stmt.setInt(1, 1000);
33
            stmt.setString(2, "jery");
34
            stmt.executeUpdate();
35
36
            // 第二步 : 提交事务
37
            conn.commit();
38
39
            System.out.println("转账成功!");
40
41
        } catch (Exception e) {
42
            // 如果出现异常, 需要进行事务回滚.
43
            // 第三步 : 回滚事务
44
            try {
45
                conn.rollback();
46
            } catch (SQLException e1) {
47
                e1.printStackTrace();
48
            }
49
50
            System.out.println("转账失败!");
51
52
        } finally {
53
            // 3. 释放资源
54
            JDBCUtils.release(conn, stmt);
55
        }
56
    }
57
}
 
 
 
 
 

二、jdbcTemplate

1.API介绍

    org.springframework.jdbc.core.JdbcTemplate类方便执行SQL语句
public JdbcTemplate(DataSource dataSource)
创建JdbcTemplate对象,方便执行SQL语句
public void execute(final String sql)
execute可以执行所有SQL语句,因为没有返回值,一般用于执行DML语句。
 
 
 
4
 
 
 
 
 
1
public JdbcTemplate(DataSource dataSource)
2
创建JdbcTemplate对象,方便执行SQL语句
3
public void execute(final String sql)
4
execute可以执行所有SQL语句,因为没有返回值,一般用于执行DML语句。
 
 
 

2.使用步骤

        1. 准备DruidDataSource连接池
2. 导入依赖的jar包
   - spring-beans-5.0.2.RELEASE.jar
   - spring-core-5.0.2.RELEASE.jar
   - spring-jdbc-5.0.2.RELEASE.jar
   - spring-tx-5.0.2.RELEASE.jar
   - com.springsource.org.apache.commons.logging-1.1.1.jar
3. 创建JdbcTemplate对象,传入c3p0连接池
4. 调用execute、update、queryXxx等方法

3.案例

    (1)c3p0-config.xml配置文件
        
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <!-- 默认配置,c3p0框架默认加载这段默认配置 -->
    <default-config>
        <!-- 配置JDBC 四个基本属性 -->
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&amp;characterEncoding=utf-8</property>
        <property name="user">root</property>
        <property name="password">111</property>
    </default-config>
    <!-- 可以自定义配置,为这段配置起一个名字,c3p0指定名称加载配置 -->
    <named-config name="xxxxx">
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&amp;characterEncoding=utf-8</property>
        <property name="user">root</property>
        <property name="password">111</property>
    </named-config>
</c3p0-config>
 
 
 
18
 
 
 
 
 
1
<?xml version="1.0" encoding="UTF-8"?>
2
<c3p0-config>
3
    <!-- 默认配置,c3p0框架默认加载这段默认配置 -->
4
    <default-config>
5
        <!-- 配置JDBC 四个基本属性 -->
6
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
7
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&amp;characterEncoding=utf-8</property>
8
        <property name="user">root</property>
9
        <property name="password">111</property>
10
    </default-config>
11
    <!-- 可以自定义配置,为这段配置起一个名字,c3p0指定名称加载配置 -->
12
    <named-config name="xxxxx">
13
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
14
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&amp;characterEncoding=utf-8</property>
15
        <property name="user">root</property>
16
        <property name="password">111</property>
17
    </named-config>
18
</c3p0-config>
 
 
        (2)JDBCUtils工具类
public class JDBCUtils {

    // 核心连接池类
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource();

    public static DataSource getDataSource() {
        return dataSource;
    }

    // 获取连接
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    // 释放资源
    public static void release(Connection conn, Statement stmt, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }

        release(conn, stmt);
    }

    public static void release(Connection conn, Statement stmt) {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            stmt = null;
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }
}
 
 
 
48
 
 
 
 
 
1
public class JDBCUtils {
2
3
    // 核心连接池类
4
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
5
6
    public static DataSource getDataSource() {
7
        return dataSource;
8
    }
9
10
    // 获取连接
11
    public static Connection getConnection() throws SQLException {
12
        return dataSource.getConnection();
13
    }
14
15
    // 释放资源
16
    public static void release(Connection conn, Statement stmt, ResultSet rs) {
17
        if (rs != null) {
18
            try {
19
                rs.close();
20
            } catch (SQLException e) {
21
                e.printStackTrace();
22
            }
23
            rs = null;
24
        }
25
26
        release(conn, stmt);
27
    }
28
29
    public static void release(Connection conn, Statement stmt) {
30
        if (stmt != null) {
31
            try {
32
                stmt.close();
33
            } catch (SQLException e) {
34
                e.printStackTrace();
35
            }
36
            stmt = null;
37
        }
38
39
        if (conn != null) {
40
            try {
41
                conn.close();
42
            } catch (SQLException e) {
43
                e.printStackTrace();
44
            }
45
            conn = null;
46
        }
47
    }
48
}
 
 
jdbcTemplate的exeucte方法
public class JDBCTemplateExecute {
	public static void main(String[] args) {

        // 1. 创建表的SQL语句
        String sql = "create table product (" +
                "pid int primary key auto_increment," +
                "pname varchar(20)," +
                "price double" +
                ");";

        // 2. 创建 jdbcTemplate 对象, 并将数据库连接池作为参数传入
		JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());

		// 3. 使用 jdbcTemplate 对象调用 execute 方法, 执行 sql 语句, 创建数据库表.
		jdbcTemplate.execute(sql);
	}
}
 
 
 
17
 
 
 
 
 
1
public class JDBCTemplateExecute {
2
public static void main(String[] args) {
3
4
        // 1. 创建表的SQL语句
5
        String sql = "create table product (" +
6
                "pid int primary key auto_increment," +
7
                "pname varchar(20)," +
8
                "price double" +
9
                ");";
10
11
        // 2. 创建 jdbcTemplate 对象, 并将数据库连接池作为参数传入
12
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
13
14
// 3. 使用 jdbcTemplate 对象调用 execute 方法, 执行 sql 语句, 创建数据库表.
15
jdbcTemplate.execute(sql);
16
}
17
}
 
 

4通过jdbcTemplate实现增删改

    API介绍
    
// org.springframework.jdbc.core.JdbcTemplate类方便执行SQL语句
public int update(final String sql)
用于执行`INSERT`、`UPDATE`、`DELETE`等DML语句

 
 
 
5
 
 
 
 
 
1
// org.springframework.jdbc.core.JdbcTemplate类方便执行SQL语句
2
public int update(final String sql)
3
用于执行`INSERT`、`UPDATE`、`DELETE`等DML语句
4
5
 
 
使用步骤:
 
1.创建JdbcTemplate对象
2.编写SQL语句
3.使用JdbcTemplate对象的update方法进行增删改
 
insert 增加数据 :
   @Test
    public void insert() {

        // 1. 创建一个 JdbcTemplate 对象, 并将连接池作为参数传入
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());

        // 2. 编写 sql 语句
        String sql = "insert into product values(null, ?, ?);";

        // 3. 执行 update 方法.
        jdbcTemplate.update(sql, "iPhone3GS", 3333);
        jdbcTemplate.update(sql, "iPhone4", 5000);
        jdbcTemplate.update(sql, "iPhone4S", 5001);
        jdbcTemplate.update(sql, "iPhone5", 5555);
        jdbcTemplate.update(sql, "iPhone5C", 3888);
        jdbcTemplate.update(sql, "iPhone5S", 5666);
        jdbcTemplate.update(sql, "iPhone6", 6666);
        jdbcTemplate.update(sql, "iPhone6S", 7000);
        jdbcTemplate.update(sql, "iPhone6SP", 7777);
        jdbcTemplate.update(sql, "iPhoneX", 8888);
    }
 
 
 
21
 
 
 
 
 
1
   @Test
2
    public void insert() {
3
4
        // 1. 创建一个 JdbcTemplate 对象, 并将连接池作为参数传入
5
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
6
7
        // 2. 编写 sql 语句
8
        String sql = "insert into product values(null, ?, ?);";
9
10
        // 3. 执行 update 方法.
11
        jdbcTemplate.update(sql, "iPhone3GS", 3333);
12
        jdbcTemplate.update(sql, "iPhone4", 5000);
13
        jdbcTemplate.update(sql, "iPhone4S", 5001);
14
        jdbcTemplate.update(sql, "iPhone5", 5555);
15
        jdbcTemplate.update(sql, "iPhone5C", 3888);
16
        jdbcTemplate.update(sql, "iPhone5S", 5666);
17
        jdbcTemplate.update(sql, "iPhone6", 6666);
18
        jdbcTemplate.update(sql, "iPhone6S", 7000);
19
        jdbcTemplate.update(sql, "iPhone6SP", 7777);
20
        jdbcTemplate.update(sql, "iPhoneX", 8888);
21
    }
 
 
update 修改数据 : *
    @Test
    public void update() {

        // 1. 创建一个 JdbcTemplate 对象, 并将数据库连接池作为参数传入
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());

        // 2. 执行 update 语句
        String sql = "update product set pname = ?, price = ? where pid = ?;";
        int count = jdbcTemplate.update(sql, "XVIII", 18888, 10);
        System.out.println("count = " + count);
    }
 
 
 
11
 
 
 
 
 
1
    @Test
2
    public void update() {
3
4
        // 1. 创建一个 JdbcTemplate 对象, 并将数据库连接池作为参数传入
5
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
6
7
        // 2. 执行 update 语句
8
        String sql = "update product set pname = ?, price = ? where pid = ?;";
9
        int count = jdbcTemplate.update(sql, "XVIII", 18888, 10);
10
        System.out.println("count = " + count);
11
    }
 
 
delete 删除数据 :
    @Test
    public void delete() {
        // 1. 创建一个 JdbcTemplate 对象, 并将数据库连接池作为参数传入
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());

        // 2. 执行 delete 操作
        String sql = "delete from product where pid = ?;";
        int count = jdbcTemplate.update(sql, 7);
        System.out.println("count = " + count);
    }
 
 
 
10
 
 
 
 
 
1
    @Test
2
    public void delete() {
3
        // 1. 创建一个 JdbcTemplate 对象, 并将数据库连接池作为参数传入
4
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
5
6
        // 2. 执行 delete 操作
7
        String sql = "delete from product where pid = ?;";
8
        int count = jdbcTemplate.update(sql, 7);
9
        System.out.println("count = " + count);
10
    }
 
 
 

小结

JdbcTemplate的update方法用于执行DML语句。同时还可以在SQL语句中使用?占位,在update方法的Object... args可变参数中传入对应的参数。
 

5 jdbcTemplate实现查询

    API介绍
     queryForObject返回一个指定类型
    
// 单行单列的查询
public <T> T queryForObject(String sql, Class<T> requiredType, Object... args):
   传入参数, 执行查询语句,返回一个指定类型的数据。

// 单行多列
public Map<String, Object> queryForMap(String sql, Object... args)
传入参数,执行查询语句,将一条记录放到一个Map中。

// 多行多列
public List<Map<String, Object>> queryForList(String sql, Object... args)
传入参数,执行查询语句,返回一个List集合,List中存放的是Map类型的数据。

// 返回一个List 存放对象数据
public <T> List<T> query(String sql, RowMapper<T> rowMapper)
执行查询语句,返回一个List集合,List中存放的是RowMapper指定类型的数据。

// 提供了一个上述方法的一个实现类     RowMapper 行映射接口     BeanPropertyRowMapper     实体类属性行映射
public class BeanPropertyRowMapper<T> implements RowMapper<T>
BeanPropertyRowMapper类实现了RowMapper接口
实体类属性行映射
 
 
16
 
 
 
1
// 单行单列的查询
2
public <T> T queryForObject(String sql, Class<T> requiredType, Object... args):
3
   传入参数, 执行查询语句,返回一个指定类型的数据。
4
5
// 单行多列
6
public Map<String, Object> queryForMap(String sql, Object... args)
7
传入参数,执行查询语句,将一条记录放到一个Map中。
8
9
// 多行多列
10
public List<Map<String, Object>> queryForList(String sql, Object... args)
11
传入参数,执行查询语句,返回一个List集合,List中存放的是Map类型的数据。
12
13
// 返回一个List 存放对象数据
14
public <T> List<T> query(String sql, RowMapper<T> rowMapper)
15
执行查询语句,返回一个List集合,List中存放的是RowMapper指定类型的数据。
16
 
 
17
// 提供了一个上述方法的一个实现类     RowMapper 行映射接口     BeanPropertyRowMapper     实体类属性行映射
18
public class BeanPropertyRowMapper<T> implements RowMapper<T>
19
BeanPropertyRowMapper类实现了RowMapper接口
 
 
    
    @Test
    public void test1() {

        // 1. 创建一个 JdbcTemplate 对象
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());

        // 2. 执行 queryForObject 方法
        String sql = "select pname from product where price = 7777";
        String pname = jdbcTemplate.queryForObject(sql, String.class);
        System.out.println("pname = " + pname);
    }

    @Test
    public void test2() {

        // 1. 创建一个 JdbcTemplate 对象
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());

        // 2. 执行 queryForMap 方法
        String sql = "select * from product where pid = ?;";
        Map<String, Object> map = jdbcTemplate.queryForMap(sql, 6);
        System.out.println("map = " + map);
    }

    @Test
    public void test3() {

        // 1. 创建一个 JdbcTemplate 对象
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());

        // 2. 执行 objectForList 方法
        String sql = "select * from product where pid < ?;";
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, 8);
        for (Map<String, Object> map : list) {
            System.out.println(map);
        }
    }



    @Test
    public void test4() {

        // 1. 创建一个 JdbcTemplate 对象
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());

        // 2. 执行 query 方法
        String sql = "select * from product;";
        List<Product> list = jdbcTemplate.query(sql, new RowMapper<Product>() {
            @Override
            public Product mapRow(ResultSet rs, int i) throws SQLException {

                Product product = new Product();
                int pid = rs.getInt("pid");
                String pname = rs.getString("pname");
                double price = rs.getDouble("price");
                product.setPid(pid);
                product.setPname(pname);
                product.setPrice(price);

                return product;
            }
        });

        // 遍历 list 集合
        for (Product product : list) {
            System.out.println(product);
        }
    }



    @Test
    public void test5() {

        // 1. 创建一个 JdbcTemplate 对象
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());

        // 2. 执行 query 方法
        String sql = "select * from product;";
        List<Product> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Product.class));

        // 3. 遍历 list 集合
        for (Product product : list) {
            System.out.println(product);
        }
    }
 
 
 
x
 
 
 
 
 
1
    @Test
2
    public void test1() {
3
4
        // 1. 创建一个 JdbcTemplate 对象
5
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
6
7
        // 2. 执行 queryForObject 方法
8
        String sql = "select pname from product where price = 7777";
9
        String pname = jdbcTemplate.queryForObject(sql, String.class);
10
        System.out.println("pname = " + pname);
11
    }
12
13
    @Test
14
    public void test2() {
15
16
        // 1. 创建一个 JdbcTemplate 对象
17
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
18
19
        // 2. 执行 queryForMap 方法
20
        String sql = "select * from product where pid = ?;";
21
        Map<String, Object> map = jdbcTemplate.queryForMap(sql, 6);
22
        System.out.println("map = " + map);
23
    }
24
25
    @Test
26
    public void test3() {
27
28
        // 1. 创建一个 JdbcTemplate 对象
29
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
30
31
        // 2. 执行 objectForList 方法
32
        String sql = "select * from product where pid < ?;";
33
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, 8);
34
        for (Map<String, Object> map : list) {
35
            System.out.println(map);
36
        }
37
    }
38
39
40
41
    @Test
42
    public void test4() {
43
44
        // 1. 创建一个 JdbcTemplate 对象
45
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
46
47
        // 2. 执行 query 方法
48
        String sql = "select * from product;";
49
        List<Product> list = jdbcTemplate.query(sql, new RowMapper<Product>() {
50
            @Override
51
            public Product mapRow(ResultSet rs, int i) throws SQLException {
52
53
                Product product = new Product();
54
                int pid = rs.getInt("pid");
55
                String pname = rs.getString("pname");
56
                double price = rs.getDouble("price");
57
                product.setPid(pid);
58
                product.setPname(pname);
59
                product.setPrice(price);
60
61
                return product;
62
            }
63
        });
64
65
        // 遍历 list 集合
66
        for (Product product : list) {
67
            System.out.println(product);
68
        }
69
    }
70
71
72
73
    @Test
74
    public void test5() {
75
76
        // 1. 创建一个 JdbcTemplate 对象
77
        JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
78
79
        // 2. 执行 query 方法
80
        String sql = "select * from product;";
81
        List<Product> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Product.class));
82
83
        // 3. 遍历 list 集合
84
        for (Product product : list) {
85
            System.out.println(product);
86
        }
87
    }
 
 

小结:

      JDBCTemplate的query方法用于执行SQL语句,简化JDBC的代码。同时还可以在SQL语句中使用?占位,在query方法的Object... args可变参数中传入对应的参数。  
 
 
 
 
 
 
 
 
 
 
 
 
 
 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false">

 
 
 
 



来自为知笔记(Wiz)



H2数据库:使用jdbcTemplate插入记录时,“ ID”列不允许NULL

H2数据库:使用jdbcTemplate插入记录时,“ ID”列不允许NULL

我使用hibernate的hbm2ddl自动生成架构。这是我的域名:

@Entitypublic class Reader {  @Id  @GeneratedValue(strategy=GenerationType.AUTO)  Long id;  @Column(nullable=false,unique=true)  String name;  @Enumerated(EnumType.STRING)  Gender gender;  int age;  Date registeredDate = new Date();// getter and setter ...}

当我使用hibernate保存a时reader,它会为ID生成ID,因此可以按预期工作reader。但是,当我使用jdbcTemplate通过纯SQL插入记录时,它报告一个错误:

org.springframework.dao.DataIntegrityViolationException: StatementCallback; SQL [insert into reader(name,gender,age) values(''Lily'',''FEMALE'',21)]; NULL not allowed for column "ID";     SQL statement:insert into reader(name,gender,age) values(''Lily'',''FEMALE'',21) [23502-192]; nested exception is org.h2.jdbc.JdbcSQLException: NULL not allowed for column "ID";     SQL statement:  insert into reader(name,gender,age) values(''Lily'',''FEMALE'',21) [23502-192]

如何解决呢?

  1. 我调试发现生成的hb2ddl的DDL是create table Book (id bigint not null, author varchar(255), name varchar(255), price double not null, type varchar(255), primary key (id))。hibernate者似乎以自己的方式处理id策略,但是如何处理呢?
  2. @GeneratedValue(strategy=GenerationType.AUTO)应产生auto increment的DDL的语句,但我没有发现。我想念吗?

答案1

小编典典

尝试使用strategy=GenerationType.IDENTITY而不是strategy=GenerationType.AUTO

hibernate.dialect也可能是错误的

hibernate.dialect=org.hibernate.dialect.H2Dialect

java – simpleJdbcTemplate. – 插入和检索ID

java – simpleJdbcTemplate. – 插入和检索ID

我用simpleJdbcTemplate将数据放入数据库.
simpleJdbcTemplate.update("insert into TABLE values(default)");

我不想放任何数据,因为我不需要它用于我的单元测试目的.

如何从插入的行中获取id?我可以检索当前序列值,但如果其他人将执行插入,那么我将获得下一个序列值.

有没有办法使用simpleJdbcTemplate插入行并获取id?更新方法返回插入的行数,我想拥有id.谢谢您的帮助.

解决方法

你找到答案了吗?如果没有,请尝试使用SimpleJdbcInsert.
例如:
SimpleJdbcInsert sji = new SimpleJdbcInsert(dataSource)
    .withTableName(TableName)
    .usingColumns(new String[]{your columns})
    .usingGeneratedKeyColumns(you auto-increment id colums);

然后检索

sji.executeAndReturnKey(args).longValue();

java-使用jdbcTemplate分页

java-使用jdbcTemplate分页

我们现在面临的问题之一是处理从数据库中获得的大型ResultSet的分页.

当前,作为sql存储过程返回的行调用jdbcTemplate.query范围从100K到300K,并且分页是在extractData方法内完成的.

用户显示的页面只有20行.

这非常慢,有没有一种方法可以使用jdbcTemplate从存储过程的结果中获取数据页.

最佳答案
我相信JdbcTemplate没有用于分页的特定功能.但是,即使这样做也可能无法帮助您的代码更快地运行.

通常,面向用户页面的大小不超过200行,因此查询100-300K行似乎过多,浪费了大量内存.

您首先需要确定要使用哪种分页策略.两种常见的策略是查询前N个页面,并将其存储在临时缓存中-或仅查询足以填充一个页面大小(例如:200行),并且仅在用户请求时查询接下来的200行.

您还需要确定缓慢的真正原因是什么.行大小是一个因素,但不是唯一因素.您必须分析架构结构,索引,查询联接等.

请记住,在正常使用情况下-尽管您最多可以向用户展示10000个页面,但是典型用户不太可能浏览所有这些页面-也许只有前5-10个页面很重要-因此,如果您可以,将结果集限制为少量会更有意义

今天关于使用JdbcTemplate插入多行jdbctemplate执行多条insert的介绍到此结束,谢谢您的阅读,有关21JDBC_事务&JDBCTemplate、H2数据库:使用jdbcTemplate插入记录时,“ ID”列不允许NULL、java – simpleJdbcTemplate. – 插入和检索ID、java-使用jdbcTemplate分页等更多相关知识的信息可以在本站进行查询。

本文标签: