• springMVC+springJDBC+Msql注解模式


    最近基于Spring4.X以上的版本写了一个springMVC+springJDBC+Msql注解模式的一个项目,之中也遇到过很多问题 ,为了防止以后遇到同样问题现记录一下知识点以及详细配置。

    首先我是基于Spring Tool Suite 工具做开发,此工具和Eclipse工具区别不大,只是Sping在Eclipse上做了封装,更利于做Spring开发。以下是开发工具的图。

    用什么工具都一样,能开发的工具都是好工具,工具下载直通车:https://spring.io/tools/sts/all

    首先说一下环境  我这边用的是JDK1.8、tomcat1.7、mysql5.0以上

    springMVC+springJDBC+Msql 用到的jar:

    其中和Spring有关的jar直接去官网下载就好了:直通车 https://repo.spring.io/release/org/springframework/spring/

    其他相关的jar去相应的官网下载就好了。

    1.新建一个动态的Web项目

    2.配置web.XML文件(在web.xml文件中配置Spring核心转换器)

      <!-- spring 核心转换器 -->
      <servlet>
          <servlet-name>springMVC</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <!-- 让spring 核心转换器什么时候启动    tomcat启动一秒后启动 -->
          <load-on-startup>1</load-on-startup>
      </servlet>
      <!-- 拦截什么路径 -->
      <servlet-mapping>
          <servlet-name>springMVC</servlet-name>
          <url-pattern>/</url-pattern>
      </servlet-mapping>

    3.新建springMVC-servlet.xml文件 (此文件中包扫描主要扫描controller层)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
    
        
        <!-- 配置包扫描  base-package="com.zx.controller" 指定哪一个包-->
        <context:component-scan base-package="com.zx.controller"></context:component-scan>
        
        <!-- Spring MVC不处理静态资源 -->
        <mvc:default-servlet-handler/>
        
        <!-- 开启注解模式驱动 -->
        <mvc:annotation-driven conversion-service="conversionService"/>
        <!-- <mvc:annotation-driven/> -->
        
        <!-- 配置静态资源  Spring MVC就不会做拦截 -->
        <mvc:resources location="/" mapping="**/*.png"/>
        <mvc:resources location="/" mapping="*.jpg"/>
        <mvc:resources location="/" mapping="*.css"/>
        <mvc:resources location="/" mapping="*.js"/>
        <mvc:resources location="/" mapping="*.ico"/>
        <mvc:resources location="/" mapping="*.gif"/> 
        
        <!-- 配置返回视图的统一解析的前后缀    WEB-INF/jsp/index.jsp-->
        <bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- 前缀 -->
            <property name="prefix" value="/WEB-INF/jsp/"></property>
            <!-- 后缀 -->
            <property name="suffix" value=".jsp"></property>
        </bean>
        
    </beans>

    在以上配置文件中需要注意 beans节点中的 xmlns:context、xmlns:mvc、xmlns:aop 一定要有。如果不想手写可用new的方式生成

    如下步骤:右键WEB-INF文件夹 new > Other > 找到 spring选择第一项

    点击下一步 编写文件名为springMVC-servlet.xml

    点击下一步选择相应的节点以及版本号

    然后点击完成 会生成一个已经写好头文件的Spring配置文件,总之很有很多方便之处可以自己去多多研究,这里我就不多说了。

    4.以上文件配置好了后我们还需要配置一个连接数据库的配置文件  我这边取名叫  bean.xml 并且放在了SRC目录下

    首先我们需要在web.xml 中配置以下配置,注意此配置最好配置在Spring核心转换器的后面

      <!-- springJDBC 配置 -->
      <context-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:bean.xml</param-value>
      </context-param>
      <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>

    配置 bean.xml 文件  (此文件中开启包扫描主要扫描service和dao的实现层。)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
    
        <!-- 开启注解模式 -->
        <context:annotation-config></context:annotation-config>
        
        <!-- 开启包扫描 -->
        <context:component-scan base-package="com.zx.service.impl"></context:component-scan>
        <context:component-scan base-package="com.zx.dao.impl"></context:component-scan>
    
        <!-- 读取数据库配置文件 -->
        <context:property-placeholder location="classpath:jdbc.properties"/>
        
        <!-- 配置数据源 -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="${driver}"></property>
            <property name="url" value="${url}"></property>
            <property name="username" value="${usernamex}"></property>
            <property name="password" value="${passwordx}"></property>
        </bean>
        
        <!-- 配置事物管理 -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
        
        <!-- 开启注解驱动 -->
        <tx:annotation-driven transaction-manager="transactionManager"/>
    
    </beans>

    因为需要连接数据库 所以需要数据库 driver、url、username,password 等 ,根据以上配置我们可以看到 这些我都是从jdbc.properties文件中读取过来的,所以需要在SRC下新建一个jdbc.properties文件。

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/test
    usernamex=root
    passwordx=root

    至此我所有的配置均已经配置完成。

    5.下面开始编写java代码。

    首先编写编写controller层

    package com.zx.controller;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.validation.BindingResult;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.zx.enity.User;
    import com.zx.service.UserService;
    
    @Controller
    public class UserController {
        
        @Autowired
        private UserService userService;
        
        
        /**
         * 跳转添加用户页面
         * @return
         */
        @RequestMapping("addUserView")
        public String getAddUserView(Model model) {
            User user = new User("lisi", "123456", 120);
            model.addAttribute("user", user);
            return "addUser";
        }
        
        /**
         * 往数据库添加user用户
         * @return
         */
        @RequestMapping("addUser")
        public String addUser(User user,BindingResult bindingResult,Model model) {
            //保存数据
            //int num = userService.saveUser(user);
            
            //插入数据并且获取主键
            int num = userService.saveUserReturnKey(user);
            
            System.out.println(num);
            System.out.println("zxxxxxxxxxxxx");
            
            if(num > 0 ) {
                model.addAttribute("msg","注册成功,请登录!!");
            }
            
            List<User> allUser = userService.getAllUser();
            for (User user2 : allUser) {
                System.out.println(user2.getUsername());
            }
            return "login";
        }
        
    }

     然后 service层 

    package com.zx.service;
    
    import java.util.List;
    
    import com.zx.enity.User;
    
    public interface UserService {
    
        /**
         * 保存用户
         * @param user
         * @return
         */
        public int saveUser(User user);
        
        
        /**
         * 保存用户信息并且返回这条数据的主键
         * @return
         */
        public int saveUserReturnKey(User user) ;
        
        
        /**
         * 拿到所有的用户
         * @return
         */
        public List<User> getAllUser();
    }

    service的实现层

    package com.zx.service.impl;
    
    import java.util.List;
    
    import javax.annotation.Resource;
    
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.zx.dao.UserDao;
    import com.zx.enity.User;
    import com.zx.service.UserService;
    
    @Service
    public class UserServiceImpl implements UserService {
    
        @Resource
        private UserDao userdao;
        
        
        @Transactional //事物管控
        @Override
        public int saveUser(User user) {
            try {
                return userdao.saveUser(user);
            } catch (Exception e) {
                // 抛出异常 用于报错回滚
                throw new RuntimeException();
            }
        }
    
        @Transactional
        @Override
        public int saveUserReturnKey(User user) {
            try {
                return userdao.saveUserReturnKey(user);
            } catch (Exception e) {
                // 抛出异常 用于报错回滚
                throw new RuntimeException();
            }
        }
        
    
        @Override
        public List<User> getAllUser() {
            // TODO Auto-generated method stub
            return userdao.getAllUser();
        }
        
    
    }

    dao层

    package com.zx.dao;
    
    import java.util.List;
    
    import com.zx.enity.User;
    
    public interface UserDao {
        
        /**
         * 保存用户
         * @return
         */
        public int saveUser(User user);
        
        
        /**
         * 保存用户信息并且返回这条数据的主键
         * @return
         */
        public int saveUserReturnKey(User user) ;
        
        
        /**
         * 拿到所有的用户
         * @return
         */
        public List<User> getAllUser();
    }

    dao的实现层

    package com.zx.dao.impl;
    
    import java.sql.Connection;
    import java.sql.Date;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.annotation.Resource;
    import javax.sql.DataSource;
    import javax.swing.plaf.basic.BasicComboBoxUI.KeyHandler;
    
    import org.springframework.jdbc.core.PreparedStatementCreator;
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.jdbc.core.support.JdbcDaoSupport;
    import org.springframework.jdbc.support.GeneratedKeyHolder;
    import org.springframework.jdbc.support.KeyHolder;
    import org.springframework.stereotype.Repository;
    
    import com.zx.dao.UserDao;
    import com.zx.enity.User;
    
    @Repository
    public class UserDaoImpl extends JdbcDaoSupport implements UserDao  {
        
        /**
         * 获取数据源
         * @param dataSource 来源于 bean.xml配置文件的dataSource
         */
        @Resource
        public final void setJdbcDaoDataSource(DataSource dataSource) {
            super.setDataSource(dataSource);
        }
        
        @Override
        public int saveUser(User user) {
            int num = this.getJdbcTemplate().update("insert into user (username,password,age,birth) values (?,?,?,?)",
                    new Object[] {user.getUsername(),user.getPassword(),user.getAge(),user.getBirth()});
            
            //抛出异常 测试是否回滚
            //int a = 1/0;
            
            return num;
        }
    
        @Override
        public int saveUserReturnKey(User user) {
            System.out.println(user.toString());
            // 接受插入数据是返回的主键值
            KeyHolder key = new GeneratedKeyHolder();
            // 往数据库插入数据并且返回主键值
            this.getJdbcTemplate().update(new PreparedStatementCreator() {
                @Override
                public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                    // 做数据库持久化   插入数据
                    PreparedStatement prepareStatement = con.prepareStatement("insert into user (username,password,age,birth) values (?,?,?,?)", new String[] {"user_id"});
                    //给占位符赋值  数字表示第几个占位符
                    prepareStatement.setString(1,user.getUsername() );
                    prepareStatement.setString(2,user.getPassword());
                    prepareStatement.setInt(3,user.getAge());
                    prepareStatement.setDate(4,new Date(999999));
                    return prepareStatement;
                }
            },key);
                //返回主键   因为KeyHolder key是一个对象  所以需要从中取出 key 并转为int类型
            return key.getKey().intValue();
        }
    
        @SuppressWarnings("unchecked")
        @Override
        public List<User> getAllUser() {
            //新建list集合接受所有的用户信息
            List<User> userList = new ArrayList<User>();
            // 做数据库持久化  并且用 userList 接受查询出来数据
            userList = this.getJdbcTemplate().query("select * from user ", new RowMapper() {
                //  类似循环  所有的数据在ResultSet rs 对象中取,  也可以根据行数取int rowNum
                @Override
                public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                    //新建user对象   从数据库取到的数据保存user的属性中
                    User user = new User();
                    //  rs.getString(2)   getString是要取的数据的类型   2是属性在行的第几列
                    user.setUsername(rs.getString(2));
                    user.setPassword(rs.getString(3));
                    user.setAge(rs.getInt(4));
                    user.setBirth(rs.getDate(5));
                    //  返回user对象    SpringJDBC会自动将user   添加到  userList 中
                    return user;
                }
            });
            return userList;
        }
    
    }


    然后贴上user实体类

    package com.zx.enity;
    
    import java.util.Date;
    
    public class User {
    
        //用户名
        private String username;
        //用户密码
        private String password;
        //年龄
        private int age;
        //生日
        private Date birth;
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
        
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
        
        public Date getBirth() {
            return birth;
        }
    
        public void setBirth(Date birth) {
            this.birth = birth;
        }
    
        public User() {}
    
        public User(String username, String password, int age) {
            super();
            this.username = username;
            this.password = password;
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "User [username=" + username + ", password=" + password + ", age=" + age + ", birth=" + birth + "]";
        }
        
    }

    至此所有的代码已经完成,如需运行请配置好一个mysql的数据库 并且需要存在user表以及字段,一下是sql语句

    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for user
    -- ----------------------------
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `user_id` int(11) NOT NULL AUTO_INCREMENT,
      `username` varchar(255) NOT NULL,
      `password` varchar(255) NOT NULL,
      `age` int(11) NOT NULL,
      `birth` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`user_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1011 DEFAULT CHARSET=utf8;

    在我们运行过程中可能会遇到很多问题 无非就是我们的 配置不正确、jar 缺失、单词编写不正确。仔细理清思路就会发现错在哪里。

    以上代码如有问题请多多指教。

      

  • 相关阅读:
    vue中minxin---小记
    微信认证
    Fatal error Using $this when not in object context in
    $.ajax()方法详解
    $.post
    jquery中的each
    jquery的$.extend和$.fn.extend作用及区别
    javascript字符串函数
    serializeArray()与serialize()的区别
    一个登陆界面
  • 原文地址:https://www.cnblogs.com/Faith-zhang/p/7656421.html
Copyright © 2020-2023  润新知