java服务器开发(三)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_27741463/article/details/81027479

springMVC的使用

spring是基于servlet封装的网络框架,在开发中可以更轻松的完成各项功能。
学习过程中参考了相关博客:http://www.cnblogs.com/ysocean/p/7282639.html
http://www.cnblogs.com/hellokitty1/p/5216025.html

1、springMVC的结构

springMVC是用于完成后端服务功能的框架。分为M层-model(数据模型),V层-view(视图),C-层(控制器)。

  1. M层。数据模型类,需于数据库表结构对应,用于在数据库与V、C层之间传递数据。一般根据表名创建对应的java类并实现get和set方法。
  2. V层。视图层,可将M、C层的相关内容和数据以可视化呈现给用户。使用时需要在xml中配置视图解析器,并以 ${内容} 的形式发送至页面(其他方法暂未学到)。其中接口开发不需要太多V层配置。而更复杂的界面是由HTML,jsp等前端技术实现。
  3. C层。Controller层,主要完成业务处理、数据操作及相关功能,是M与V层的中介,MV层的交互由C层来完成。C层一般分为声明与定义层。定义层负责具体的函数实现。

2、springMVC与数据库交互

springMVC可直接操作数据库,但是存在一定的不便捷性,开发过程中如果将SQL语句写在java文件中,不利于之后的修改与维护。所以在C层需要操作数据库时,引入新的框架mybatis。

mybatis-数据库操作框架

mybatis可分为xml配置和@*()注解式。
其中注解式也是在java中写入SQL语句,虽然文件结构简单,但是同样存在不利于修改和维护的问题。
两种方法都需要配置mybatis配置文件 mybatis-configuration.xml,文件用于配置数据库地址及账户等,并配置对应注解或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>

<!-- 注意:environments标签,当mybatis和spring整合之后,这个标签是不用配置的 -->

<!-- 可以配置多个运行环境,但是每个 SqlSessionFactory 实例只能选择一个运行环境  
  一、development:开发模式
   二、work:工作模式-->
 <environments default="development">
 <!--id属性必须和上面的default一样  -->
    <environment id="development">
    <!--事务管理器
        一、JDBC:这个配置直接简单使用了 JDBC 的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围
        二、MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期
            比如 spring 或 JEE 应用服务器的上下文,默认情况下,它会关闭连接。然而一些容器并不希望这样,
            因此如果你需要从连接中停止它,就可以将 closeConnection 属性设置为 false,比如:
            <transactionManager type="MANAGED">
                <property name="closeConnection" value="false"/>
            </transactionManager>
      -->
      <transactionManager type="JDBC"/>
      <!--dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象源  -->
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatisdemo"/>
        <property name="username" value="root"/>
        <property name="password" value="root1"/>
      </dataSource>
    </environment>
  </environments>

    <mappers>
        <!-- 1、注册userMapper.xml文件,UserMapper.xml位于com.user.mapper包下
        所以resource写成/com/uesr/mapper/UserMapper.xml,区别于注解方法。-->
        <mapper resource="com/user/mapper/UserMapper.xml"/>
    </mappers>


    <!-- 2、注册userMapper.java文件,和基于注解的sql操作方法对应。区别于基于xml的配置方式-->
    <!--    <mappers>
          <mapper class="com.user.mapper.UserMapper"/>
    </mappers> -->

</configuration>

其中基于注解是由UserMapper类来实现相应的SQL操作的。创建package:com.user.mapper,并实现类UserMapper.java,例如:

public interface UserMapper {
    //根据 id 查询 user 表数据
    @Select("select * from user where id = #{id}")
    public User selectUserById(int id) throws Exception;
}

其中@Delete已经写死,和传统方法比较只是结构相对简单。调用方法也较为简单。

public class zujieTest {

        //定义 SqlSession
        SqlSession session =null;

        @Before
        public void init(){
            //定义mybatis全局配置文件
            String resource = "mybatis-configuration.xml";
            //加载 mybatis 全局配置文件
            InputStream inputStream = xmlTest.class.getClassLoader()
                                        .getResourceAsStream(resource);
            //构建sqlSession的工厂
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //根据 sqlSessionFactory 产生 session
            session = sessionFactory.openSession();
        }

        //注解的增删改查方法测试
        @Test
        public void testAnncationCRUD() throws Exception{
            //根据session获取 UserMapper接口
            UserMapper userMapper = session.getMapper(UserMapper.class);
            //调用selectUserById()方法
            User user = userMapper.selectUserById(1);
            System.out.println(user);

            session.commit();
            session.close();
        }
    }

而xml方式则更便捷,可在部署好的服务器中直接更改,服务器使用时再读取,即修改及维护更灵活。xml方式对应mybatis-configuration.xml中的xml操作方式。需创建文件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">
<mapper namespace="com.user.po.userMapper">

<!-- 基于xml配置式sql操作,区别于基于注解 -->

    <!-- 根据 id 查询 user 表中的数据
       id:唯一标识符,此文件中的id值不能重复
       resultType:返回值类型,一条数据库记录也就对应实体类的一个对象
       parameterType:参数类型,也就是查询条件的类型
    -->
    <select id="selectUserById"
            resultType="com.user.po.User" parameterType="int">
        <!-- 这里和普通的sql 查询语句差不多,对于只有一个参数,后面的 #{id}表示占位符,里面不一定要写id,写啥都可以,但是不要空着,如果有多个参数则必须写pojo类里面的属性 -->
        select * from user where id = #{id}
    </select>


    <!-- 查询 user 表的所有数据
        注意:因为是查询所有数据,所以返回的应该是一个集合,这个集合里面每个元素都是User类型
     -->
    <select id="selectUserAll" resultType="com.user.po.User">
        select * from user
    </select>

    <!-- 模糊查询:根据 user 表的username字段
            下面两种写法都可以,但是要注意
            1、${value}里面必须要写value,不然会报错
            2、${}表示拼接 sql 字符串,将接收到的参数不加任何修饰拼接在sql语句中
            3、使用${}会造成 sql 注入
     -->
    <select id="selectLikeUserName" resultType="com.user.po.User" parameterType="String">
        select * from user where username like '%${value}%'
        <!-- select * from user where username like #{username} -->
    </select>

    <!-- 向 user 表插入一条数据 -->
    <insert id="insertUser" parameterType="com.user.po.User">
        <!-- 将插入的数据主键返回到 user 对象中
                 keyProperty:将查询到的主键设置到parameterType 指定到对象的那个属性
                 select LAST_INSERT_ID():查询上一次执行insert 操作返回的主键id值,只适用于自增主键
                 resultType:指定 select LAST_INSERT_ID() 的结果类型
                 order:AFTER,相对于 select LAST_INSERT_ID()操作的顺序
             -->
        <selectKey keyProperty="id" resultType="int" order="AFTER">
            select LAST_INSERT_ID()
        </selectKey>
        insert into user(id,username,sex,birthday,address)
            value(#{id},#{username},#{sex},#{birthday},#{address})
    </insert> 

    <!-- 根据 id 更新 user 表的数据 -->
    <update id="updateUserById" parameterType="com.user.po.User">
        update user set username=#{username} where id=#{id}
    </update>

    <!-- 根据 id 删除 user 表的数据 -->
    <delete id="deleteUserById" parameterType="int">
        delete from user where id=#{id}
    </delete>
</mapper>

可以看到是由xml标签形式完成配置,其调用方式也和UserMapper.java类有所区别,类调用和传统类一样,创建类对象并调用方法即可,而xml标签形式需要读取配置并使用SqlSession。


public class xmlTest {
    //定义 SqlSession
    SqlSession session =null;

    @Before
    public void init(){
        //定义mybatis全局配置文件
        String resource = "mybatis-configuration.xml";
        //加载 mybatis 全局配置文件
        InputStream inputStream = xmlTest.class.getClassLoader()
                                    .getResourceAsStream(resource);
        //构建sqlSession的工厂
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //根据 sqlSessionFactory 产生 session
        session = sessionFactory.openSession();
    }

    //根据id查询user表数据
    @Test
    public void testSelectUserById(){
        /*这个字符串由 userMapper.xml 文件中 两个部分构成
            <mapper namespace="com.user.po.userMapper"> 的 namespace 的值
            <select id="selectUserById" > id 值*/
        String statement = "com.user.po.userMapper.selectUserById";
        User user = session.selectOne(statement, 1);
        System.out.println(user);
        session.close();
    }
}

其中注意单元测试时需要引入junit及hamcrest-core的jar包,我这里使用junit-4.12.jar和hamcrest-core-1.3.jar。遇到initializationerror时检查jar包是否缺失:https://blog.csdn.net/learner_lps/article/details/76921228
其中单元测试的相关规则见:https://blog.csdn.net/baidu_37107022/article/details/73658343
根据以上方法基本可顺利运行单元测试。

猜你喜欢

转载自blog.csdn.net/sinat_27741463/article/details/81027479