Java学习笔记(十三):JDBC

写在前面:

使用数据库连接池技术Druid封装工具类,使用Spring JDBC进行增删改查操作

jdbcTemplate.update(sqlDML,占位符参数列表)
jdbcTemplate.queryForMap(sqlDQL,占位符参数列表)
jdbcTemplate.queryForList(sqlDQL,占位符参数列表)
jdbcTemplate.queryForObject(sqlDQL,返回值类型.class)    执行聚合函数
jdbcTemplate.query(sqlDQL, new BeanPropertyRowMapper<类>(类.class) ,占位符参数列表)
String sqlDQL = "select id,name from stu where id=?";
Map<String, Object> map = jdbcTemplate.queryForMap(sqlDQL, 2);
System.out.println(map);

1. 一些基础知识

JDBC:

Java数据库连接

定义了一套操锁所有关系型数据库的规则(接口)

每种关系型数据库有一种自己的实现类(驱动jar包)

mysql驱动包下载和简单连接:

https://blog.csdn.net/poppy_rain/article/details/97327601

2. JDBC 对象

DriverManager:驱动管理

1. 注册驱动代码:Class.forname("com.mysql.jdbc.Driver");

//Driver源码:DriverManager.registerDriver 注册驱动
    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }

          mysql5之后可以不写注册驱动的代码,因为文件java.sql.Driver中写了驱动

2. 获取连接对象:

Connection connection = DriverManager.getConnection(url, user, password);
//url=jdbc:mysql://localhost:3306/student

 

Connection:数据库连接

获取执行sql对象:conn.createStatement();   或者   conn.prepareStatement(sql);

管理事务:setAutoCommit(false);commit();rollback();

                   连接之后开启事务;执行完提交;catch中回滚;

 

Statement:执行sql

静态sql,参数都是给定值

boolean  execute(sql)   //任意sql

int  executeUpdate(sql)   //增删改,返回影响的行数,>0成功;数据库和表的操作,返回值0

ResultSet executeQuery(sql)   //查找,返回结果集

SQL注入问题:在拼接字符串时,有一些特殊字符与字符串拼接会造成安全问题

 

ResultSet:结果集,封装查询结果

next()   //游标向下移动一行(默认在第一行之前),返回boolean

getInt (参数)   //getInt,getString等;参数:int表示从1开始的列编号,String表示列名称

 

PreparedStatement:执行sql(预编译)

解决SQL注入问题:参数使用‘ ? ’作为占位符

步骤如下:

            //连接
            conn = JDBCUtil.getConnection();
            //sql
            String sql="select * from stu where name = ?";
            //获取 执行sql对象
            prst = conn.prepareStatement(sql);
            //占位符赋值
            prst.setString(1,"小贝");//第一个参数:第几个占位符;第二个参数:占位符处参数值
            //执行sql
            rs = prst.executeQuery();

 

3. 数据库连接池:存放数据库连接的容器

基本信息:

获取连接是像底层申请资源

系统初始化好后,容器被创建,容器中会申请一些连接对象,用户访问数据库时从容器中获取对象,用完放回容器

提高效率,节约资源

 

DataSource 接口:

驱动厂商提供实现类

在javax.sql包中

获取连接:getConnection()

放回容器:conn.close()   如果连接是从数据库连接池中获取的,则调用close不是关闭,而是归还

 

数据库连接池的实现技术---c3p0:

导jar包:c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar

定义配置文件:c3p0.properties 或 c3p0-config.xml;放在src下

<c3p0-config>
    <!-- 使用默认的配置读取连接池对象 -->
    <default-config>
        <!--  连接参数 -->
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/student</property>
        <property name="user">root</property>
        <property name="password">root.123</property>

        <!-- 连接池参数 -->
        <property name="initialPoolSize">5</property> <!-- 初始化连接数量 -->
        <property name="maxPoolSize">10</property> <!-- 最大连接数量 -->
        <property name="checkoutTimeout">3000</property>
    </default-config>

    <!--指定名称的方法连接-->
    <named-config name="otherc3p0">
        <!--  连接参数 -->
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/student</property>
        <property name="user">root</property>
        <property name="password">root.123</property>

        <!-- 连接池参数 -->
        <property name="initialPoolSize">10</property>
        <property name="maxPoolSize">30</property>
        <property name="checkoutTimeout">1000</property>
    </named-config>
</c3p0-config>

使用:

        //创建数据库连接池对象
        DataSource ds = new ComboPooledDataSource();
        //获取1个连接
        conn = ds.getConnection();

数据库连接池实现技术---Druid:

导jar包:druid-1.0.9.jar

配置文件:xxx.properties  任意名称任意位置

url=jdbc:mysql://localhost:3306/student
username=root
password=root.123
//driverClassName=com.mysql.jdbc.Driver
driverClassName=com.mysql.cj.jdbc.Driver
initialSize=5
maxActive=10
maxWait=3000

使用:

    public void druidTest(){
        Connection conn=null;
        PreparedStatement ps = null;
        ResultSet rs=null;

        try {
            conn=DruidUtil.getConnection();
            String sql="select * from stu where name=?";
            ps = conn.prepareStatement(sql);
            ps.setString(1,"小贝");
            rs=ps.executeQuery();
            while(rs.next()){
                System.out.println(rs.getInt("id")+rs.getString("name"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DruidUtil.close(rs,ps,conn);
        }
    }
//工具类

public class DruidUtil {
    private static DataSource ds;

    static {
        try {
            InputStream is = DruidUtil.class.getClassLoader().getResourceAsStream("druid.properties");
            Properties properties=new Properties();
            properties.load(is);

            ds= DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    //获取连接池
    public static DataSource getDataSource() {
        return ds;
    }

    //获取连接
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
    //释放资源
    public static void close(ResultSet rs, Statement st,Connection conn){
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //释放资源
    public static void close(Statement st,Connection conn){
        close(null,st,conn);
    }
}

4. Spring JDBC

基本信息:

Spring框架对JDBC的简单封装

提供了JDBCTemplate对象,简化JDBC开发

不需要申请连接,不需要释放资源,内部都做了封装

 

导jar包:

执行增删改语句:

jdbcTemplate.update(sqlDML,参数1, 参数2.....);  //参数依次写入占位符对应的值

执行查找语句:

queryForMap(sqlDQL, 参数1, 参数2.....);  //结果集一条,将查询结果放入Map;返回值:Map<字段名,字段值>

queryForList(sqlDQL, 参数1, 参数2.....);  //结果集多条,将查询结果放入List;返回值:List<Map<k,v>>

query(sqlDQL, new BeanPropertyRowMapper<类>(类.class));  //将查询结果放入JavaBean对象;返回值:List<类>

           ⚠️基本数据类型(int、double等)不能接受null,所以采用封装类型(Integer、Double等)

queryForObject(sqlDQL, 返回值类型.class);  //一般执行聚合函数

使用:(依赖Druid工具类)

    public void springJDBCTest(){
        JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidUtil.getDataSource());
        try {
            //数据库操作:增删改
            String sqlDML = "insert into stu(id,name) values(?,?)";
            int i = jdbcTemplate.update(sqlDML, 5, "小红");
            System.out.println(i); //输出:1

            //数据库操作:查找
            String sqlDQL = "select id,name from stu where id=?";
            Map<String, Object> map = jdbcTemplate.queryForMap(sqlDQL, 2);
            System.out.println(map); //输出:{id=2, name=小贝}

            sqlDQL = "select id,name from stu where id != ?";
            List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sqlDQL, 2);
            System.out.println(mapList); //输出:[{id=1, name=小黑}, {id=3, name=小灰}, {id=4, name=小火}, {id=5, name=小红}]

            List<Student> studentList = jdbcTemplate.query(sqlDQL, new BeanPropertyRowMapper<Student>(Student.class),2);
            System.out.println(studentList); //输出:[Student{id=1, name='小黑'}, Student{id=3, name='小灰'}, Student{id=4, name='小火'}, Student{id=5, name='小红'}]

            sqlDQL = "select count(id) from stu";
            int n = jdbcTemplate.queryForObject(sqlDQL, Integer.class);
            System.out.println(n); //输出:5

        }catch (Exception e){
            e.printStackTrace();
        }
    }
public class Student {
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
发布了97 篇原创文章 · 获赞 52 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/poppy_rain/article/details/98239098