zoukankan      html  css  js  c++  java
  • 从零开始学JAVA(09)-使用SpringMVC4 + Mybatis + MySql 例子(注解方式开发)

    项目需要,继续学习springmvc,这里加入Mybatis对数据库的访问,并写下一个简单的例子便于以后学习,希望对看的人有帮助。上一篇被移出博客主页,这一篇努力排版整齐,更原创,希望不要再被移出主页了。

    原创文章,后面附上源码,转载请注明出处http://www.cnblogs.com/lin557/p/6179618.html  

    一、运行环境

    1. Eclipse Neon.1a Release (4.6.1) 官网下载
    2. mysql-5.7.16-winx64(http://cdn.mysql.com/Downloads/MySQL-5.7/mysql-5.7.16-winx64.zip)
    3. mybatis 3.4.1(https://github.com/mybatis/mybatis-3/releases)
    4. springmvc 4.3.4
    5. Tomcat 8.5.8
    6. mysql的连接驱动 mysql-connector-java-5.1.40-bin.jar

      关于mybatis的jar包,需要其他依赖包(如log4、cglib等),使用时一定要把这些依赖包一起加入工程中,不要只加入mybatis-3.4.1,不然是跑不起来的。

      关于jar包的下载,如果找不到,可以在这里查找下载,http://mvnrepository.com/

    二、新建工程

      这里用的是Eclipse,为了便于以后可以导入MyEclipse,新建工程时一些路径需要做下修改,当然,不改也是可以正常运行的(网上老师教的)。

    1. 默认的class输出目录:buildclasses 修改为 WebRootWEB-INFclasses
    2. context目录:WebContent 修改为 WebRoot

      下面新建工程,新手可以看,高手可以跳过。

      菜单中File-New-Dynamic Web Project,如下图:

      

      修改Default output folder

      

      修改Context directory 并勾选 Generate web.xml deployment descriptor

      

    三、工程目录结构

    1. 复印制相关的jar包到WebRootWEB-INFlib目录下
    2. 新建4个包 com.web.controller (存放spring的controller) com.web.service (业务类的接口与实现类) com.web.mapper (存放mybatis的映射类与映射文件) com.web.po (mapper相关的pojo)
    3. 新建db.properties(jdbc连接数据库的参数),log4j.properties(log4j日志参数),mybatis-config.xml(mybatis配置文件),springmvc-servlet.xml(spring DispatcherServlet的配置文件),放在src文件夹中
    4. WebRoot下新建一个static文件夹,用于存放静态文件,如.css/.jpg/.json等
    5. WebRootWEB-INF下新建jsp文件夹,用于存入视图文件(在这里就是jsp文件)

      目录结构如下图:

       

     四、mysql数据库的相关(安装、建库、建表等这里就不说了,数据库默认字符集为utf-8,我用的是navicat这个工具操作mysql的)

    1. 新建库,库名为dsp
    2. 新建表,表名为t_user,表结构

    3. 表t_user中的有两行数据

    五、各个文件的代码如下:

      db.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/dsp?useUnicode=true&characterEncoding=UTF-8
    jdbc.username=root
    jdbc.password=123456

      log4j.properties

    log4j.rootLogger = debug,stdout
    
    log4j.appender.stdout = org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target = System.out
    log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

      web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
        id="WebApp_ID" 
        version="3.1">
        
        <!-- 名称随便 -->
        <display-name>mvc mybatis</display-name>
    
        <!-- 指定servlet -->
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
                <init-param>  
                    <param-name>contextConfigLocation</param-name>  
                    <param-value>classpath*:springmvc-servlet.xml</param-value>
                 </init-param>  
            <load-on-startup>1</load-on-startup>
        </servlet>
      
        <!-- 使用restful风格,所以这里用/ -->
        <servlet-mapping>
           <servlet-name>springmvc</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
                
    </web-app>

      springmvc-servlet.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:aop="http://www.springframework.org/schema/aop" 
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc-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/tx  
            http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.0.xsd">
            
        <!-- 指定从配置文件中加载数据库连接信息 -->
        <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations">
                <value>classpath:db.properties</value>
            </property>
            <property name="fileEncoding">
                <value>UTF-8</value>
            </property>
        </bean>
        
        <!-- 配置数据源 也可以用dbcp、c3p0数据库连接池等,这里使用Spring默认的 -->
        <!--  
                    使用连接池可以提高访问性能,这里可以加入dbcp或c3p0的jar包,并修改class实现
            <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource.class">
        -->        
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="${jdbc.driver}"></property>
            <property name="url" value="${jdbc.url}"></property>
            <property name="username" value="${jdbc.username}"></property>
            <property name="password" value="${jdbc.password}"></property>
        </bean>
           
        <!-- 配置sqlSessionFactory -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!-- 加载mybatis-config.xml文件 -->
            <property name="configLocation" value="classpath:mybatis-config.xml"></property>
            <!-- 数据源 -->
            <property name="dataSource" ref="dataSource"></property>
        </bean> 
       
        <!-- 扫描包中的mapper类 注意这里使用了sqlSessionFactoryBeanName -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.web.mapper"></property>
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
        </bean>
        
        
        <!-- 对静态资源文件的访问  -->    
        <mvc:resources mapping="/static/**" location="/static/" cache-period="31556926"/>
        
        <!-- 启用最新的注解解析器、映射器  -->
        <!-- Spring默认情况下使用的是一些旧版本注解解析器、映射器、转换器等 -->
        <mvc:annotation-driven/>    
        
        <!-- 扫描包中所有@Controller注解的类 -->     
        <context:component-scan base-package="com.web.controller" />
        <!-- 扫描包中所有@Service注解的类 -->
        <context:component-scan base-package="com.web.service" />
        
        <!-- 配置视图解析器 -->
        <!--
            prefix和suffix:查找视图页面的前缀和后缀(前缀[逻辑视图名]后缀),
                   比如传进来的逻辑视图名为WEB-INF/jsp/hello,则该该jsp视图页面应该存放在“WEB-INF/jsp/hello.jsp”; 
        -->          
        <bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix">
                <value>/WEB-INF/jsp/</value>
            </property>
            <property name="suffix">
                <value>.jsp</value>
            </property>
        </bean>
            
    </beans>

      mybatis-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"   
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>      
        
        <!-- 加载Mapper映射文件 -->
        <mappers>
            <!-- 空着就行,由spring配置加载 -->
        </mappers>
    </configuration>

      com.web.controller 包中的 HelloController.java

    package com.web.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    import com.web.po.User;
    import com.web.service.UserService;
    
    @Controller
    public class HelloController {
        
        @Autowired
        private UserService userService;
        
        // 建议方法名与url一样,方便维护
        @RequestMapping("/hello") 
        public String hello(@RequestParam(value = "id", required = false, defaultValue = "1") int id,                        
                    Model model) throws Exception {                  
                
                // 通过客户端传送过来的id获取user数据
                User user = userService.getUserById(id);
                
                if (user == null) {
                    user = new User();
                    user.setName("查无记录");
                }
                
                String myhtml = "<div><p>这是html文本。</p><p>红色字体表明css样式文件成功加载。</p><p>这说明jsp上的数据可以由后台控制并显示</P></div><p></P>";
                // 在jsp文件中,可以通过${myhtml}得到myhtml的内容
                model.addAttribute("myhtml", myhtml);
                
                
                model.addAttribute("name", user.getName());            
                
                // 这里去WEB-INF/jsp 中找hello.jsp;因为springmvc-servlet.xml中配置了前缀与后缀,
                // 所以,hello = WEB-INF/jsp/hello.jsp
                return "hello";
        }
    }

      com.web.mapper包中的UserMapper.java

    package com.web.mapper;
    
    import java.util.List;
    
    import com.web.po.User;
    /**
     * 
     * @author Lin
     * user表的数据接口
     * mybatis使用mapper代理方式开发时,需要一个接口文件与一个mapper映射文件,并且两个文件名称要相同
     * 这里使用的是UserMapper.java与UserMapper.XML
     */
    public interface UserMapper {
    
        // 获取整个表的数据
        public List<User> getAll() throws Exception;
        
        // 通过表id获取表的数据
        public User getUserById(int id) throws Exception;
    }

      com.web.mapper包中的UserMapper.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"   
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
    <!--
        id与对应接口的某个对应的方法名一致
        mybatic还有其他标签(如<inert><delete>等),找本书慢慢学
    -->
    <mapper namespace="com.web.mapper.UserMapper">
    
        <select id="getdAll" resultType="com.web.po.User"> 
            select * from t_user
        </select>
        
        <select id="getUserById" parameterType="int" resultType="com.web.po.User"> 
            select * from t_user where id=#{id}
        </select>    
    
    </mapper>

      com.web.po包中的User.java

    package com.web.po;
    
    public class User {
        
        private int id;
        private String gid;
        private String name;
        private String pw;
        
        public int getId() {
            return id;
        }
        
        public void setId(int id) {
            this.id = id;
        }
        
        public String getGid() {
            return gid;
        }
        
        public void setGid(String gid) {
            this.gid = gid;
        }
        
        public String getName() {
            return name;
        }
        
        public void setName(String name) {
            this.name = name;
        }
        
        public String getPw() {
            return pw;
        }
        
        public void setPw(String pw) {
            this.pw = pw;
        }
    
    }

      com.web.service包中的UserService.java

    package com.web.service;
    
    import java.util.List;
    
    import com.web.po.User;
    
    public interface UserService {
        
        // 这里类的接口不需要与UserMapper相同,可以根据业务需要自行定义
        
        // 获取整个表的数据
        public List<User> getAll() throws Exception;
        
        // 通过表id获取表的数据
        public User getUserById(int id) throws Exception;
    
    }

      com.web.service包中的UserServiceImpl.java   注意@Service是写在这个类里的

    package com.web.service;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import com.web.mapper.UserMapper;
    import com.web.po.User;
    
    /**
     * 
     * @author Lin
     * @Service 注解 表此类是一个服务,服务一般由一个接口与一个接口实现类组成
     * 非注解方式开发,还需要spring的xml中配置才能使用,此处用的是注解方式,不需要额外配置
     */
    
    @Service
    public class UserServiceImpl implements UserService {
    
        // 注入msbatis数据库访问接口
        @Autowired
        private UserMapper userMapper;
        
        @Override
        public List<User> getAll() throws Exception {
            // TODO Auto-generated method stub
            // 这里不写了 如果想在jsp中显示list,可以引入jstl标签进行操作显示,记得加入jstl的包 jstl-1.2.jar
            return null;
        }
    
        @Override
        public User getUserById(int id) throws Exception {
            // TODO Auto-generated method stub
            
            // 通过userMapper获取数据
            User user = userMapper.getUserById(id);        
            return user;
        }
    
    }

      WebRoot下static中的Style.css

    body {
        font-size: 36px;
        color: #FF0000;
    }

      WebRoot下WEB-INFjsp中的hello.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <!-- 这里指定css样式,是为了检查配置的静态文件的访问是否成功 -->
    <link rel="Stylesheet" type="text/css" href="static/style.css" />
    <title>SpringMVC + Mybatic</title>
    </head>
    <body>
    ${myhtml}
    
    hello,${name}
    </body>
    </html>

    以上是整个工程,如果成功运行后,是这样的,页面中除了“hello,”外,其它数据都是从后台或数据库中加载的

    六、附上源码 下载地址: http://files.cnblogs.com/files/lin557/mvc_mybatis.zip  空间有限,lib中的jar包就不上传了,自行下载放到lib中。

    回复二楼,lib列表如下:

    by lin 2016-12-14

  • 相关阅读:
    some tips
    ORA00847: MEMORY_TARGET/MEMORY_MAX_TARGET and LOCK_SGA cannot be set together
    Chapter 01Overview of Oracle 9i Database Perfomrmance Tuning
    Chapter 02Diagnostic and Tuning Tools
    变量与常用符号
    Chapter 18Tuning the Operating System
    标准输入输出
    Trace files
    DBADeveloped Tools
    Chapter 03Database Configuration and IO Issues
  • 原文地址:https://www.cnblogs.com/lin557/p/6179618.html
Copyright © 2011-2022 走看看