SpringBoot2.0学习(三)-JDBC

作者: Acamy丶 | 来源:发表于2018-05-30 22:31 被阅读2次

    连接数据库是一个永恒的话题,本文先给出传统方式连接数据库的步骤,然后演示Springboot使用JdbcTemplate的方法,最后介绍当前比较流行的数据库连接池。

    GitHub源码地址

    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: 关于事务,以及连接池的详细使用还有待深入研究

    相关文章

      网友评论

        本文标题:SpringBoot2.0学习(三)-JDBC

        本文链接:https://www.haomeiwen.com/subject/gloxsftx.html