发表于: 2017-07-07 10:58:19

1 1162


今天完成的事:根据教程完成mybatis实现增删查改。

代码如下:

SqlMapConfig.xml

  1. <?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>
       <typeAliases>

       </typeAliases>
       <!-- 和Spring整合后environment配置都会被干掉 -->
       <environments default="development">
           <environment id="development">
               <!-- 使用jdbc事务管理,目前由mybatis来管理 -->
               <transactionManager type="JDBC" />
               <!-- 数据库连接池,目前由mybatis来管理 -->
               <dataSource type="POOLED">
                   <property name="driver" value="com.mysql.jdbc.Driver" />
                   <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
                   <property name="username" value="root" />
                   <property name="password" value="yubotao9527" />
               </dataSource>
           </environment>
       </environments>
       <mappers>
           <mapper resource="User.xml" />
       </mappers>
    </configuration>

    User.xml

  2. <?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="test">

       <!-- 需求:通过id查询用户 -->
       <select id="findUserById" parameterType="int" resultType="mybatis.po.User">
           select * from user where id = #{id}
    </select>

       <!-- 根据用户名称模糊查询用户信息,可能返回多条 -->
       <select id="findUserByName" parameterType="java.lang.String" resultType="mybatis.po.User">
           select * from user where username like '%${value}%'
    <!--
           ${}:表示拼接sql串,将接收到的参数的内容不加任何的修饰拼接在sql中,${}中只能使用value,
           但是使用${}来拼接sql,可能会引起sql注入,所以不建议使用这种方法。
           -->
       </select>

       <!-- 添加用户 -->
       <insert id="insertUser" parameterType="mybatis.po.User">
           insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})

    <!-- 将插入数据的主键返回,返回到user对象中 -->
           <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
               select last_insert_id()
    </selectKey>

           <!--
           <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
               select uuid()
           </selectKey>
            -->

           <!--
           1 <insert>标签:用于执行数据库查询的,所有关于查询的都使用该标签。
           2 parameterType:要传入一个具体的pojo(包括用户信息)
           3 #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值。
           4 <selectKey>标签:用来返回插入数据的主键的,实际中如果有获得主键的需要就可以使用它。
           5 select last_insert_id():是sql函数,表示得到刚刚insert进去记录的主键值,只适用于自增主键。
           6 keyProperty:表示将查询到主键值设置到上面parameterType指定的对象的哪个属性。
           7 order:表示select last_insert_id()的执行顺序,是相对于insert语句来说的。
           8 resultType:表示select last_insert_id()的结果类型。
           -->
       </insert>

       <!-- 删除用户 -->
       <delete id="deleteUser" parameterType="java.lang.Integer">
           delete from user where id=#{id}
    </delete>

       <!-- 更新用户 -->
       <update id="updateUser" parameterType="mybatis.po.User">
           update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
    </update>
    </mapper>

    User.java

  3. 这里又重载项User,原因是:在按ID查询时,查询字段为User[id,username,birthday,sex,address];而插入和更新操作等使用的是User[username,birthday,sex,address].

  4. package mybatis.po;

    import java.sql.Date;

    /**
    * Created by Administrator on 2017/07/07.
    */
    public class User {
    private Integer id;
       private String username;
       private Date birthday;
       private String sex;
       private String address;

       public int getId(){return id;}
    public void setId(Integer id){this.id = id;}

    public User(Integer id,String username, Date birthday, String sex, String address) {
    this.id = id;
           this.username = username;
           this.birthday = birthday;
           this.sex = sex;
           this.address = address;
       }

    public User(String username, Date birthday, String sex, String address) {
    this.username = username;
           this.birthday = birthday;
           this.sex = sex;
           this.address = address;
       }

    @Override
       public String toString() {
    return "User{" +
    "id=" + id +
    ", username='" + username + '\'' +
    ", birthday=" + birthday +
    ", sex='" + sex + '\'' +
    ", address='" + address + '\'' +
    '}';
       }
    }

    MybatisFirst.java

  5. import mybatis.po.User;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Test;

    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Date;
    import java.util.List;

    /**
    * Created by Administrator on 2017/07/07.
    */
    public class MybatisFirst {
    //因为接下来的测试代码中,获取sqlSession这部分都相同,所以抽取成一个方法
       public SqlSession getSession() throws IOException {

    String resource = "SqlMapConfig.xml"; //mybatis配置文件

           //得到配置文件的流
           InputStream inputStream = Resources.getResourceAsStream(resource);

           //创建会话工厂SqlSessionFactory,要传入mybaits的配置文件的流
           SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

           //通过工厂得到SqlSession
           SqlSession sqlSession = sqlSessionFactory.openSession();

           return sqlSession;
       }

    //根据id查询用户的信息,得到一条记录的结果
       @Test
       public void findUserById() throws IOException {

    SqlSession sqlSession = getSession(); //调用上面的方法获取sqlSession

           //通过SqlSession操作数据库
           //第一个参数:映射文件中statement的id,= namespace + statement的id
           //第二个参数:指定和映射文件中所匹配的parameterType类型的参数
           //selectOne表示查询出一条记录进行映射
           User user = sqlSession.selectOne("test.findUserById", 1);

           System.out.println(user);

           //释放资源,最好放在finally中,这里只是测试程序,就不弄了
           sqlSession.close();
       }

    //根据用户名称模糊查询用户列表
       @Test
       public void findUserByName() throws IOException {

    SqlSession sqlSession = getSession();

           //selectList表示查询出一个列表(多条记录)进行映射
           List<User> list = sqlSession.selectList("test.findUserByName", "张三");

           System.out.println(list);

           //释放资源,最好放在finally中,这里只是测试程序,就不弄了
           sqlSession.close();
       }

    //添加用户信息
       @Test
       public void insertUser() throws IOException {

    SqlSession sqlSession = getSession();

           User user = new User("倪升武", new Date(1995,07,02), "男", "同济大学");

           sqlSession.insert("test.insertUser", user); //添加一项

           //提交事务
           sqlSession.commit();

           System.out.println(user.getId()); //获取刚刚添加的id

           //释放资源,最好放在finally中,这里只是测试程序,就不弄了
           sqlSession.close();
       }

    //删除用户信息
       @Test
       public void deleteUser() throws IOException {

    SqlSession sqlSession = getSession();

           //传入id,删除用户
           sqlSession.delete("test.deleteUser", 3);

           //提交事务
           sqlSession.commit();

           //释放资源,最好放在finally中,这里只是测试程序,就不弄了
           sqlSession.close();
       }

    //更新用户信息
       @Test
       public void updateUser() throws IOException {

    SqlSession sqlSession = getSession();

           User user = new User("倪升武", new Date(0,0,0), "男", "同济大学");
           user.setId(2);

           //更新用户
           sqlSession.update("test.updateUser", user);

           //提交事务
           sqlSession.commit();

           //释放资源,最好放在finally中,这里只是测试程序,就不弄了
           sqlSession.close();
       }
    }

    测试后全部成功。

  6. 参照上述代码,完成对数据库内的业务表进行增删查改。


然后学习了spring,看了一天的教程,还是有点云里雾里,未写项目代码,知识点总结如下:


对于mybatis,使用了DAO和mapper方法;

如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne来查询数据库;

如果mapper方法返回一个非集合对象,代理对象内部通过selectList来查询数据库。


Junit测试知识点:

Junit4进行单元测试

导入junit4包

编写测试代码

要为测试的类建一个对象才能开始测试

标注

@Before

在任何一个测试执行前都要执行的代码

@Test

测试代码

@After

任何一个测试结束后都要执行的代码

@Ignore

忽略的,常用于标注未完成的测试用例(方法还未实现,但测试用例已经写好)

@BeforeClass

测试用例初始化时执行,只执行一次

@AfterClass

测试用例结束后执行,一次

限时测试

@Test(timeout=1000)

timeout用来规定时间,1000为毫秒,超过即为超时,会报错,系统强制终止程序

Runner运行器

用来执行测试代码

指定Runner用@RunnerWith修饰类(不是修饰函数)可用于参数化设置(用到再跟进学习)

打包测试

用到再跟进学习


spring知识点:

spring框架是一个分层架构,有7个模块构成

spring AOP

spring Core

spring DAO

spring ORM

Spring Context

spring Web

spring Web MVC


spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。

其中,IoC(控制反转:Inverse of Control)是Spring容器的内核,IoC有助于应用对象之间的解耦;DI(依赖注入:Dependency Injection)的概念用以代替IoC,即让调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除调用类对某一接口实现类的依赖。

从注入方法上看,主要可以划分为三种类型:构造函数注入、属性注入和接口注入。Spring支持构造函数注入和属性注入。属性注入可以有选择地通过Setter方法完成调用类所需依赖的注入,更加灵活方便。

AOP(Aspect-oriented programming)就是面向切面编程,没看懂相关内容。


JavaBean知识点:

JavaBean是一个可重复使用的软件组件。实际上JavaBean是一种Java类,通过封装属性和方法成为具有某种功能或者处理某个业务的对象,简称bean。由于javabean是基于java语言的,因此javabean不依赖平台,具有以下特点:

  1. 可以实现代码的重复利用

  2. 易编写、易维护、易使用

  3. 可以在任何安装了Java运行环境的平台上的使用,而不需要重新编译。

  编写javabean就是编写一个java的类,所以你只要会写类就能编写一个bean,这个类创建的一个对象称做一个bean。为了能让使用这个bean的应用程序构建工具(比如JSP引擎)知道这个bean的属性和方法,只需在类的方法命名上遵守以下规则:

   1. 如果类的成员变量的名字是xxx,那么为了更改或获取成员变量的值,即更改或获取属性,在类中可以使用两个方法:

  getXxx(),用来获取属性xxx。

  setXxx(),用来修改属性xxx.。

  2. 对于boolean类型的成员变量,即布尔逻辑类型的属性,允许使用"is"代替上面的"get"和"set"。

  3. 类中访问属性的方法都必须是public的,一般属性是private的。


url知识点:统一资源定位符(Uniform Resource Locator,缩写为URL),又叫做网页地址,是互联网上标准的资源的地址(Address)。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。


JDBCTemplate:

JdbcTemplate是对JDBC的一种封装,抽象我们常用的一些方法。

JdbcTemplate的使用需要有DataSource的支持,所以在配置文件中,我们首先要配置一个OracleDataSource,然后在将这个DataSource配置到JdbcTemplate里。接着将JdbcTemplate配置进DAO层,最后将DAO配置进Model层。


暂时看到这些,打算继续实现用JDBCTemplate实现增删查改(之前用的JDBC),还未开始写代码,只看了些教程。


明天计划:写出spring项目代码并成功运行;写出JDBCTemplate实现增删查改代码并成功运行;有剩余时间补习一下java的基础语法什么的。


问题:mybatis实现增删查改;根据教程已完成。

   spring知识点,配置,项目等;还是理解不能,需要时间消化。

   JDBCTemplate实现增删查改;已看教程,代码还未实现。


收获:用Mybatis实现增删查改;了解sqlsession,sqlsessionfactory;学习了一堆乱七八糟的知识点(暂时都还没用)。


返回列表 返回列表
评论

    分享到