Java8JdbcTemplateの一般的なメソッドの解釈

1.JdbcTemplateの基本的な知識

  1. JdbcTemplateはSpringの一部であり、jdbcでのデータベース操作のカプセル化です。リソースの確立と解放を処理します(接続を管理する必要はありません)。SQLステートメントを提供するだけで済みます(パラメーターを設定する必要はありません)。 )および結果の抽出(対応するエンティティクラスはクエリ時に直接返されるため、JDBCが使いやすくなります。
  2. JdbcTemplateは、Springの単射関数を使用して、データソースをJdbcTemplateに登録します。
  3. DataSourceは、JDBC2.0によって提供されるjavax.sql.DataSourceインターフェースであり、データベースとの接続の確立を担当します。アプリケーションでデータベースにアクセスする場合、データベースに接続するためのコードを記述する必要はありません。 DataSourceを直接参照して、データベースの接続オブジェクトを取得します。動作データ接続オブジェクトを取得するために使用します。
  4. JDBCに加えて、DataSourceオブジェクトがあります。データソースはデータソースと見なすことができ、データベースパラメータをカプセル化し、データベースに接続し、プログラム内のDataSourceオブジェクトを操作して、データベースを追加、削除、変更、およびチェックします。

異なるメソッドで使用されるDataSourceオブジェクトは異なります。次のようにリストされています。

1,DBCP框架

dbcp框架中的DataSource类是:org.apache.commons.dbcp.BasicDataSource

这是commons-dbcp.jar包中的类。

2,C3P0框架

c3p0框架的DataSource类是:com.mchange.v2.c3p0.ComboPooledDataSource

这是c3p0.jar包中的类。

3,MyBatis框架

MyBatis框架的DataSource类是:org.apache.ibatis.datasource.pooled.PooledDataSource

这是mybatis.jar包中的类。

2. SpringBootのJdbcTemplateの基本構成

a、pom.xmlファイルに依存関係を追加します

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

b、application.propertiesファイルでデータ情報を構成します

// secondary为我设置的第二数据库,如果是第一数据库省略该字段
// XXX.XXX.XXX.XXX为数据库的连接地址
spring.datasource.secondary.url =jdbc:sqlserver://XXX.XXX.XXX.XXX;database=cbhstmps
// 数据库的登录用户名
spring.datasource.secondary.username = XXX
// 数据库的登录密码
spring.datasource.secondary.password = XXXX
// sqlserver数据库的驱动
spring.datasource.driver-class-name = com.microsoft.sqlserver.jdbc.SQLServerDriver
// mysql数据库的驱动
spring.datasource.driver-class-name = com.mysql.jdbc.Driver
// Oracle数据库的驱动
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver

3.jdbcTmeplateのCrud操作

3.1 T queryForObject(String sql、Class requiredType)-値を返します

// 注意:参数requiredType只能是String,Integer这种类型,不能是自定义的实体类型,只能返回一个值,不能映射对象(映射对象下面会说)
public <T> T queryForObject(String sql, Class<T> requiredType) throws DataAccessException {
    
    
    return this.queryForObject(sql, this.getSingleColumnRowMapper(requiredType));
}

// 使用 
 int count = jdbcTemplate.queryForObject("select count(*) from AAA", Integer.class);

3.2 T queryForObject(String sql、Object [] args、Class requiredType)-値を返します

// 注入参数
public <T> T queryForObject(String sql, Object[] args, Class<T> requiredType) throws DataAccessException {
    
    
    return this.queryForObject(sql, args, this.getSingleColumnRowMapper(requiredType));
}
// 使用
String name = jdbcTemplate.queryForObject("select name from AAA where id =?",new Object[]{
    
    id}, String.class);

// 相关,设置了参数类型
T queryForObject(String sql, Object[] args, int[] argTypes, Class<T> requiredType)

3.3 T queryForObject(String sql、RowMapper rowMapper)-レコードの行を返し、レコードはオブジェクトに変換されます

 public void test() {
    
    
     String sql = "select name,age from work_steps where id = 110";
      WorkstepsEntity customer = jdbcTemplate.queryForObject(sql, new RowMapper<WorkstepsEntity>() {
    
    
          @Override
          public WorkstepsEntity mapRow(ResultSet rs, int i) throws SQLException {
    
    
              WorkstepsEntity works = new WorkstepsEntity();
              works.setName(rs.getString("name"));
              works.setAge(rs.getInt("age"));
              return works;
          }
      });
    }

3.4 T queryForObject(String sql、Object [] args、RowMapper rowMapper)-パラメーターを挿入し、レコードの行を返し、レコードをオブジェクトに変換します

 public void test() {
    
    
     String sql = "select name,age from work_steps where id = ?";
     String id = "100010";
      WorkstepsEntity customer = jdbcTemplate.queryForObject(sql,new Object[]{
    
    id}, new RowMapper<WorkstepsEntity>() {
    
    
          @Override
          public WorkstepsEntity mapRow(ResultSet rs, int i) throws SQLException {
    
    
              WorkstepsEntity works = new WorkstepsEntity();
              works.setName(rs.getString("name"));
              works.setAge(rs.getInt("age"));
              return works;
          }
      });
    }

3.5 List <Map <String、Object >> queryForList(String sql)-リストコレクションを返します。

public void test() {
    
    

		//如果Oracle用这个sql查询,返回的列名就是NAME(大写的),对应Map里面的key就是NAME
        String sql = "select name from test where id > 0";
        
        //如果用这个sql查询,返回的列名就是name(小写的),对应Map里面的key就是name
        String sql2 = "select name as \"name\" from test where id > 0";
        
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);//这里用的是第一个sql
    }

3.6 List <> queryForList(String sql、Class elementType)-指定されたデータ型のリストコレクションを返します。

public void test() {
    
    
        String sql = "select name from test where age > 18";
        List<String> list = jdbcTemplate.queryForList(sql,String.class);
    }

3.7 List <> queryForList(String sql、Object [] args、Class elementType)-指定されたデータ型のリストコレクションを返します。パラメータを設定できます

public void test() {
    
    
		String age="18";
        String sql = "select name from test where age > ?";
        List<String> list = jdbcTemplate.queryForList(sql,new Object[]{
    
    age},String.class);
    }

或者
public void test() {
    
    
		String age="18";
        String sql = "select * from test where age > ?";
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql,new Object[]{
    
    age});
    }

3.8 List <> query(String sql、RowMapper rowMapper)-リスト<object>を返します

public void test() {
    
    
    String sql = "select name,age from test where id > 10";
     List<CbhsXmftUnitmapEntity> list = jdbcTemplate.query(sql, new RowMapper<CbhsXmftUnitmapEntity>() {
    
    
         @Override
         public CbhsXmftUnitmapEntity mapRow(ResultSet rs, int rowNum) throws SQLException {
    
    
             //这里必须new对象,如果不new,而是使用同一个对象,会导致存入到List中的都是一样的对象(都是最后一个对象)。
             CbhsXmftUnitmapEntity cbhsXmftUnitmapEntity = new CbhsXmftUnitmapEntity();
             cbhsXmftUnitmapEntity.setName(rs.getString("name"));
             cbhsXmftUnitmapEntity.setAge(rs.getInt("age"));
             return cbhsXmftUnitmapEntity;
         }
     });
   }

補足:返したいエンティティクラスがたまたまクエリテーブルである場合

public void test() {
    
    
    String sql = "select * from test where id > 10";
     List<TestEntity> list = listpc=jdbcTemplate.query(sql ,new BeanPropertyRowMapper(TestEntity.class));
   }

3.9 List <Map <>> query(String sql、RowMapper rowMapper)-逆回一TTlist <Map <>>

public void test() {
    
    
     String sql = "select name,age from test where id > 10";
     List<Map<Integer,Object>> list = jdbcTemplate.query(sql, new RowMapper<Map<Integer,Object>>() {
    
    
         @Override
         public Map<Integer,Object> mapRow(ResultSet rs, int rowNum) throws SQLException {
    
    
             Map<Integer,Object> objectMap = new Map<Integer,Object>();
             objectMap.put(rowNum,rs.getString("name"));
             objectMap.put(rowNum,rs.getInt("age"));
             return objectMap;
         }
     });
   }

3.10 List <> query(String sql、PreparedStatementSetter pss、RowMapper rowMapper)-パラメータ化できるlist <object>を返します

public void test(final Integer id) {
    
    //参数也是局部变量,也必须用final修饰,内部类中才能访问(全局变量不用)
    String sql = "select name,age from test where id > ?";
      List<CbhsXmftUnitmapEntity> list = jdbcTemplate.query(sql, new PreparedStatementSetter() {
    
    
          @Override
          public void setValues(PreparedStatement ps)
                  throws SQLException {
    
    
              ps.setInt(1, id);
          }
      }, new RowMapper<CbhsXmftUnitmapEntity>() {
    
    
          @Override
          public CbhsXmftUnitmapEntity mapRow(ResultSet rs, int rowNum)
                  throws SQLException {
    
    
              CbhsXmftUnitmapEntity customer = new CbhsXmftUnitmapEntity();
              customer.setName(rs.getString("name"));
              customer.setAge(rs.getInt("age"));
              return customer;
          }
      });
   }

補足:カスタムリスト<Object []>データ型パラメーター

戻りデータはなく、SQLとパラメーターのみ

 String sql = "delete from CBHS_XMFT_COSTMODEL where unitcode=? and itemcode=? ";
 List<Object[]> delsqlList=new LinkedList<>();
 delsqlList.add(new String[]{
    
     list.get(i).get("unitcode").toString(), list.get(i).get("itemcode").toString() });
 delsqlList.add(new String[]{
    
      map.get("levelcode2").toString().trim() , list.get(i).get("itemcode").toString() });
 jdbcTemplate.batchUpdate(sql,delsqlList);
NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
sql="select id unitid,unitcode,unitname from UNIT_INF where 1=1 and unitcode in (:unitcodes) and ItemCode in ItemCodes";
HashMap<String, Object> paramObject = new HashMap<>();
paramObject.put("unitcodes",unitcodeslist);
paramObject.put("ItemCodes",itemcodeslist);
paramObject.put("clinicalcodes",clinicalcodeslist);
list=namedParameterJdbcTemplate.queryForList(sql,paramObject);

或者(使用注解的方式)

@Autowired
protected NamedParameterJdbcTemplate npJdbcTemplate;

sql="select id unitid,unitcode,unitname from UNIT_INF where 1=1 and unitcode in (:unitcodes) and ItemCode in ItemCodes";
HashMap<String, Object> paramObject = new HashMap<>();
paramObject.put("unitcodes",unitcodeslist);
paramObject.put("ItemCodes",itemcodeslist);
paramObject.put("clinicalcodes",clinicalcodeslist);
list=npJdbcTemplate.queryForList(sql,paramObject);

4.参照リンク:

JDBCTemplateの概要SpringBoot
データの永続性のための
JdbcTemplateJdbcTemplate完全な学習

おすすめ

転載: blog.csdn.net/qq_36636312/article/details/107561691