• Spring(三)——JDBC


    1.概念

    建立Java与MySQL的连接,在XML文件里配置显得更加灵活。(据说裸的JDBC很麻烦,没用过,具体也不清楚) 

    2.导包

    IOC的包+JdbcTemplate的+数据驱动和数据源的包,和AOP没有关系。

    • commons-logging
    • spring-beans
    • spring-context
    • spring-core
    • spring-expression(IOC)
    • spring-jdbc
    • spring-orm
    • spring-tx(JdbcTemplate)
    • druid(连接池,如果不用德鲁伊就用别的,下面会提到)
    • mysql-connector-java(数据驱动和数据源)

    3.在XML里配置数据库和数据源

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     4      
     5     xmlns:p="http://www.springframework.org/schema/p"
     6     xmlns:util="http://www.springframework.org/schema/util"
     7     xmlns:context="http://www.springframework.org/schema/context"
     8     xsi:schemaLocation="
     9     http://www.springframework.org/schema/beans 
    10      http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
    11      
    12      http://www.springframework.org/schema/util
    13      http://www.springframework.org/schema/util/spring-util.xsd
    14      
    15      http://www.springframework.org/schema/context 
    16      http://www.springframework.org/schema/context/spring-context-4.3.xsd
    17      ">
    18     
    19         
    20        <!-- 引入资源文件db.properties,以下两种方式选一种-->
    21        <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    22            <property name="Location" value="db.properties"></property>
    23        </bean>
    24        <!-- <context:property-placeholder location="db.properties"/> 
    25         -->
    26         
    27        <!-- 创建并通过外部资源文件配置数据源,这里用了德鲁伊的数据源,
    28        也可以用别的,例如org.springframework.jdbc.datasource.DriverManagerDataSource -->
    29        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    30            <property name="driverClassName" value="${jdbc.driverClassName}"></property>
    31            <property name="url" value="${jdbc.url}"></property>
    32            <property name="username" value="${jdbc.username}"></property>
    33            <property name="password" value="${jdbc.password}"></property>
    34        </bean>
    35        
    36        <!-- 通过数据源配置JdbcTemplate -->
    37        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    38            <property name="dataSource" ref="dataSource"></property><!-- 通过上面德鲁伊创建的数据源来 -->
    39        </bean>
    40    
    41 </beans>
    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/ssm
    jdbc.username=root
    jdbc.password=shoulinniao
    资源文件db.properties

    4.通过Java语言操作到MySQL数据库

    package com.atguigu.jdbctemplate;
    
    public class Emp {
    
        private Integer eid;
        private String ename;
        private Integer age;
        private String sex;
        public Integer getEid() {
            return eid;
        }
        public void setEid(Integer eid) {
            this.eid = eid;
        }
        public String getEname() {
            return ename;
        }
        public void setEname(String ename) {
            this.ename = ename;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        @Override
        public String toString() {
            return "Emp [eid=" + eid + ", ename=" + ename + ", age=" + age + ", sex=" + sex + "]";
        }
    
    }
    /*
    create table if not exists emp(
    eid int auto_increment primary key,
    ename varchar(20) ,
    age int ,
    sex varchar(10)
    );
    */
    Emp.java
        ApplicationContext ac=new ClassPathXmlApplicationContext("jdbc.xml");
        JdbcTemplate jdbcTemplate=ac.getBean("jdbcTemplate",JdbcTemplate.class);

    (1)通过execute(String sql)来执行建表和删表语句

        @Test
        public void create() {
            String sql="create table if not exists emp("
                    + "eid int auto_increment primary key,"
                    + "ename varchar(20) ,"
                    + "age int,"
                    + "sex varchar(10)" + 
                    ");";
            jdbcTemplate.execute(sql);
            System.out.println(sql);/*
            sql="drop table emp;";
            jdbcTemplate.execute(sql);
            System.out.println(sql);*/
        }

    (2)通过update()方法来对表中记录执行增、删、改的操作

    int update(String sql),直接写固定的一条语句,不用[?]之类的通配符,返回被影响的记录行数。例如

    jdbcTemplate.update("  insert into emp values(null,'张三',23,'男');  ");

    int update(String sql,Object args[0],Object args[1]...,Object args[n]),这个是用[?]替代数据,通过参数传递。

    String sql="insert into emp values(null,?,?,?) ";
    jdbcTemplate.update(sql,"李四",24,"男");

    如果想要插入多条记录,用Object类型的二维数组将记录存起来,再遍历插入,如下,即可以批量处理

            String sql="insert into emp values(null,?,?,?) ";
            Object[][] objects=new Object[3][3];
            objects[0][0]="王五";
            objects[0][1]=24;
            objects[0][2]="男";
            objects[1][0]="赵六";
            objects[1][1]=29;
            objects[1][2]="男";
            objects[2][0]="胜七";
            objects[2][1]=28;
            objects[2][2]="男";
            for(int i=0;i<objects.length;i++)
                jdbcTemplate.update(sql,objects[i][0],objects[i][1],objects[i][2]);

    String batchUpdate(String sql, ?),真批量处理,返回一个看不懂的东西。

    List<Object[]>list=new ArrayList<Object[]>();
    list.add(new Object[] {"王八",15,"男"});
    list.add(new Object[] {"老九",14,"女"});
    System.out.println(jdbcTemplate.batchUpdate(sql,list));//输出是[I@80ec1f8

    还有一个拼接操作,举例正面反面案例,具体原因暂不清楚,先记着,好记性不如烂笔头。

            /*错误写法,这样只会删除eid=1的语句
            String eid="1,2,3";
            String sql="delete from emp where eid in (?)";
            jdbcTemplate.update(sql,eid);
            */
            //正确写法
            String eid="1,2,3";
            String sql="delete from emp where eid in ("+eid+")";
            jdbcTemplate.update(sql);

    以上大概都是通过字符串拼接、替换实现。

    (3)query()用于查询表中记录,需要存储(不然查了干嘛?)

    RowMapper<Emp> map=new BeanPropertyRowMapper<Emp>(Emp.class);//这句代码是很重要,并且需要()加上Emp.class之类的东西,表示MySQL中表的列名/字段 与 Java中类的属性 建立映射关系。

    queryForObject()用于查询单行记录,应该很少用,记两个样例先

            RowMapper<Emp> map=new BeanPropertyRowMapper<Emp>(Emp.class);
            String sql=" select * from emp where eid=?";
            Emp emp=jdbcTemplate.queryForObject(sql,new Object[] {5},map);//eid=?改成eid>?就报错了,所以只能是单行记录
            System.out.println(emp);
            sql="select count(*) from emp ";
            System.out.println(jdbcTemplate.queryForObject(sql, Integer.class));
            //这里可以Integer改为String、double等,就是不能改为Emp这样的类,表示返回类型。

    List query(String sql,RowMapper map)返回一个结果集,可以包含多条记录

            RowMapper<Emp> map=new BeanPropertyRowMapper<Emp>(Emp.class);
            String sql=" select eid,ename,age from emp ";
            List<Emp> list=jdbcTemplate.query(sql, map);
            for(int i=0;i<list.size();i++)
                System.out.println(list.get(i));
            //输出:Emp [eid=4, ename=赵六, age=29, sex=null],sql语句中没有说要查sex所以是null

    学习资料:B站尚硅谷Spring视频

  • 相关阅读:
    cocos2dLua3.17.2当在出厂就为 Android11 Version30的手机上黑屏,无法运行的问题 qd
    cocos2dLua3.17.2 + AS3.5.2 创建工程成功 qd
    getdata软件的使用
    下载及安装Python详细步骤
    【硬件知识】电路图标识符号
    Java中高级开发工程师最新面试题整理
    jquery获得值和控制值
    js 根据日期做星座联动,简洁
    Android remove default apk
    registry collection: right click menu(右键菜单清理)/navigator pane(我的电脑左边栏清理)
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/12906569.html
Copyright © 2020-2023  润新知