• mybatis增删改


    什么是 MyBatis?

    MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

    MyBatis下载:https://github.com/mybatis/mybatis-3/releases

    Mybatis实例

    对一个User表的CRUD操作:

    User表:

    -- ----------------------------
    -- Table structure for `user`
    -- ----------------------------
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `userName` varchar(50) DEFAULT NULL,
      `userAge` int(11) DEFAULT NULL,
      `userAddress` varchar(200) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of user
    -- ----------------------------
    INSERT INTO `user` VALUES ('1', 'summer', '30', 'shanghai');
    INSERT INTO `user` VALUES ('2', 'test2', '22', 'suzhou');
    INSERT INTO `user` VALUES ('3', 'test1', '29', 'some place');
    INSERT INTO `user` VALUES ('4', 'lu', '28', 'some place');
    INSERT INTO `user` VALUES ('5', 'xiaoxun', '27', 'nanjing');
     

    在Src目录下建一个mybatis的xml配置文件Configuration.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>
        <!-- mybatis别名定义 -->
        <typeAliases> 
            <typeAlias alias="User" type="com.mybatis.test.User"/> 
        </typeAliases> 
    
        <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://127.0.0.1:3306/mybatis" />
                <property name="username" value="root"/>
                <property name="password" value="admin"/>
                </dataSource>
            </environment>
        </environments>
        
        <!-- mybatis的mapper文件,每个xml配置文件对应一个接口 -->
        <mappers>
            <mapper resource="com/mybatis/test/User.xml"/>
        </mappers>
    </configuration>

    定义User mappers的User.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.mybatis.test.IUserOperation">
    
        <!-- select语句 -->
        <select id="selectUserByID" parameterType="int" resultType="User">
            select * from `user` where user.id = #{id}
        </select>
        
        <!-- 定义的resultMap,可以解决类的属性名和数据库列名不一致的问题-->
        <!-- <resultMap type="User" id="userResultMap">
            <id property="id" column="user_id"  />
            <result property="userName" column="user_userName"  />
            <result property="userAge" column="user_userAge"  />
            <result property="userAddress" column="user_userAddress"  />
        </resultMap> -->
        
        <!-- 返回list的select语句,注意 resultMap的值是指向前面定义好的 -->
        <!-- <select id="selectUsersByName" parameterType="string" resultMap="userResultMap">
            select * from user where user.userName = #{userName}
        </select> -->
        
        <select id="selectUsersByName" parameterType="string" resultType="User">
            select * from user where user.userName = #{userName}
        </select>
        
        <!--执行增加操作的SQL语句。id和parameterType分别与IUserOperation接口中的addUser方法的名字和参数类型一致。
        useGeneratedKeys设置为"true"表明要MyBatis获取由数据库自动生成的主键;keyProperty="id"指定把获取到的主键值注入到User的id属性--> 
        <insert id="addUser" parameterType="User" 
            useGeneratedKeys="true" keyProperty="id"> 
            insert into user(userName,userAge,userAddress)  
                 values(#{userName},#{userAge},#{userAddress})  
        </insert>
        
        <update id="updateUser" parameterType="User" >
            update user set userName=#{userName},userAge=#{userAge},userAddress=#{userAddress} where id=#{id}
        </update>
        
        <delete id="deleteUser" parameterType="int">
            delete from user where id=#{id}
        </delete>
        
    </mapper>

    配置文件实现了接口和SQL语句的映射关系。selectUsersByName采用了2种方式实现,注释掉的也是一种实现,采用resultMap可以把属性和数据库列名映射关系定义好,property为类的属性,column是表的列名,也可以是表列名的别名!

    User类的定义:

    package com.mybatis.test;
    
    public class User {
        
        private int id;
        private String userName;
        private int userAge;
        private String userAddress;
        
        public int getId() {
            return id;
        }
        
        public void setId(int id) {
            this.id = id;
        }
        
        public String getUserName() {
            return userName;
        }
        
        public void setUserName(String userName) {
            this.userName = userName;
        }
        
        public int getUserAge() {
            return userAge;
        }
        
        public void setUserAge(int userAge) {
            this.userAge = userAge;
        }
        
        public String getUserAddress() {
            return userAddress;
        }
        
        public void setUserAddress(String userAddress) {
            this.userAddress = userAddress;
        }
        
        @Override
        public String toString(){
            return this.userName+" "+this.userAge+" "+this.userAddress;
        }
    
    }
     

    IUserOperaton定义:

     
    package com.mybatis.test;
    
    import java.util.List;
    
    public interface IUserOperation {
        
        public User selectUserByID(int id);
        
        public List<User> selectUsersByName(String userName);
        
        public void addUser(User user);
        
        public void updateUser(User user);
        
        public void deleteUser(int id);
        
    }
     

    IUserOperation为操作接口,函数名和mybatis的xml配置文件中的操作id名对应。

    测试类Test:

     
    package com.mybatis.test;
    
    import java.io.Reader;
    import java.util.List;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    public class Test {
    
        private static SqlSessionFactory sqlSessionFactory;
        private static Reader reader;
    
        static {
            try {
                reader = Resources.getResourceAsReader("Configuration.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static SqlSessionFactory getSession() {
            return sqlSessionFactory;
        }
    
        public void getUserByID(int userID) {
            SqlSession session = sqlSessionFactory.openSession();
            try {
                IUserOperation userOperation = session
                        .getMapper(IUserOperation.class);
                User user = userOperation.selectUserByID(userID);
                if (user != null) {
                    System.out.println(user.getId() + ":" + user.getUserName()
                            + ":" + user.getUserAddress());
                }
    
            } finally {
                session.close();
            }
        }
    
        public void getUserList(String userName) {
            SqlSession session = sqlSessionFactory.openSession();
            try {
                IUserOperation userOperation = session
                        .getMapper(IUserOperation.class);
                List<User> users = userOperation.selectUsersByName(userName);
                for (User user : users) {
                    System.out.println(user.getId() + ":" + user.getUserName()
                            + ":" + user.getUserAddress());
                }
    
            } finally {
                session.close();
            }
        }
    
        /**
         * 增加后要commit
         */
        public void addUser() {
            User user = new User();
            user.setUserAddress("place");
            user.setUserName("test_add");
            user.setUserAge(30);
            SqlSession session = sqlSessionFactory.openSession();
            try {
                IUserOperation userOperation = session
                        .getMapper(IUserOperation.class);
                userOperation.addUser(user);
                session.commit();
                System.out.println("新增用户ID:" + user.getId());
            } finally {
                session.close();
            }
        }
    
        /**
         * 修改后要commit
         */
        public void updateUser() {
            SqlSession session = sqlSessionFactory.openSession();
            try {
                IUserOperation userOperation = session
                        .getMapper(IUserOperation.class);
                User user = userOperation.selectUserByID(1);
                if (user != null) {
                    user.setUserAddress("A new place");
                    userOperation.updateUser(user);
                    session.commit();
                }
            } finally {
                session.close();
            }
        }
    
        /**
         * 删除后要commit.
         * 
         * @param id
         */
        public void deleteUser(int id) {
            SqlSession session = sqlSessionFactory.openSession();
            try {
                IUserOperation userOperation = session
                        .getMapper(IUserOperation.class);
                userOperation.deleteUser(id);
                session.commit();
            } finally {
                session.close();
            }
        }
    
        public static void main(String[] args) {
            try {
                Test test = new Test();
                // test.getUserByID(1);
                // test.getUserList("test1");
                // test.addUser();
                // test.updateUser();
                // test.deleteUser(6);
    
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    
    }
     

     MyBatis Mapper单个参数、多个参数传参区别

    1、单个参数

    mybatis不会做特殊处理
    #{参数名/任意名}:取出参数值。

    在接口EmployeeMapper.java中有

    public Employee getEmpById(Integer id);

    EmployeeMapper.xml中用#{id}取出参数值,因为只有一个,用任意名也可以,如下:

    <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
             select * from tbl_employee where id = #{abcde}
    </select>

    2、多个参数

    mybatis会做特殊处理

    我们在接口EmployeeMapper.java中新加一个方法:

    public Employee getEmpByIdAndLastName(Integer id,String lastName); 

    取值方法:用#{id},#{lastName}这种方式取出参数

    <select id="getEmpByIdAndLastName" resultType="com.atguigu.mybatis.bean.Employee">
            select * from tbl_employee where id = #{id} and last_name=#{lastName}
        </select>

    结果出异常了:

        org.apache.ibatis.binding.BindingException: 
        Parameter 'id' not found. 
        Available parameters are [1, 0, param1, param2]

    【命名参数】:明确指定封装参数:

    public Employee getEmpByIdAndLastName(@Param("id") Integer id, @Param("lastName") String lastName);

    这样就用#{id},#{lastName}这种方式取出参数了:

    <select id="getEmpByIdAndLastName" resultType="com.atguigu.mybatis.bean.Employee">
            select * from tbl_employee where id = #{id} and last_name=#{lastName}
    </select>
      
  • 相关阅读:
    MS SQLSERVER 第三天
    MS SQLSERVER 第二天
    今天开始我的 MSSQLSERVER 之旅
    从今天开始就正式我的博客之旅
    mac 本地搭建mybatisGenerator代码生成环境
    idea中git远程版本回退
    Junit调试解决本地多线程异步调用
    Lambda表达式总结
    JDK8函数式编程之Stream API
    MySql分页查询慢的解决方案
  • 原文地址:https://www.cnblogs.com/F017/p/11605803.html
Copyright © 2020-2023  润新知