Mybatis学习day2

Mybatis初探

之前已经用利用mybatis实现链接数据库查询所有用户的信息(用的是在resources下建立和Dao层一样目录的xml实现的)。这次再来看一下增删改查等其它的操作。

利用Mybatis我们可以不用写Dao层的实现类。让代理对象去帮我们去做这件事。

注解的方式:和servlet一样不仅可以通过xml进行配置还可以用注解。下面主要展示注解方式实现。

直接在UserDao接口(不了解文件布局的可以先去看这里:https://www.cnblogs.com/cstdio1/p/11882953.html)下书写Sql语句

在这之前说一下我们测试功能都是建一个类Test在这里面进行单元测试

单元测试:

你必须在pom.xml进行配置才能使用:

  

查询所有:

单元测试代码:

 细心的小伙伴可能已经发现这个测试代码怎么这么短,明明上个用Mybatis要有好几步呢。

其实我们将那几步进行了封装,写在两个函数中,一个用于测试前(Before)调用和一个测试后(After)调用。

用注解@Before@After

测试前:

 测试后:

之后的操作大概也是如此,不想罗嗦了·,还有一点需要说一下。

有些时候传入的参数不是简单类型而是一个类的对象,这个时候我们需要写对应类中的属性(并且通过这个属性可以找到最终查询对象的信息)

最简单的情况就是这个间接类有个属性的类型就是要查找的那个User类型

例如:

上面的user是Query类的一个变量(User类型的)然后通过user可以直接  .username,username是User类的一个属性

Query内部:

执行的SQL语句(占位符方式):

查询结果:

 还有一种方式是:

 执行的SQL语句(存在SQL注入):

 查询结果:

 因为Sql'注入问题所以一般就用第一种方式

UserDao源码:

package com.zyb.dao;

import com.zyb.pojo.Query;
import com.zyb.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserDao {
    /**
     * 查询所有用户
     * @return
     */
    @Select("select * from my_user")
    List<User> selAll();


    /**
     * 保存方法
     */
    @Insert("insert into my_user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday})")
    void saveUser(User user);

    /**
     *更新操作
     */
    @Update("update my_user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}")
    void updateUser(User user);


    /**
     * 通过id删除记录
     * @param
     */
    @Delete("delete from my_user where id=#{uid}")//可以不叫uid,随便起名称
    void deleUserById(Integer userId);

    /**
     * 根据id查询
     * @param userId
     * @return
     */
    @Select("select * from my_user where id=#{uid}")//可以不叫uid,随便起名称
    User selById(Integer userId);

    /**
     * 根据姓名模糊查询
     * @return
     */
    //@Select("select * from my_user where username like #{name}")//这种方式需要在外面加%
    @Select("select * from my_user where username like '%${value}%' ")//不需要在外面加%,这里变量名必须是value

    List<User> selByName(String userName);

    /**
     * 查询总用户数
     * @return
     */
    @Select("select count(id) from my_user")//使用聚合函数
    int selUserNums();

    /**
     * 查询最后插入视频的id
     * @return
     */
    @SelectKey(statement = "select last_insert_id()", keyProperty = "id", keyColumn = "id", before = false, resultType = int.class)
    int selLastInsertId();

    /**
     * 根据Query的信息查询用户
     * @param query
     * @return
     */
    @Select("select * from my_user where username like #{user.username}")
    List<User> selByQuery_UserName(Query query);
}

测试类源码:

package com.zyb.test;

import com.zyb.dao.UserDao;
import com.zyb.pojo.Query;
import com.zyb.pojo.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.After;
import org.junit.Before;

import java.io.IOException;
import java.io.InputStream;
import java.security.PublicKey;
import java.util.Date;
import java.util.List;

public class Test {
    InputStream in;
    SqlSession session;
    UserDao userDao;

    @Before
    public void init() throws IOException {
        //1.读取配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产SqlSession对象
        session = factory.openSession();
        //4.使用SqlSession创建Dao接口的代理对象
        userDao = session.getMapper(UserDao.class);
    }

    @After
    public void destory() throws IOException {
        session.commit();
        //6.释放资源
        session.close();
        in.close();

    }


    /**
     * 测试查询所有
     * @throws IOException
     */
    @org.junit.Test
    public void testSelAll() throws IOException {

        //5.使用代理对象执行方法
        List<User> users = userDao.selAll();
        for(User user : users){
            System.out.println(user);
        }


    }

    /**
     * 测试保存操作
     * @throws IOException
     */
    @org.junit.Test
    public void testSave() throws IOException {

        User user = new User();
        user.setAddress("成都市");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setUsername("zs");

        //5.使用代理对象执行方法
        userDao.saveUser(user);


    }

    /**
     * 测试更新操作
     */
    @org.junit.Test
    public void testUpdate(){
        User user = new User();
        user.setAddress("成都市");
        user.setBirthday(new Date());
        user.setSex("女");
        user.setUsername("zj");
        user.setId(51);
        userDao.updateUser(user);



    }

    /**
     * 测试删除操作
     */
    @org.junit.Test
    public void testDel(){
        Integer id = new Integer(51);
        userDao.deleUserById(id);
    }

    @org.junit.Test

    /**
     * 测试查询操作
     */
    public void testSelOne(){
      User user=userDao.selById(48);
        System.out.println(user);
    }

    /**
     * 测试模糊查询
     */
    @org.junit.Test
    public void testSelByName(){
     List<User> users = userDao.selByName("王");
     users.forEach(x-> System.out.println(x));

    }

    /**
     * 测试总用户数
     */
    @org.junit.Test
    public void testSelUserNums(){
        System.out.println("用户总数是:"+userDao.selUserNums());
    }

    @org.junit.Test
    public void testSelByQuery(){
        Query query = new Query();
        User user = new User();
        user.setUsername("%王%");//模糊查询
        query.setUser(user);
        List<User> users=userDao.selByQuery_UserName(query);
        users.forEach(x-> System.out.println(x));
    }



}

猜你喜欢

转载自www.cnblogs.com/cstdio1/p/11892429.html