Springboot 连接数据库
web项目连接数据库在之前以及发过,但是在springboot中又有了其他的一些操作,简化了连接过程
1.配置pom
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 添加jdbc与mysql --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
2.1.application.properties
spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=true spring.datasource.username=root spring.datasource.password=root
2.2.application.yml(作用同上)
spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=true username: root password: root
3.date.java
1 package com.example.Date; 2 3 public class Date { 4 private int id; 5 private String name; 6 private int age; 7 private String address; 8 9 public Date() { 10 11 } 12 public Date(int id,String name,int age,String address) { 13 super(); 14 this.id=id; 15 this.name=name; 16 this.age=age; 17 this.address=address; 18 } 19 public int getId() { 20 return id; 21 } 22 public void setId(int id) { 23 this.id = id; 24 } 25 public String getName() { 26 return name; 27 } 28 public void setName(String name) { 29 this.name = name; 30 } 31 public int getAge() { 32 return age; 33 } 34 public void setAge(int age) { 35 this.age = age; 36 } 37 public String getAddress() { 38 return address; 39 } 40 public void setAddress(String address) { 41 this.address = address; 42 } 43 @Override 44 public String toString() { 45 return "NewBean:[id=" + id + ", name=" + name + ", age=" + age + "address" + address + "]"; 46 } 47 }
4.启动类(连接数据库)
1 package com.example.Date; 2 3 import java.sql.*; 4 5 import javax.sql.DataSource; 6 7 import org.springframework.boot.SpringApplication; 8 import org.springframework.boot.autoconfigure.SpringBootApplication; 9 import org.springframework.context.ConfigurableApplicationContext; 10 11 12 @SpringBootApplication 13 public class DateApplication { 14 15 public static void main(String[] args) throws SQLException{ 16 ConfigurableApplicationContext context=SpringApplication.run(DateApplication.class, args); 17 DataSource ds=context.getBean(DataSource.class); 18 Connection connection = ds.getConnection(); 19 //System.out.println(connection.getCatalog()); 20 connection.close(); 21 } 22 }
5.控制类(数据库数据的增删改查)
1 package com.example.Date; 2 3 import java.util.Iterator; 4 import java.util.List; 5 import java.util.Map; 6 import java.util.Set; 7 import java.util.Map.Entry; 8 9 import org.springframework.beans.factory.annotation.Autowired; 10 import org.springframework.jdbc.core.JdbcTemplate; 11 import org.springframework.stereotype.Repository; 12 import org.springframework.web.bind.annotation.RequestMapping; 13 import org.springframework.web.bind.annotation.RestController; 14 15 @RestController 16 @Repository 17 @RequestMapping("Dao") 18 public class DateDao { 19 20 @Autowired 21 private JdbcTemplate jdbcTemplate; 22 23 @RequestMapping("add") 24 public String addDate(String name,int age,String address) { 25 String sql = "insert into person value(?,?,?,?)"; 26 //表结构:id(int、自增),name(varchar 10),age(int 10),address(varchar 10) 27 //int rows = jdbcTemplate.update(sql, null, name, age, address); 28 jdbcTemplate.update(sql, null, name, age, address); 29 return "数据添加成功"; 30 } 31 @RequestMapping("reduce") 32 public String reduceDate(String name) { 33 String sql = "DELETE FROM person WHERE name = ?"; 34 //表结构:id(int、自增),name(varchar 10),age(int 10),address(varchar 10) 35 //int rows = jdbcTemplate.update(sql, null, name, age, address); 36 jdbcTemplate.update(sql,name); 37 return "数据删除成功"; 38 } 39 40 @RequestMapping("changebyname") 41 public String changeDate(String name,String change) { 42 String sql ="UPDATE person SET name= ? WHERE name = ?"; 43 //jdbcTemplate.execute(sql); 44 jdbcTemplate.update(sql, change, name); 45 return "数据修改成功"; 46 } 47 48 @RequestMapping("findbyname") 49 public Date findDate(String name) { 50 String sql = "select * from person where name = ?"; 51 //新建MyRowMapper类实现RowMapper接口,重写mapRow方法,指定返回User对象 52 Date date = jdbcTemplate.queryForObject(sql, new MyRowMapper(), name); 53 return date; 54 } 55 56 @RequestMapping("find") 57 public List<Map<String, Object>> findDate() { 58 String sql = "select * from person"; 59 List<Map<String, Object>> list = jdbcTemplate.queryForList(sql); 60 for (Map<String, Object> map : list) { 61 Set<Entry<String, Object>> entries = map.entrySet( ); 62 if(entries != null) { 63 Iterator<Entry<String, Object>> iterator = entries.iterator( ); 64 while(iterator.hasNext( )) { 65 Entry<String, Object> entry =(Entry<String, Object>) iterator.next( ); 66 Object key = entry.getKey( ); 67 Object value = entry.getValue(); 68 System.out.println(key+":"+value); 69 } 70 } 71 } 72 return list; 73 } 74 }
6.实现RowMapper接口,返回Date对象(用于DAO中数据查询返回)
1 package com.example.Date; 2 3 import org.springframework.jdbc.core.RowMapper; 4 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 8 /** 9 * 实现RowMapper接口,返回Date对象 10 * */ 11 public class MyRowMapper implements RowMapper<Date>{ 12 13 @Override 14 public Date mapRow(ResultSet resultSet, int i) throws SQLException { 15 // 获取结果集中的数据 16 String name = resultSet.getString("name"); 17 int age = resultSet.getInt("age"); 18 String address = resultSet.getString("address"); 19 // 把数据封装成User对象 20 Date date = new Date(); 21 date.setName(name); 22 date.setAge(age); 23 date.setAddress(address); 24 return date; 25 } 26 }
附 :1. Spring JdbcTemplate方法详解
JdbcTemplate主要提供以下五类方法:
- execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
- update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
- query方法及queryForXXX方法:用于执行查询相关语句;
- call方法:用于执行存储过程、函数相关语句。
JdbcTemplate类支持的回调类:
- 预编译语句及存储过程创建回调:用于根据JdbcTemplate提供的连接创建相应的语句;
PreparedStatementCreator:通过回调获取JdbcTemplate提供的Connection,由用户使用该Conncetion创建相关的PreparedStatement;
CallableStatementCreator:通过回调获取JdbcTemplate提供的Connection,由用户使用该Conncetion创建相关的CallableStatement;
- 预编译语句设值回调:用于给预编译语句相应参数设值;
PreparedStatementSetter:通过回调获取JdbcTemplate提供的PreparedStatement,由用户来对相应的预编译语句相应参数设值;
BatchPreparedStatementSetter:;类似于PreparedStatementSetter,但用于批处理,需要指定批处理大小;
- 自定义功能回调:提供给用户一个扩展点,用户可以在指定类型的扩展点执行任何数量需要的操作;
ConnectionCallback:通过回调获取JdbcTemplate提供的Connection,用户可在该Connection执行任何数量的操作;
StatementCallback:通过回调获取JdbcTemplate提供的Statement,用户可以在该Statement执行任何数量的操作;
PreparedStatementCallback:通过回调获取JdbcTemplate提供的PreparedStatement,用户可以在该PreparedStatement执行任何数量的操作;
CallableStatementCallback:通过回调获取JdbcTemplate提供的CallableStatement,用户可以在该CallableStatement执行任何数量的操作;
- 结果集处理回调:通过回调处理ResultSet或将ResultSet转换为需要的形式;
RowMapper:用于将结果集每行数据转换为需要的类型,用户需实现方法mapRow(ResultSet rs, int rowNum)来完成将每行数据转换为相应的类型。
RowCallbackHandler:用于处理ResultSet的每一行结果,用户需实现方法processRow(ResultSet rs)来完成处理,在该回调方法中无需执行rs.next(),该操作由JdbcTemplate来执行,用户只需按行获取数据然后处理即可。
ResultSetExtractor:用于结果集数据提取,用户需实现方法extractData(ResultSet rs)来处理结果集,用户必须处理整个结果集;
2. getJdbcTemplate中execute和update的区别
1、update可以带参数,而execute不可以。例如:
jdbcTemplate.update("update TableA set name = 'Andy’ where id=?", new Object[] {new Integer(3)}); jdbcTemplate.execute("update TableA set name = 'Andy’ where id=3");
2、update背后是借助于java.sql.PreparedStatement完成,而execute是基于java.sql.Statement。
3、update返回int, 即受影响的行数。execute返回void
4、execute不接受参数,无返回值,适用于create和drop table。
update可以接受参数,返回值为此次操作影响的记录数,适合于insert, update, 和delete等操作。