Spring第三弹JdbcTemplate

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里面要有预编译
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值