JDBC操作数据库

原生的JDBC操作数据库(mysql)

1.mysql-connector-java-5.1.45-bin.jar

2.建一个lib文件夹,把jar包粘贴到lib里面,然后把这个jar包变成小奶瓶即可

@Test
	public void insertUser() throws Exception {
		 // 1.导入驱动包
         // a.mysql-connector-java-5.1.45-bin.jar
         //b.建一个lib文件夹,把jar包粘贴到lib里面,然后把这个jar包变成小奶瓶即可
		 // 2.加载驱动
		Class.forName("com.mysql.jdbc.Driver");
		// 3.铺管道(建立java -mysql的连接)
          Connection conn =          DriverManager.getConnection("jdbc:mysql://localhost:3306/test01", "root", "root");
		// 4.将sql 装车
		String sql = "INSERT INTO USER SET NAME='aa',pwd='123';";
		Statement st = conn.createStatement();
		// 5.将sql发送到数据库
		int executeUpdate = st.executeUpdate(sql);
		if (executeUpdate >= 1) {
			System.out.println("插入成功!!");
		} else {
			System.out.println("插入失败");
		}
		// 6.释放资源
		st.close();
		conn.close();
	}

第二种连接数据库方式

JDBC:

java databases connectivity java数据库连接,用java操作关系型数据库的规则

本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。

jdbc控制事务

1.事务:一个包含多个步骤的业务操作。如果这个业务被事务管理,则这个步骤要么同时成功,要么同时失败。

2.操作:

1.开启事务 setAutoCommit(boolean autocommit) 调用该方法设置参数为false,即开启事务 在执行sql前开启事务
2.提交事务 commit(); 执行完所有sql是提交事务
3.回滚事务 rollback(); 在catch中回滚事务

3.使用connection来管理事务

jdbc连接池 解释原理

public static void main(String[] args) throws Exception {
//		for(int i = 0;i<100;i++) {
//			Class.forName(driver);
//			conn = DriverManager.getConnection(url, username, password);
//		}
		//一次性批量产生N个连接,也就是连接池。。。connection pool
		//生产一个连接,我可以这么整?
		
//		Class.forName("com.mysql.jdbc.Driver");
//		Connection lianjie1 = DriverManager.getConnection("jdbc:mysql://localhost:3306/company?characterEncoding=utf8", "root", "123456");
		
		//如果在一个高并发环境下,用户访问人数众多,显示,连接创建是不够。。。所以,我们应该事先 一次性产生多个连接对象,这样,可以一次性供多个用户同时访问
		//如果是我们自己写,肯定这么搞:
		
//		List<Connection> conns = new ArrayList<Connection>();
//		for(int i = 0;i<100;i++) {
//			Class.forName("com.mysql.jdbc.Driver");
//			Connection lianjie = DriverManager.getConnection("jdbc:mysql://localhost:3306/company?characterEncoding=utf8", "root", "123456");
//			
//			conns.add(lianjie);
//		}
		
		
		//现在好了,我们用第三方连接池,比如阿里连接池druid。。。。其它的还有很多c3p0,dbcp...
		/**
		 * 1.加入连接池的jar包
		 * 2.实例化连接池对象DruidDataSource(数据源)
		 * 
		 */
		DruidDataSource dataSource = new DruidDataSource();
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUrl("jdbc:mysql://localhost:3306/company?characterEncoding=utf8");
		dataSource.setUsername("root");
		dataSource.setPassword("123456");
		dataSource.setInitialSize(10);//初始化10个连接对象
		dataSource.setMaxActive(100);//最大保持100个连接
		
		//得到连接
		for(int i = 0;i<10;i++) {
			DruidPooledConnection conn = dataSource.getConnection();
			System.out.println(conn.isClosed());
		}
		
	}

配置文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db100?characterEncoding=utf8
username=root
password=root

工具类

package com.qs.util;

import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;

/**
 * @author杨忠荣
 * @date 2021年5月10日 下午1:43:28
 */
public abstract class JDBCUtil {
	private static String driver;//用于存储加载驱动
	private static String url;//用于存储URL
	private static String username;//用于存储数据库账户
	private static String password;//用于存储数据库密码
	private static PreparedStatement ps = null;//声明预编译执行对象
	private static Connection conn = null;//声明连接对象
	private static DruidDataSource dds = null;//声明连接池数据源对象
	//使用静态块的原因是因为静态块最先执行,只执行一次,而且是最先执行的,随着类的加载而加载,刚好登录也是登录数据库一次即可连接数据库,不用重复登录
	static {
		try {
			Properties pop = new Properties();//使用高级流读取配置文件
			InputStream is;
			is = new FileInputStream("src/jdbc.properties");
			pop.load(is);
			driver = pop.getProperty("driver");//通过文件properties等号左边的键来获取等号右边的值,然后就想赋值
			Class.forName(driver);通过文件properties等号左边的键来获取等号右边的值,然后就想赋值,并加载驱动
			url = pop.getProperty("url");//通过文件properties等号左边的键来获取等号右边的值,然后就想赋值
			username = pop.getProperty("username");//通过文件properties等号左边的键来获取等号右边的值,然后就想赋值
			password = pop.getProperty("password");//通过文件properties等号左边的键来获取等号右边的值,然后就想赋值
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	// 普通的获取连接
	public static Connection getconn() {
		try {
			conn = DriverManager.getConnection(url, username, password);//把从文件中读取到的三个参数传入方法中,然后获取连接
			return conn;//返回获取到的连接对象
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	// 用连接池进行连接池
	public static DruidPooledConnection getDruidcon() {
		dds = new DruidDataSource();//先实例化一个Druid的连接池数据源对象
		dds.setDriverClassName(driver);//设置这个对象的值,使用静态块中读取的driver赋值给dds的ClassName
		dds.setUrl(url);//设置这个对象的url的值,使用静态块中读取的url赋值给dds的url
		dds.setUsername(username);//设置这个对象的username的值,使用静态块中读取的username赋值给dds的username
		dds.setPassword(password);//设置这个对象的password的值,使用静态块中读取的password赋值给dds的password
        dds.setInitialSize(10);//初始化10个连接对象
		dds.setMaxActive(100);//最大保持100个连接
		try {
			return dds.getConnection();//返回连接池连接对象DruidPooledConnection 类型
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;

	}

	// 普通连接获取预编译执行对象
	public static PreparedStatement getPropStame(String sql) {
		if (ps == null) {
			try {
				ps = getconn().prepareStatement(sql);
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return ps;
	}

	// 连接池获取预编译执行对象
	public static PreparedStatement getDruidPropStame(String sql) {
		if (ps == null) {
			try {
				ps = getDruidcon().prepareStatement(sql);
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return ps;
	}

	// 普通的jdbc 增删改关闭连接
	public static void closeConn(PreparedStatement ps, Connection conn) {
		if (ps != null) {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}

	// 普通的jdbc 查询关闭连接
	public static void closeQueryConn(ResultSet rs, PreparedStatement ps, Connection conn) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (ps != null) {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}

	// 连接池关闭连接,其实不是真正的关闭连接,而是把连接返回给连接池
	public static void closeDruidConn(PreparedStatement ps, DruidPooledConnection dds) {
		if (ps != null) {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (dds != null) {
			try {
				dds.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}

第三种连接方式

public class DSUtil {
	private static DruidDataSource dataSource = new DruidDataSource();
	
	// 返回DataSource
	public static DruidDataSource getDataSource() {
		dataSource.setUrl("jdbc:mysql://localhost:3306/company?characterEncoding=utf8");
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUsername("root");
		dataSource.setPassword("root");
		return dataSource;
	}

}

blic class UsersDaoImpl implements UsersDao {
    private QueryRunner runner = new QueryRunner(DSUtil.getDataSource());

    @Override//重写登录的方法
    public Users checkLogin(Users users) {
        try {
            return runner.query("select * from tb_users where userid=? and pwd=?", new BeanHandler<Users>(Users.class), users.getUserid(), users.getPwd());
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }

    @Override//重写分页的方法
    public List<Users> findAll(int offset,int pageNumber) {
        try {
            return runner.query("select * from tb_users limit ?,?",new BeanListHandler<Users>(Users.class),offset,pageNumber);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }

    @Override//获取总页数
    public int getPage() {
        try {
            return ((Long)runner.query("select count(*) from tb_users",new ScalarHandler())).intValue();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return 0;
    }

    @Override//重写一个删除的方法
    public boolean delete(String id) {
        try {
            return runner.update("delete  from tb_users where userid=?",id)>0;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return false;
    }
}












  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值