JdbcTemplate
注:本文不做技术交流贴,仅仅是学习笔记性质,如有繆误,敬请指正。
参考B站spring尚硅谷王泽老师的课,b站Druid视频分享坊老师的代码
JdbcTemplate的概念和相似代码
对jdbc的封装,封装增删改操作,这个类似于以下代码,下面程序直接新建一个BaseDao类就可以了
需要用到这个查询的类只需要对这个作为父类进行继承即可,注意更改Druid.properties。
附B站老师链接 https://www.bilibili.com/video/BV1qJ411X7Lu?p=14
package dao.lmpl;
import DRUID.DRUID;
import com.alibaba.druid.pool.DruidDataSource;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.*;
import java.util.regex.Pattern;
public class BaseDao {
/***
* idea加载的配置文件是在resource文件夹里面
*/
private static DataSource dataSource;
static {
System.out.println("nice");
try {
//加载配置文件
InputStream resourceAsStream= BaseDao.class.getClassLoader().getResourceAsStream("DRUID.properties");
Properties p = new Properties();
p.load(resourceAsStream);
//创建数据源对象
dataSource =new DruidDataSource();
//设置属性
DruidDataSource ds =(DruidDataSource)dataSource;
ds.setUrl(p.getProperty("url"));
ds.setPassword(p.getProperty("password"));
ds.setUsername(p.getProperty("username"));
ds.setInitialSize(new Integer(p.getProperty("initialSize")));
ds.setMaxActive(new Integer(p.getProperty("maxActive")));
ds.setMinIdle(new Integer(p.getProperty("minIdle")));
ds.setMaxWait(new Long(p.getProperty("maxWait")));
dataSource =ds;
System.out.println("创建连接池成功");
} catch (Exception e) {
throw new RuntimeException("创建连接池失败"+e.getMessage());
}
}
private Connection getConn(){
//获取连接
try {
return dataSource.getConnection();
} catch (Exception e) {
throw new RuntimeException("获取连接池失败"+e.getMessage());
}
}
public void closeAll(Statement st, ResultSet rs, Connection con) {
try {
if(st!=null) {
st.close();
}
if(rs!=null){
rs.close();
}
if(con!=null) {
//将连接还回池中
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/***
* 执行增删改操作
*/
public int executeUpdate(String sql,Object ... params){
Connection con = getConn();
PreparedStatement pst = null;
try {
pst = con.prepareStatement(sql);
//设置参数。若是模糊查询,先设置好再传递过来;若是日期,在sql中就使用to_date先写好。
for(int i = 0;i<params.length;i++) {
pst.setString(i+1,params[i]!=null?params[i].toString():null);
}
//执行sql语句
return pst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}finally{
closeAll(pst, null, con);//别忘记关闭
}
}
/**
* 统一查询一行的数据执行方法
* @param sql
* @param params
* @return 返回一个map,map的key是列名,value是查询的值String类型(查询出后自己转类型)
*/
public Map<String,String> queryRow(String sql, Object ... params){
Map<String,String> rsMap = null;
Connection con = getConn();
PreparedStatement pst = null;
ResultSet rs = null;
try {
pst = con.prepareStatement(sql);
//设置参数
for(int i = 0;i<params.length;i++) {
pst.setString(i+1,params[i]!=null?params[i].toString():null);
}
//执行sql语句
rs = pst.executeQuery();
if(rs.next()) {
rsMap = new HashMap<String, String>();
//查询列名
ResultSetMetaData metaData = rs.getMetaData();
//获取列的数量
int columnCount = metaData.getColumnCount();
for (int i = 1; i <=columnCount; i++) {
//查列名
String columnName = metaData.getColumnName(i);
rsMap.put(columnName, rs.getString(columnName));
}
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}finally {
closeAll(pst, rs, con);
}
return rsMap;
}
/**
* 统一查询多行的数据执行方法
* @param sql
* @param params
* @return 返回一个map,map的key是列明,value是查询的值
*/
public List<Map<String,String>> queryList(String sql,Object ... params){
List<Map<String,String>> rsList = new ArrayList<Map<String,String>>();
Connection con = getConn();
PreparedStatement pst = null;
ResultSet rs = null;
try {
pst = con.prepareStatement(sql);
//设置参数
for(int i = 0;i<params.length;i++) {
pst.setString(i+1,params[i]!=null?params[i].toString():null);
}
//执行sql语句
System.out.println(sql);
rs = pst.executeQuery();
while(rs.next()) {
Map<String,String> rsMap = new HashMap<String, String>();
//查询列名
ResultSetMetaData metaData = rs.getMetaData();
//获取列的数量。从1开始。
int columnCount = metaData.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
//查列名
String columnName = metaData.getColumnName(i);
rsMap.put(columnName, rs.getString(columnName));
}
//将map添加到集合中
rsList.add(rsMap);
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}finally {
closeAll(pst, rs, con);
}
return rsList;
}
public static boolean isInteger(String str) {
Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
return pattern.matcher(str).matches();
}
/**
* 统一查询多行的数据执行方法
* @param sql
* @param
*
* @return 返回一个map,map的key是列明,value是查询的值
*/
public List<Map<String,String>> queryListInt(String sql,String tittle , String author , int begin , int row){
List<Map<String,String>> rsList = new ArrayList<Map<String,String>>();
Connection con = getConn();
PreparedStatement pst = null;
ResultSet rs = null;
try {
pst = con.prepareStatement(sql);
//设置参数
pst.setString(1,tittle);
pst.setString(2,author);
pst.setInt(3,begin);
pst.setInt(4,row);
//执行sql语句
System.out.println(sql);
rs = pst.executeQuery();
while(rs.next()) {
Map<String,String> rsMap = new HashMap<String, String>();
//查询列名
ResultSetMetaData metaData = rs.getMetaData();
//获取列的数量。从1开始。
int columnCount = metaData.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
//查列名
String columnName = metaData.getColumnName(i);
rsMap.put(columnName, rs.getString(columnName));
}
//将map添加到集合中
rsList.add(rsMap);
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}finally {
closeAll(pst, rs, con);
}
return rsList;
}
}
spring里面的JdbcTemplate的对象的使用
1. (1)在bean里面配置对象
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入 dataSource-->
<property name="dataSource" ref="dataSource"></property> </bean>
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="jdbc:mysql:///user_db" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
</bean>
(2)创建 service 类,创建 dao 类,在 dao 注入 jdbcTemplate 对象 *
配置文件 <!-- 组件扫描 --> <context:component-scan
base-package="com.atguigu"></context:component-scan>
Service里面用@Service
service里面的对象用@Autowired
@Service
public class BookService {
//注入 dao
@Autowired
private BookDao bookDao;
}
@Repository
public class BookDaoImpl implements BookDao {
//注入 JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
}
实体类里面要添加set方法
JdbcTemplet的增删改操作
1. 增加 update(sql,预编译的参数)
2. 修改 update(sql,预编译的参数)
3. 删除 update(sql,预编译的参数)
JdbcTemplet的查询操作
1. 查询单行 J.queryForObject(sql, 相应的类名.class)
返回是int ---> Integer
String --->String.class
2.返回java bean 对象=J.queryForObject( sql,BeanPropertyRowMapper<对象>(对象.class))
3.返回集合List<Book> bookList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));
注:query方法里面有三个参数第一个是sql语句
第二个是RowMapper<>接口,需要加入相应返回的java bean对象类
第三个是预编译的变量,(可以不用预编译的对象)
4.批量增删改 batchupdate
数组:list<Object[]> batchiupdate(sql, list<Object[] >对象) //sql里面要有预编译