【黑马JDBC】C3P0、Druid、实体类、JDBC工具类、JDBCTemplate

如果读者需要C3P0、Druid、JDBC、Spring的jar包、配置文件等可以加博主qq2287015934免费发给你。

数据库连接池:
数据库连接池是一个容器,里面是许多个conn连接对象,用完后归还到连接池中。

C3P0
1.新建空项目并在项目下新建模块
2.新建libs目录,导入c3p0 mchange mysql-connector的jar包
3.将libs目录add as library
4.在src下导入c3p0-config.xml,将数据库名修改为你想要的,如果mysql-connector版本为8,url为
jdbc:mysql://localhost:3306/db4?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone = GMT 注意&修改为&amp,否则会有红线报错。
5.在src下新建类,实例化数据库连接对象ds,获取conn

DataSource ds=new ComboPooledDataSource();
Connection conn = ds.getConnection();

6.归还conn,conn.close();

Druid
1.写Druid.properties(新建个file,命名为这个)
2.导入druid-1.0.9.jar
3.新建java类
4.获取连接

    Properties pro=new Properties();
    InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
    pro.load(is);
    DataSource ds = DruidDataSourceFactory.createDataSource(pro);
    Connection conn = ds.getConnection();

实体类
实体类是一种特殊类,这种类对应一个实体,如学生。实体类的变量是实体的属性,方法是get和set,用来获取实体数据或者设置实体数据。
实体类的一个对象对应数据库中的一条记录,对象的成员对应记录中某字段的值。
下面是一个实体类Emp(名称不重要,随便起的)。

/**
 * 这是一个实体类,映射学生这个实体,相当于表中的一条记录。
 * 对于每个变量,有set和get方法。
 */

public class Emp {
    private Integer stuid;
    private String stuname;
    private Integer stuage;

    public Integer getStuid() {
        return stuid;
    }

    public void setStuid(Integer stuid) {
        this.stuid = stuid;
    }

    public String getStuname() {
        return stuname;
    }

    public void setStuname(String stuname) {
        this.stuname = stuname;
    }

    public Integer getStuage() {
        return stuage;
    }

    public void setStuage(Integer stuage) {
        this.stuage = stuage;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "stuid=" + stuid +
                ", stuname='" + stuname + '\'' +
                ", stuage=" + stuage +
                '}';
    }
}

JDBC工具类

//JDBC工具类
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * JDBCUtils的方法:
 * 1.getConnection
 * 2.getDataSource
 * 3.close(res,stmt,conn)
 * 4.close(stmt,conn)
 */

public class JDBCUtils {
    private static DataSource ds;
    static  {
        try {
            Properties pro=new Properties();
            InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
            pro.load(is);
            ds= DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnection() throws Exception{
        return ds.getConnection();
    }
    public static void close(Statement stmt,Connection conn) {
       close(null,stmt,conn);
    }
    public static void close(ResultSet res,Statement stmt, Connection conn) {
        if(res!=null)
            try {
                res.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        if(stmt!=null)
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        if(conn!=null)
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
    }
    public static DataSource getDataSource(){
        return ds;
    }
}

C3P0示例程序,功能是获取连接并输出。


import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
//这里类名是C3P0Demo1,demo2就不贴出来了,和demo1类似。
public class C3P0Demo1 {
    public static void main(String[] args) throws SQLException {
        //数据库连接对象
        DataSource ds=new ComboPooledDataSource();
        Connection conn = ds.getConnection();
        System.out.println(conn);
    }
}

Druid演示程序
将数据插入account表中


import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;

public class DruidDemo2 {
    public static void main(String[] args) {
        /**
         * 功能:利用连接池完成增加数据的操作。
         */
        Connection conn=null;
        PreparedStatement pstmt=null;
        try {
            conn = JDBCUtils.getConnection();
            String sql="insert into account values(null,?,?)";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,"王五");
            pstmt.setString(2,"3000");
            int count = pstmt.executeUpdate();
            System.out.println(count);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(pstmt,conn);
        }
    }
}

JDBCTemplate
JDBCTemplate是Spring框架中的一个技术,意在减少书写的代码,保留核心的sql和执行sql的语句。
下面有两个Demo程序,程序的功能和注意点写了注释。

import org.springframework.jdbc.core.JdbcTemplate;

public class JDBCTemplateDemo1 {
    public static void main(String[] args) {
        /**
         * 功能:通过JDBCTemplate来更新表
         */
        JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());
        String sql="update account set balance=5000 where id=?";
        int count = jdbcTemplate.update(sql, 3);
        System.out.println(count);
    }
}
import org.junit.Test;
//junit单元测试的jar包,记得加
//写单元测试@Test后点击左侧按钮将其加入classpath
import org.springframework.jdbc.core.BeanPropertyRowMapper;
//BeanPropertyRowMapper包 可以来执行query方法
import org.springframework.jdbc.core.JdbcTemplate;
//导入模板类jar包
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * 注意点:
 * 1.JDBCTemplate属于Spring框架,因此使用前需要导入相应jar包
 * 2.在用数据库连接池对象ds(JDBCUtils提供)实例化后可以直接调用方法执行sql获取数据。
 *
 * 程序功能:
 * test1:更新记录----------------------------update
 * test2:插入记录----------------------------update
 * test3:删除记录----------------------------update
 * test4:查询记录,放入map-------------------queryForMap
 * test5:查询记录,放入map,所有map组成list--queryForList
 * test6:查询所有记录,放入list--------------query、RowMapper<Emp>
 * test6_2:查询所有记录,放入list------------query、BeanPropertyRowMapper<Emp>
 * test7:查询一共有多少条记录----------------queryForObject、Long.class
 */

public class JDBCTemplateDemo2 {
     //new一个JdbcTemplate实例,获取连接。
     private JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());
     //将JUnit添加到ClassPath,直接点击左侧按钮就可以进行单元测试。

     @Test
     public void test1(){
          String sql="update account set balance =15 where id=1";//更新
          int count=jdbcTemplate.update(sql);//将sql给jdbcTemplate执行
          System.out.println(count);
     }
     @Test
     public void test2(){
          String sql="insert into account(id,NAME ) values(?,?)";//插入
          int count=jdbcTemplate.update(sql,1015,"郭靖");//参数写sql,后面依次给问号填空
          System.out.println(count);
     }
     @Test
     public void test3(){
          String sql="delete from account where id=?";//删除
          int count=jdbcTemplate.update(sql,1015);//参数sql,给id填空1015
          System.out.println(count);
     }


      // 将sql查到的放到map里,一次放一个,好像没什么卵用。
     @Test
     public void test4(){
          String sql="select *from account where balance=?";//执行查询操作
          Map<String,Object> map=jdbcTemplate.queryForMap(sql,15);//Method:queryForMap
          System.out.println(map);
     }

     //将sql查到的放到map里,map组成list,因此可以放多个
     @Test
     public void test5(){
          String sql="select *from account";//执行查询操作
          List<Map<String,Object>> list=jdbcTemplate.queryForList(sql);//queryForList
          for (Map<String, Object> stringObjectMap : list) {
               System.out.println(stringObjectMap);
          }
     }

     //将表中的内容全部放入list中,并输出
     @Test
     public void test6(){
          //执行查询操作
          String sql="select *from student";
          //将jdbcTemplate查询到的内容全部放入list中,实现RowMapper<Emp>抽象类
          List<Emp> list = jdbcTemplate.query(sql, new RowMapper<Emp>() {
               @Override
               public Emp mapRow(ResultSet res,int i) throws SQLException {
                    Emp emp = new Emp();//new出一个Emp实例
                    //使用结果集获取数据
                    int stuid = res.getInt("stuid");
                    String stuname = res.getString("stuname");
                    int stuage = res.getInt("stuage");
                    emp.setStuname(stuname);
                    emp.setStuage(stuage);
                    emp.setStuid(stuid);
                    return emp;
               }
          });
          for (Emp emp : list) {
               System.out.println(emp);
          }
     }

     //使用BeanPropertyRowMapper<Emp>将sql查询到的所有内容放入list
     @Test
     public void test6_2(){
          String sql="select *from student";
          List<Emp> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
          for (Emp emp : list) {
               System.out.println(emp);
          }
     }

     //查询一共有多少条记录
     @Test
     public void test7(){
          String sql="select count(stuid) from student";
          Long total=jdbcTemplate.queryForObject(sql,Long.class);
          System.out.println(total);
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民真快落

我琢磨着也没人给我打赏呀。。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值