连接数据库是一个永恒的话题,本文先给出传统方式连接数据库的步骤,然后演示Springboot使用JdbcTemplate的方法,最后介绍当前比较流行的数据库连接池。
1. 传统JavaWeb项目连接数据库的方式
如下图所示,当我们通过idea新建一个javaweb项目后,基本上还需要以下的五步才能使用数据库。
1.1 引入驱动
因为数据库配置信息是准备放在tomcat的配置文件中的,所以需要先把mysql-connector-java-5.1.34.jar
拷贝到tomcat/lib目录中。
1.2 添加Resource标签
在tomcat/conf/context.xml中添加如下内容:
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
maxTotal="100" maxIdle="30" maxWaitMillis="10000"
username="root" password="123456" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/" />
注意: 如果涉及到具体数据库就需要将url具体到某一个数据库
1.3 添加resource-ref标签
在javaweb项目的web.xml中添加以下内容:
<resource-ref>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
1.4 编写 Servlet类
如上图所示,在tomcat的官方文档中可以了解到,要使用resource标签,必须先实例化初始上下文,然后找到以java:comp/env
为名称的上下文,再在将上下文中获取相应的资源。
public class JDBCTestServlet extends HttpServlet {
private DataSource ds;
public void init(ServletConfig servletConfig) throws ServletException {
try {
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:comp/env");
ds = (DataSource)envContext.lookup("jdbc/TestDB");
} catch (NamingException e) {
e.printStackTrace();
}
}
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
Writer writer = response.getWriter();
response.setContentType("text/html;charset=UTF-8");
try {
Connection conn = ds.getConnection();
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("SHOW DATABASES");
while (rs.next()){
String dbName = rs.getString(1);
writer.write(dbName + "<br />");
writer.flush();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
1.5 配置Servlet映射
在web.xml中添加以下内容:
<servlet>
<servlet-name>jdbcServlet</servlet-name>
<servlet-class>JDBCTestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>jdbcServlet</servlet-name>
<url-pattern>/jdbc</url-pattern>
</servlet-mapping>
运行效果:
2. SpringBoot中使用JdbcTemplate
在SpringBoot中使用JdbcTemplatel连接数据库就非常简单了,添加后依赖后配置连接信息,编写Controller类就可以了。
2.1 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
2.2 添加配置
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
2.3 编写Controller类
通过上面的配置在SpringBoot项目启动时就会自动装配JdbcTemplate类,所以可以直接用@Autowired
进行注入
@RestController
public class JDBCController {
@Autowired
private DataSource ds;
@GetMapping("/jdbc")
public Map<String, Object> getUsers(@RequestParam(value = "id", defaultValue = "1") String id){
Map<String, Object> data = new HashMap<String, Object>();
Connection conn = null;
try {
conn = ds.getConnection();
PreparedStatement preparedStatement = conn.prepareStatement("SELECT id,name,age FROM user WHERE id=?");
preparedStatement.setString(1,id);
ResultSet rs = preparedStatement.executeQuery();
while(rs.next()){
data.put("id", rs.getInt("id"));
data.put("name", rs.getString("name"));
data.put("age", rs.getInt("age"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return data;
}
@Autowired
private JdbcTemplate jdbcTemplate;
@PostMapping("/addUser")
public Map<String, Object> addUser(@RequestBody User user){
Map<String, Object> data = new HashMap<String, Object>();
Boolean result = jdbcTemplate.execute("INSERT INTO user(name,age) VALUES (?, ?)",new PreparedStatementCallback<Boolean>(){
@Override
public Boolean doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException {
ps.setString(1, user.getName());
ps.setInt(2, user.getAge());
return ps.executeUpdate() > 0;
}
});
data.put("success", result);
return data;
}
}
运行效果:
3. 连接池
当前连接池有非常多,如比较传统的dbcp, c3p0,现在比较流行的阿里druid。
各种数据库连接池对比
TODO: 关于事务,以及连接池的详细使用还有待深入研究