1.JdbcTemplateの基本的な知識
- JdbcTemplateはSpringの一部であり、jdbcでのデータベース操作のカプセル化です。リソースの確立と解放を処理します(接続を管理する必要はありません)。SQLステートメントを提供するだけで済みます(パラメーターを設定する必要はありません)。 )および結果の抽出(対応するエンティティクラスはクエリ時に直接返されるため、JDBCが使いやすくなります。
- JdbcTemplateは、Springの単射関数を使用して、データソースをJdbcTemplateに登録します。
- DataSourceは、JDBC2.0によって提供されるjavax.sql.DataSourceインターフェースであり、データベースとの接続の確立を担当します。アプリケーションでデータベースにアクセスする場合、データベースに接続するためのコードを記述する必要はありません。 DataSourceを直接参照して、データベースの接続オブジェクトを取得します。動作データ接続オブジェクトを取得するために使用します。
- 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完全な学習