JDBC学习

Posted 学好编程不秃头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC学习相关的知识,希望对你有一定的参考价值。

JDBC

废话不多说–>
直接开始吧

先建立一个maven文件

JDBC需要引入依赖pom

mysql8.0以上版本引入

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.21</version>
</dependency>

mysql5.X版本引入

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.6</version>
</dependency>

需要更多依赖可以查看maven仓库
maven仓库

    public static void main(String[] args) throws ClassNotFoundException, SQLException 
        String user ="root";
        String password ="root1234";
        String url ="jdbc:mysql://localhost:3306/girls";
        //可能由于数据库的问题会出现时区问题
        //如果出现时区问题在url后加上?serverTimezone=Asia/Shanghai
        String driverClass = "com.mysql.cj.jdbc.Driver";  //此驱动为8.0以上版本
        Class.forName(driverClass);   //加载驱动
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);
    

出现时区报错记得在url后加上?serverTimezone=Asia/Shanghai

正常没问题就会输出了…

这只是第一种方法不推荐使用

因为sql的账号与密码与java代码耦合了

解决方案为提取一个properties文件

第一步:
创建一个mysql.properties文件

user=root
password=root1234
url=jdbc:mysql://localhost:3306/girls?serverTimezone=Asia/Shanghai
driverClass=com.mysql.cj.jdbc.Driver

Ps:注意在=的两边不能有空格哦!!!

    public static void main(String[] args) throws Exception 
        InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mysql.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);
        System.out.println(conn);
    

最后由于频繁的连接数据库我们可以定义一个方法来直接获取连接
将方法定义为静态方法,可以用一个叫JDBCUtil的工具类直接控制连接与关闭

	public static Connection getConnection() throws Exception 
		// 1.读取配置文件中的4个基本信息
		InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("mysql.properties");
		Properties pros = new Properties();
		pros.load(is);
		String user = pros.getProperty("user");
		String password = pros.getProperty("password");
		String url = pros.getProperty("url");
		String driverClass = pros.getProperty("driverClass");
		// 2.加载驱动
		Class.forName(driverClass);
		// 3.获取连接
		Connection conn = DriverManager.getConnection(url, user, password);
		return conn;
	

由于Statement接口可能会引起sql注入问题我们这里就不讲解了!

二.PreparedStatement的使用
我们可以使用PreparedStatement接口来解决sql注入问题

话不多说—直接上代码看

    public void update(String sql,Object ...args)
        Connection conn = null;
        PreparedStatement ps = null;
        try 
            //1.获取数据库的连接
            conn = JDBCUtil.getConnection();
            //2.预编译sql语句,返回PreparedStatement的实例
            ps = conn.prepareStatement(sql);
            //3.填充占位符
            for(int i = 0;i < args.length;i++)
                ps.setObject(i + 1, args[i]);//小心参数声明错误!!
            
            //4.执行
            ps.execute();
         catch (Exception e) 
            e.printStackTrace();
        finally
            //5.资源的关闭
            JDBCUtil.closeResource(conn, ps);
        
    

这代码参考尚硅谷康师傅

只需要传入简单的sql语句和参数就可以对数据库中的表进行操作
例如

    public static void main(String[] args) 
        String sql = "insert into admin values(?,?,?)";//?起到占位符的作用
        JDBC3 jdbc3 = new JDBC3();
        jdbc3.update(sql,3,"root","root1234"); //后面的数为填充占位符
    

对于这一个例子你们可能还不够看,接下来我的一位朋友盛情邀请要我用他的作业来示范:

    public static void main(String[] args) 
        String sql = "insert into student values(?,?,?,?,?,?,?)";
        JDBC3 jdbc3 = new JDBC3();
        jdbc3.update(sql,1,"0840111101","杨清舜","男","22","软件工程","红棉楼R250");
        jdbc3.update(sql,2,"0840111102","韦小钦","男","24","软件工程","红棉楼R250");
        jdbc3.update(sql,3,"0840111103","吴思浩","男","27","软件工程","红棉楼R250");
        jdbc3.update(sql,4,"0840111104","林俊明","男","25","软件工程","红棉楼R252");
        jdbc3.update(sql,5,"0840111108","李浩男","女","25","软件工程","红棉楼R255");
    

这样即可;
到这里你已经可以使用java对数据库进行简单的连接,关闭,已经对数据库表的操作,接下来一节课我会教如何将数据库的一条数据封装为一个java对象。那么下一节课见!!

public <T> List<T> getForList(Class<T> clazz,String sql, Object... args)
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		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
			ResultSetMetaData rsmd = rs.getMetaData();
			// 通过ResultSetMetaData获取结果集中的列数
			int columnCount = rsmd.getColumnCount();
			//创建集合对象
			ArrayList<T> list = new ArrayList<T>();
			while (rs.next()) 
				T t = clazz.newInstance();
				// 处理结果集一行数据中的每一个列:给t对象指定的属性赋值
				for (int i = 0; i < columnCount; i++) 
					// 获取列值
					Object columValue = rs.getObject(i + 1);

					// 获取每个列的列名
					// String columnName = rsmd.getColumnName(i + 1);
					String columnLabel = rsmd.getColumnLabel(i + 1);

					// 给t对象指定的columnName属性,赋值为columValue:通过反射
					Field field = clazz.getDeclaredField(columnLabel);
					field.setAccessible(true);
					field.set(t, columValue);
				
				list.add(t);
			
			
			return list;
		 catch (Exception e) 
			e.printStackTrace();
		 finally 
			JDBCUtils.closeResource(conn, ps, rs);

		

		return null;
	

以上是关于JDBC学习的主要内容,如果未能解决你的问题,请参考以下文章

tomcat7 - jdbc 数据源 - 这很可能会造成内存泄漏

sharding-jdbc源码学习简介

Spring框架学习六:Spring对JDBC的支持

试水国际前沿时尚 HIVE-showroom亮相广州

JAVA11-JDBC学习

关于JDBC学习过程中的注意事项(分享自己犯过的错误,写给初学JDBC的小伙伴的八条建议)