1. JDBC连接数据库的步骤
1、加载jdbc驱动程序;
2、提供JDBC连接的URL
2、创建数据库的连接;
3、创建preparedStatement;
4、执行SQL语句;
5、遍历结果集;
6、处理异常,关闭JDBC对象资源。
2. 实例
2.1创建数据库表 sys_role
2.2 编写配置文件 dbConfig.properties
jdbcDriver=com.mysql.cj.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai&autoReconnect=true
jdbcUser=root
jdbcPassword=123456
2.3 编写工具类 JdbcUtil.java
/**设置连接*/
public static Connection getConnection() throws Exception{
//读取配置文件中的4个基本信息
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("dbConfig.properties");
Properties pros = new Properties();
pros.load(inputStream);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
//加载区间
Class.forName(driverClass);
//获取连接
Connection conn = DriverManager.getConnection(url,user,password);
return conn;
}
/**关闭资源*/
public static void closeResoure (Connection conn,PreparedStatement ps){
try {
if(ps!=null) {
ps.close();
}
} catch (SQLException throwables) {
//
throwables.printStackTrace();
}
try {
if(conn!=null) {
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
/**重载一下关闭流,方便查询操作时使用*/
public static void closeResoure (Connection conn,PreparedStatement ps,ResultSet rs) {
try {
if(ps!=null) {
ps.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
if(conn!=null) {
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
if(rs!=null) {
rs.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
2.4 实现增删改查 JdbcTest.java
2.4.1 通用的增删改
因为通用,所以对应的SQL语句也会不同,所以我们需要传入不同的数据参数,所以需要利用一个字符串,将我们的SQL语句传入,因为我们采用的是PreparedStatement或者Statement来进行语句的编译,所以还需要填充占位符来进行传入。
/**通用的增删改操作*/
public void update(String sql,Object ...args) throws Exception {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
//填充占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1,args[ i ]);
}
//执行
ps.execute();
} catch (Exception e) {
System.out.println(e.getMessage());
}
JDBCUtils.closeResoure(conn,ps);
}
2.4.2 查询操作
1、对数据库进行连接
2、写sql语句(因为这个肯定也是需要自己编写sql语句进行操作的)
3、执行sql语句并得到返回值这里需要使用这个executeQuery()方法,因为它具有返回结果集的作用
4、对得到的结果集进行遍历输出处理
5、关闭资源
/**返回多条记录*/
public <T> List<T> getInstanceList(Class<T> tClass,String sql,Object...args){
Connection conn =null;
ResultSet rs =null;
PreparedStatement ps = null;
//创建集合对象
ArrayList<T> list = new ArrayList<>();
try{
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i+1,args[i]);
}
//执行获取结果集
rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
//获取列数
int columnCount = rsmd.getColumnCount();
while (rs.next()){
T t = tClass.newInstance();
for (int i = 0; i < columnCount; i++) {
//获取列值
Object columnValue = rs.getObject(i + 1);
//获取列的列名,不推荐使用
//String columnName = rsmd.getColumnName(i + 1);
//获取列的别名
String columnLable = rsmd.getColumnLabel(i + 1);
//利用反射为每一个对象进行赋值操作赋值
Field field = tClass.getDeclaredField(columnLable);
field.setAccessible(true);
field.set(t,columnValue);
}
list.add(t);
}
return list;
}catch (Exception e){
System.out.println(e.getMessage());
}finally {
try {
JDBCUtils.closeResoure(conn,ps,rs);
}catch (Exception e){
System.out.println(e.getMessage());
}
}
return null;
}
测试一下查询功能
@Test
public void testGetInstanceList(){
String sql = "select id,name from Customers where id < ?";
List<Customer> list = getInstanceList(Customer.class,sql,12);
list.forEach(System.out::println);
}