zoukankan      html  css  js  c++  java
  • MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作

    一、使用MyBatis对表执行CRUD操作——基于XML的实现

    1、定义sql映射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,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
    例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除后缀)
     -->
    <mapper namespace="me.gacl.mapping.userMapper">
        <!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复
        使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
        resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回
        User类就是users表所对应的实体类
        -->
        <!-- 
            根据id查询得到一个user对象
         -->
        <select id="getUser" parameterType="int" 
            resultType="me.gacl.domain.User">
            select * from users where id=#{id}
        </select>
        
        <!-- 创建用户(Create) -->
        <insert id="addUser" parameterType="me.gacl.domain.User">
            insert into users(name,age) values(#{name},#{age})
        </insert>
        
        <!-- 删除用户(Remove) -->
        <delete id="deleteUser" parameterType="int">
            delete from users where id=#{id}
        </delete>
        
        <!-- 修改用户(Update) -->
        <update id="updateUser" parameterType="me.gacl.domain.User">
            update users set name=#{name},age=#{age} where id=#{id}
        </update>
        
        <!-- 查询全部用户-->
        <select id="getAllUsers" resultType="me.gacl.domain.User">
            select * from users
        </select>
        
    </mapper>
    

     单元测试类代码如下:

    package me.gacl.test;
    
    import java.util.List;
    import me.gacl.domain.User;
    import me.gacl.util.MyBatisUtil;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    public class TestCRUDByXmlMapper {
    
        @Test
        public void testAdd(){
            //SqlSession sqlSession = MyBatisUtil.getSqlSession(false);
            SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
            /**
             * 映射sql的标识字符串,
             * me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
             * addUser是insert标签的id属性值,通过insert标签的id属性值就可以找到要执行的SQL
             */
            String statement = "me.gacl.mapping.userMapper.addUser";//映射sql的标识字符串
            User user = new User();
            user.setName("用户孤傲苍狼");
            user.setAge(20);
            //执行插入操作
            int retResult = sqlSession.insert(statement,user);
            //手动提交事务
            //sqlSession.commit();
            //使用SqlSession执行完SQL之后需要关闭SqlSession
            sqlSession.close();
            System.out.println(retResult);
        }
        
        @Test
        public void testUpdate(){
            SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
            /**
             * 映射sql的标识字符串,
             * me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
             * updateUser是update标签的id属性值,通过update标签的id属性值就可以找到要执行的SQL
             */
            String statement = "me.gacl.mapping.userMapper.updateUser";//映射sql的标识字符串
            User user = new User();
            user.setId(3);
            user.setName("孤傲苍狼");
            user.setAge(25);
            //执行修改操作
            int retResult = sqlSession.update(statement,user);
            //使用SqlSession执行完SQL之后需要关闭SqlSession
            sqlSession.close();
            System.out.println(retResult);
        }
        
        @Test
        public void testDelete(){
            SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
            /**
             * 映射sql的标识字符串,
             * me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
             * deleteUser是delete标签的id属性值,通过delete标签的id属性值就可以找到要执行的SQL
             */
            String statement = "me.gacl.mapping.userMapper.deleteUser";//映射sql的标识字符串
            //执行删除操作
            int retResult = sqlSession.delete(statement,5);
            //使用SqlSession执行完SQL之后需要关闭SqlSession
            sqlSession.close();
            System.out.println(retResult);
        }
        
        @Test
        public void testGetAll(){
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            /**
             * 映射sql的标识字符串,
             * me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
             * getAllUsers是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
             */
            String statement = "me.gacl.mapping.userMapper.getAllUsers";//映射sql的标识字符串
            //执行查询操作,将查询结果自动封装成List<User>返回
            List<User> lstUsers = sqlSession.selectList(statement);
            //使用SqlSession执行完SQL之后需要关闭SqlSession
            sqlSession.close();
            System.out.println(lstUsers);
        }
    }
    

    二、使用MyBatis对表执行CRUD操作——基于注解的实现

      1、定义sql映射的接口

      UserMapperI接口的代码如下:

    package me.gacl.mapping;
    
    import java.util.List;
    import me.gacl.domain.User;
    import org.apache.ibatis.annotations.Delete;
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Select;
    import org.apache.ibatis.annotations.Update;
    
    /**
     * @author gacl
     * 定义sql映射的接口,使用注解指明方法要执行的SQL
     */
    public interface UserMapperI {
    
        //使用@Insert注解指明add方法要执行的SQL
        @Insert("insert into users(name, age) values(#{name}, #{age})")
        public int add(User user);
        
        //使用@Delete注解指明deleteById方法要执行的SQL
        @Delete("delete from users where id=#{id}")
        public int deleteById(int id);
        
        //使用@Update注解指明update方法要执行的SQL
        @Update("update users set name=#{name},age=#{age} where id=#{id}")
        public int update(User user);
        
        //使用@Select注解指明getById方法要执行的SQL
        @Select("select * from users where id=#{id}")
        public User getById(int id);
        
        //使用@Select注解指明getAll方法要执行的SQL
        @Select("select * from users")
        public List<User> getAll();
    }
    

     需要说明的是,我们不需要针对UserMapperI接口去编写具体的实现类代码,这个具体的实现类由MyBatis帮我们动态构建出来,我们只需要直接拿来使用即可。

      2、在conf.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 default="development">
            <environment id="development">
                <transactionManager type="JDBC" />
                <!-- 配置数据库连接信息 -->
                <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="XDP" />
                </dataSource>
            </environment>
        </environments>
        
        <mappers>
            <!-- 注册userMapper.xml文件, 
            userMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/userMapper.xml-->
            <mapper resource="me/gacl/mapping/userMapper.xml"/>
            <!-- 注册UserMapper映射接口-->
            <mapper class="me.gacl.mapping.UserMapperI"/>
        </mappers>
        
    </configuration>
    

     单元测试类的代码如下:

    package me.gacl.test;
    
    import java.util.List;
    import me.gacl.domain.User;
    import me.gacl.mapping.UserMapperI;
    import me.gacl.util.MyBatisUtil;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    public class TestCRUDByAnnotationMapper {
    
        @Test
        public void testAdd(){
            SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
            //得到UserMapperI接口的实现类对象,UserMapperI接口的实现类对象由sqlSession.getMapper(UserMapperI.class)动态构建出来
            UserMapperI mapper = sqlSession.getMapper(UserMapperI.class);
            User user = new User();
            user.setName("用户xdp");
            user.setAge(20);
            int add = mapper.add(user);
            //使用SqlSession执行完SQL之后需要关闭SqlSession
            sqlSession.close();
            System.out.println(add);
        }
        
        @Test
        public void testUpdate(){
            SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
            //得到UserMapperI接口的实现类对象,UserMapperI接口的实现类对象由sqlSession.getMapper(UserMapperI.class)动态构建出来
            UserMapperI mapper = sqlSession.getMapper(UserMapperI.class);
            User user = new User();
            user.setId(3);
            user.setName("孤傲苍狼_xdp");
            user.setAge(26);
            //执行修改操作
            int retResult = mapper.update(user);
            //使用SqlSession执行完SQL之后需要关闭SqlSession
            sqlSession.close();
            System.out.println(retResult);
        }
        
        @Test
        public void testDelete(){
            SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
            //得到UserMapperI接口的实现类对象,UserMapperI接口的实现类对象由sqlSession.getMapper(UserMapperI.class)动态构建出来
            UserMapperI mapper = sqlSession.getMapper(UserMapperI.class);
            //执行删除操作
            int retResult = mapper.deleteById(7);
            //使用SqlSession执行完SQL之后需要关闭SqlSession
            sqlSession.close();
            System.out.println(retResult);
        }
        
        @Test
        public void testGetUser(){
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            //得到UserMapperI接口的实现类对象,UserMapperI接口的实现类对象由sqlSession.getMapper(UserMapperI.class)动态构建出来
            UserMapperI mapper = sqlSession.getMapper(UserMapperI.class);
            //执行查询操作,将查询结果自动封装成User返回
            User user = mapper.getById(8);
            //使用SqlSession执行完SQL之后需要关闭SqlSession
            sqlSession.close();
            System.out.println(user);
        }
        
        @Test
        public void testGetAll(){
            SqlSession sqlSession = MyBatisUtil.getSqlSession();
            //得到UserMapperI接口的实现类对象,UserMapperI接口的实现类对象由sqlSession.getMapper(UserMapperI.class)动态构建出来
            UserMapperI mapper = sqlSession.getMapper(UserMapperI.class);
            //执行查询操作,将查询结果自动封装成List<User>返回
            List<User> lstUsers = mapper.getAll();
            //使用SqlSession执行完SQL之后需要关闭SqlSession
            sqlSession.close();
            System.out.println(lstUsers);
        }
    }
    

    用到的MyBatisUtil工具类代码如下:

    package me.gacl.util;
    
    import java.io.InputStream;
    
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    public class MyBatisUtil {
    
        /**
         * 获取SqlSessionFactory
         * @return SqlSessionFactory
         */
        public static SqlSessionFactory getSqlSessionFactory() {
            String resource = "conf.xml";
            InputStream is = MyBatisUtil.class.getClassLoader().getResourceAsStream(resource);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            return factory;
        }
        
        /**
         * 获取SqlSession
         * @return SqlSession
         */
        public static SqlSession getSqlSession() {
            return getSqlSessionFactory().openSession();
        }
        
        /**
         * 获取SqlSession
         * @param isAutoCommit 
         *         true 表示创建的SqlSession对象在执行完SQL之后会自动提交事务
         *         false 表示创建的SqlSession对象在执行完SQL之后不会自动提交事务,这时就需要我们手动调用sqlSession.commit()提交事务
         * @return SqlSession
         */
        public static SqlSession getSqlSession(boolean isAutoCommit) {
            return getSqlSessionFactory().openSession(isAutoCommit);
        }
    }
    

      以上的相关代码是全部测试通过的,关于使用MyBatis对表执行CRUD操作的内容就这么多。

  • 相关阅读:
    nginx-1.8.1的安装
    ElasticSearch 在3节点集群的启动
    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    sqoop导入导出对mysql再带数据库test能跑通用户自己建立的数据库则不行
    LeetCode 501. Find Mode in Binary Search Tree (找到二叉搜索树的众数)
    LeetCode 437. Path Sum III (路径之和之三)
    LeetCode 404. Sum of Left Leaves (左子叶之和)
    LeetCode 257. Binary Tree Paths (二叉树路径)
    LeetCode Questions List (LeetCode 问题列表)- Java Solutions
    LeetCode 561. Array Partition I (数组分隔之一)
  • 原文地址:https://www.cnblogs.com/MaxElephant/p/8117611.html
Copyright © 2011-2022 走看看