• mybatis实现增删改查操作


    如果有疑问可以先看上一篇博文:mybatis入门环境的部署

    下面开始展示Mybatis的增删改查操作

    在Maven项目中需要的环境如下:

    <!--如下是maven的导包问题-->
    
      <dependencies>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>2.5</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.0</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.6</version>
        </dependency>
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.4.5</version>
        </dependency>
        <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.17</version>
        </dependency>
      </dependencies>
    View Code

    MyBatis框架在操作数据库时,大体经过了8个步骤。具体如下。

    1)读取MyBatis配置文件mybatis-config.xml。mybatis-config.xml作为MyBatis的全局配置文件,配置了MyBatis的运行环境等信息,其中主要内容是获取数据库连接。

    (2)加载映射文件Mapper.xml。Mapper.xml文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在mybatis-config.xml中加载才能执行。mybatis-config.xml可以加载多个配置文件,每个配置文件对应数据库中的一张表。

    (3)构建会话工厂。通过MyBatis的环境等配置信息构建会话工厂SqlSessionFactory。

    (4)创建SqlSession对象。由会话工厂创建SqlSession对象,该对象中包含了执行SQL的所有方法。

    (5)MyBatis底层定义了一个Executor接口来操作数据库,它会根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。

    (6)在Executor接口的执行方法中,包含一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等。Mapper.xml文件中一个SQL对应一个MappedStatement对象,SQL的id即是MappedStatement的id。

    (7)输入参数映射。在执行方法时,MappedStatement对象会对用户执行SQL语句的输入参数进行定义(可以定义为Map、List类型、基本类型和POJO类型), Executor执行器会通过MappedStatement对象在执行SQL前,将输入的Java对象映射到SQL语句中。这里对输入参数的映射过程就类似于JDBC编程中对preparedStatement对象设置参数的过程。

    (8)输出结果映射。在数据库中执行完SQL语句后,MappedStatement对象会对SQL执行输出的结果进行定义(可以定义为Map和List类型、基本类型、POJO类型), Executor执行器会通过MappedStatement对象在执行SQL语句后,将输出结果映射至Java对象中。这种将输出结果映射到Java对象的过程就类似于JDBC编程中对结果的解析处理过程。通过上面对MyBatis框架执行流程的讲解,相信读者对MyBatis框架已经有了一个初步的了解。对于初学者来说,上面所讲解的内容可能不会完全理解,现阶段也不要求读者能完全理解,这里讲解MyBatis框架的执行过程是为了方便后面程序的学习。在学习完MyBatis框架后,读者自然就会明白上面所讲解的内容了。

    如上是测试时对配置文件的读取操作是以上八个步骤的演示

    如上是映射文件的查询代码

    如上是实现方法的接口

    测试案例的代码

    如上图所示是结果显示的代码

    映射文件的完整代码

    <?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="top.zyz.dao.UserDao">
        <!--配置查询所有-->
        <select id="findAll" resultType="top.zyz.damain.User">
           select *from user
       </select>
        <!--保存用户-->
        <insert id="saveUsers" parameterType="top.zyz.damain.User">
            <!-- 配置插入操作后,获取插入数据的id -->
            <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
                select last_insert_id();
            </selectKey>
            insert into user(username,password,useremail)values(#{username},#{password},#{useremail});
        </insert>
        <!--更新用户的信息-->
        <update id="updateUser" parameterType="top.zyz.damain.User">
            update user set username=#{username},password=#{password},useremail=#{useremail} where id=#{id}
        </update>
        <!--删除用户-->
        <delete id="deleteUser" parameterType="java.lang.Integer">
            delete from user where id=#{id}
        </delete>
    </mapper>
    View Code

    用户接口类的完整代码

    import top.zyz.damain.User;
    
    import java.util.List;
    
    /*
    * 用户接口方法
    * */
    public interface UserDao {
        /*
        * 查询所有的用户信息
        * */
        List<User> findAll();
        /*
        * 保存用户方法
        * */
        void saveUser(User user);
        /*
        * 更新用户操作
        * */
        void updateUser(User user);
        /*
        *删除用户
        * */
        void deleteUser(int id);
    
    }
    View Code

    实现类的完整方法

    import com.zyz.dao.UserDao;
    import com.zyz.domain.Users;
    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 org.junit.Test;
    import java.io.InputStream;
    import java.util.Date;
    import java.util.List;
    
    public class MybatisTest2 {
        private InputStream in;
        private SqlSession sqlSession;
        private UserDao usersDao;
        @Before//用于在测试方法执行之前执行
        public void init()throws Exception{
            //1.读取配置文件,生成字节输入流
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            //2.获取SqlSessionFactory
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
            //3.获取SqlSession对象
            sqlSession = factory.openSession();
            //4.获取dao的代理对象
            usersDao=sqlSession.getMapper(UserDao.class);
        }
        @After//用于在测试方法执行之后执行
        public void destroy()throws Exception{
            //提交事务
            sqlSession.commit();
            //6.释放资源
            sqlSession.close();
            in.close();
        }
        @Test
        public void test1(){
            Users users=new Users();
            users.setUsername("test2");
            users.setAddress("test2");
            users.setSex("");
            users.setBirthday(new Date());
            System.out.println("保存操作之前:"+users);
            //5.执行保存方法
            usersDao.saveUsers(users);
            System.out.println("保存操作之后:"+users);
        }
        /*测试查询所有*/
        @Test
        public void test2(){
            List<Users> users=usersDao.findAll();
            for(Users user:users){
                System.out.println(user);
            }
        }
        /*测试更新操作*/
        @Test
        public void test3(){
            Users user=new Users();
            user.setId(50);
            user.setUsername("mybastis update user");
            user.setAddress("mybastis update user");
            user.setSex("");
            user.setBirthday(new Date());
            usersDao.updateUsers(user);
        }
        /*
        * 测试删除案例
        * */
        @Test
        public void testdeleteUsers(){
            int id=50;
            usersDao.deleteUsers(id);
        }
        /**
         * 测试模糊查询操作
         */
        @Test
        public void testFindByName(){
            List<Users> users=usersDao.findByName("%王%");
            for(Users user:users){
                System.out.println(user);
            }
        }
        /**
         * 测试查询总记录条数
         */
        @Test
        public void testFindTotal(){
            //5.执行查询一个方法
            int count = usersDao.findTotal();
            System.out.println(count);
        }
    }
    View Code

    模糊查询可以使用如上的方式进行

    SqlSession对象中包含了很多方法,其常用方法如下所示。

    <T> T selectOne(String statement);

    查询方法。参数statement是在配置文件中定义的<select>元素的id。使用该方法后,会返回执行SQL语句查询结果的一条泛型对象。

    · <T> T selectOne(String statement, Object parameter);

    查询方法。参数statement是在配置文件中定义的<select>元素的id, parameter是查询所需的参数。使用该方法后,会返回执行SQL语句查询结果的一条泛型对象。

    · <E> List<E> selectList(String statement);

    查询方法。参数statement是在配置文件中定义的<select>元素的id。使用该方法后,会返回执行SQL语句查询结果的泛型对象的集合。·

    <E> List<E> selectList(String statement, Object parameter);

    查询方法。参数statement是在配置文件中定义的<select>元素的id, parameter是查询所需的参数。使用该方法后,会返回执行SQL语句查询结果的泛型对象的集合。

    <E> List<E> selectList(String statement, Object parameter, RowBoundsrowBounds);

    查询方法。参数statement是在配置文件中定义的<select>元素的id, parameter是查询所需的参数,rowBounds是用于分页的参数对象。使用该方法后,会返回执行SQL语句查询结果的泛型对象的集合。

    · void select(String statement, Object parameter, ResultHandler handler);

    查询方法。参数statement是在配置文件中定义的<select>元素的id, parameter是查询所需的参数,ResultHandler对象用于处理查询返回的复杂结果集,通常用于多表查询。

    · int insert(String statement);

    插入方法。参数statement是在配置文件中定义的<insert>元素的id。使用该方法后,会返回执行SQL语句所影响的行数。

    · int insert(String statement, Object parameter);

    插入方法。参数statement是在配置文件中定义的<insert>元素的id, parameter是插入所需的参数。使用该方法后,会返回执行SQL语句所影响的行数。

    · int update(String statement);

    更新方法。参数statement是在配置文件中定义的<update>元素的id。使用该方法后,会返回执行SQL语句所影响的行数。

    · int update(String statement, Object parameter);

    更新方法。参数statement是在配置文件中定义的<update>元素的id, parameter是更新所需的参数。使用该方法后,会返回执行SQL语句所影响的行数。

    · int delete(String statement);

    删除方法。参数statement是在配置文件中定义的<delete>元素的id。使用该方法后,会返回执行SQL语句所影响的行数。

    · int delete(String statement, Object parameter);

    删除方法。参数statement是在配置文件中定义的<delete>元素的id, parameter是删除所需的参数。使用该方法后,会返回执行SQL语句所影响的行数。

    · void commit();

    提交事务的方法。

    · void rollback();

    回滚事务的方法。

     void close();

    关闭SqlSession对象。

    · <T> T getMapper(Class<T> type);

    该方法会返回Mapper接口的代理对象,该对象关联了SqlSession对象,开发人员可以使用该对象直接调用方法操作数据库。参数type是Mapper的接口类型。MyBatis官方推荐通过Mapper对象访问MyBatis。

    · Connection getConnection();

    获取JDBC数据库连接对象的方法。

    但是注意一下:sqlsession的对象在使用时一定注意:不同dao映射文件中的方法名不要相同,否则会报错的

    OGNL表达式:
      Object Graphic Navigation Language
      对象 图 导航 语言

      它是通过对象的取值方法来获取数据。在写法上把get给省略了。
        比如:我们获取用户的名称
          类中的写法:user.getUsername();
          OGNL表达式写法:user.username
      mybatis中为什么能直接写username,而不用user.呢:
            因为在parameterType中已经提供了属性所属的类,所以此时不需要写对象名

    请参考:

     

    一纸高中万里风,寒窗读破华堂空。 莫道长安花看尽,由来枝叶几相同?
  • 相关阅读:
    负数之美
    css重设
    编码问题
    wed的各种前端打印方法(3)CSS
    表单
    学习前端心得
    去除input,a,按键链接时出现的虚线方法
    加载事件js代码
    深入C#数据类型
    查找
  • 原文地址:https://www.cnblogs.com/byczyz/p/14402247.html
Copyright © 2020-2023  润新知