如果读者需要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
注意&修改为&,否则会有红线报错。
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);
}
}