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
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) ); */
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视频