• 动态代理下Mybatis使用方式、简单实现Mybatis的增删改查


    一、动态代理实现规范:

    接口的实现类由mybatis动态生成:
    1.动态代理
    2.javassist动态代理

    1. UsersMapper.xml文件与UsersMapper.java的接口必须同一个目录下
    2. UsersMapper.xml文件与UsersMapper.java的接口的文件名必须一致
    3. UserMapper.xml文件中标签的id值与UserMapper.java的接口中方法名完全一致。
    4. UserMapper.xml文件中标签的parameterType属性值与与UserMapper.java的接口中方法的参数类型完全一致。
    5. UserMapper.xml文件中标签的resultType值与与UserMapper.java的接口中方法的返回值类型完全一致。
    6. UserMapper.xml文件中namespace属性必须是接口的完全限定类名
    7. 在SqlMapConfig.xml文件中注册mapper文件时,使用class=接口的完全限定类名

    二、具体步骤:

    1. 新建库建表。
    2. 新建maven项目,选quickstart模板。
    3. 修改目录,添加缺失的目录。
    4. 修改pom.xml文件,添加MyBatis的依赖,添加mysql的依赖。
    5. 修改pom.xml文件,添加资源文件指定。
    6. 添加jdbc.properties属性文件(数据库的配置)。
    7. 添加SqlMapConfig.xml文件,MyBatis的核心配置文件。
    8. 创建实体类User,用来封装数据。
    9. 添加完成学生表的增删改查的功能的UsersMapper.xml文件,新建UsersMapper接口,两个文件必须在同一文件夹下。
    10. 创建测试类,进行功能测试。

    三、项目结构:Maven项目

    请添加图片描述

    四、pom.xml文件:

    
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0modelVersion>
    
      <groupId>com.usergroupId>
      <artifactId>mybatis_002_usersartifactId>
      <version>1.0version>
    
      <properties>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <maven.compiler.source>1.8maven.compiler.source>
        <maven.compiler.target>1.8maven.compiler.target>
      properties>
    
      <dependencies>
        
        <dependency>
          <groupId>mysqlgroupId>
          <artifactId>mysql-connector-javaartifactId>
          <version>8.0.26version>
        dependency>
        <dependency>
          <groupId>junitgroupId>
          <artifactId>junitartifactId>
          <version>4.11version>
          <scope>testscope>
        dependency>
        
        <dependency>
          <groupId>org.mybatisgroupId>
          <artifactId>mybatisartifactId>
          <version>3.5.6version>
        dependency>
      dependencies>
      
       
      <build>
        <resources>
          
          <resource>
            <directory>src/main/javadirectory>
            <includes>
              <include>**/*.xmlinclude>
              <include>**/*.propertiesinclude>
            includes>
          resource>
          
          <resource>
            <directory>src/main/resourcesdirectory>
            <includes>
              <include>**/*.xmlinclude>
              <include>**/*.propertiesinclude>
            includes>
          resource>
        resources>
      build>
    project>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    五、SqlMapConfig.xml文件:

    • 此文件是MyBatis的核心配置文件,必须有,且只能有一个。
    • 此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
    
    
    DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        
        <properties resource="jdbc.properties">properties>
        
        <settings>
            <setting name="logImpl" value="STDOUT_LOGGING"/>
        settings>
        
        <typeAliases>
            <package name="com.user.pojo"/>
        typeAliases>
        
        <environments default="development">
    	    
            <environment id="development">
                
                <transactionManager type="JDBC">transactionManager>
                
                <dataSource type="POOLED">
                    
                    <property name="driver" value="${jdbc.driverClassName}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.username}"/>
                    <property name="password" value="${jdbc.password}"/>
                dataSource>
            environment>
        environments>
        
        <mappers>
        	
        	
            <mapper class="com.user.mapper.UsersMapper">mapper>
            
            <package name="com.user.mapper">package>
        mappers>
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    六、UsersMapper.xml文件:

    • sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
    • 可以有多个Mapper.xml文件。
    
    
    DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    
    <mapper namespace="com.user.mapper.UsersMapper">
    
        
        <select id="getAll" resultType="user">
            select id,username,birthday,sex,address
            from users;
        select>
        
            
    	<select id="getById" parameterType="Integer" resultType="user">
            select id,username,birthday,sex,address
            from users
            where id = #{id};
        select>
        
            
        <select id="getByName" parameterType="String" resultType="user">
            select id,username,birthday,sex,address
            from users
            where username like "%${name}%";
        select>
    
        
        <update id="update" parameterType="user">
            /*这里的参数是user类中的属性*/
            update users set username = #{userName},birthday = #{birthday},sex = #{sex},address = #{address}
            where id = #{id};
        update>
    
        
        <insert id="insert" parameterType="user">
            /*这里的参数是user类中的属性*/
            insert into users(id,username,birthday,sex,address) value(#{id},#{userName},#{birthday},#{sex},#{address});
        insert>
    
        
        <delete id="delete" parameterType="Integer">
            delete from users where id = #{id};
        delete>
    mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    七、UsersMapper.java接口

    • 业务接口,与UsersMapper.xml文件绑定。
    • 可以通过接口中的方法动态代理获取UsersMapper.xml文件中的标签。
    package com.user.mapper;
    
    import com.user.pojo.User;
    
    import java.util.List;
    
    /*数据访问层的接口,规定了数据库中可进行的各种操作*/
    public interface UsersMapper {
        //查询全部用户信息
        List<User> getAll();
        //根据用户主键查用户
        User getById(int id);
        //根据用户名模糊查询
        List<User> getByName(String name);
        //更新用户信息
        int update(User user);
        //增加用户
        int insert(User user);
        //根据主键删除用户
        int delete(int id);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    八、User类:

    • 作为JavaBean类。
    • 用来封装数据。
    package com.user.pojo;
    
    import java.util.Date;
    
    public class User {
        private Integer id;
        private String userName;
        private Date birthday;
        private String sex;
        private String address;
    
        public User() {
        }
    
        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;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", userName='" + userName + '\'' +
                    ", birthday=" + birthday +
                    ", sex='" + sex + '\'' +
                    ", address='" + address + '\'' +
                    '}';
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82

    九、MyTest类:

    • 测试类,动态代理方式通过UsersMapper接口执行我们在UsersMapper.xml中写的sql语句。
    • 其中查询语句固定格式五步,增删改固定格式六步。
    • 使用@Before和@After降低程序耦合度
    package com.user;
    
    import com.user.mapper.UsersMapper;
    import com.user.pojo.User;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    /*
    *代码格式固定
    */
    public class MyTest {
        SqlSession sqlSession;
        @Before
        public void openSqlSession() throws IOException {
            //第一步:使用IO流读取核心配置文件SqlMapConfig.xml
            InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
            //第二步:创建SqlSessionFactory工厂
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
            //第三步:取出SqlSession的对象
            sqlSession = factory.openSession();
        }
        @After
        public void closeSqlSession(){
            //第五步:关闭SqlSession对象(还回到数据库连接池)
            sqlSession.close();
        }
        
        @Test
        public void testGetAll(){
        /*
        	不使用动态代理:通过xml文件属性名为getAll的标签获取执行sql语句
    		List list = sqlSession.selectList("clh.getAll");
            list.forEach(user -> System.out.println(user));
         */
            //取出动态代理对象
            UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
            //调用接口的方法执行sql语句
            List<User> list = usersMapper.getAll();
            list.forEach(user -> System.out.println(user));
        }
        
         @Test
        public void testgetById(){
            UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
            User user = usersMapper.getById(1);
            System.out.println(user.toString());
        }
        
        @Test
        public void testgetByName(){
            UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
            List<User> list = usersMapper.getByName("张");
            list.forEach(user -> System.out.println(user));
        }
        
        @Test
        public void testupdate() throws ParseException {
            UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
            User user = new User(7,"王五",new SimpleDateFormat("yyyy-MM-dd").parse("2001-11-02"),"2","北京");
            usersMapper.update(user);
            sqlSession.commit();
        }
        
        @Test
        public void testinsert() throws ParseException {
            UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
            User user = new User(8,"李根儿",new SimpleDateFormat("yyyy-MM-dd").parse("1995-11-02"),"1","北京");
            usersMapper.insert(user);
            sqlSession.commit();
        }
        
        @Test
        public void testdelete() throws ParseException {
            UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
            usersMapper.delete(1);
            sqlSession.commit();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87

    十、jdbc.properties属性文件:

    • 属性配置文件,封装了连接数据库的信息
    jdbc.driverClassName=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/ssm
    jdbc.username=*******
    jdbc.password=*******
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    jwt_拦截器_校验token
    【Android笔记44】Android利用DrawerLayout布局组件实现侧滑导航菜单的效果
    使用XShell、XFTP连接虚拟机或者服务器教程
    Python爬虫实现(requests、BeautifulSoup和selenium)
    BitSet源码解析,位运算玩的真六
    链表OJ(2)
    SpringCloud面试百题集
    01-服务与服务间的通信
    人工智能2021年10大应用
    密码学算法教程
  • 原文地址:https://blog.csdn.net/m0_53881899/article/details/126848141