动态代理下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文件:

<?xml version="1.0" encoding="UTF-8"?>

<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.0</modelVersion>

  <groupId>com.user</groupId>
  <artifactId>mybatis_002_users</artifactId>
  <version>1.0</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <!--添加mysql依赖-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.26</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!--添加mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>
  </dependencies>
  <!--添加资源文件的指定-->
   <!--如果不添加资源文件指定,默认只编译src/main/resources下的资源文件-->
  <build>
    <resources>
      <!--src/main/java下的xml和properties文件在编译时都会被加到编译目录下-->
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
          <include>**/*.properties</include>
        </includes>
      </resource>
      <!--src/main/resources下的xml和properties文件在编译时都会被加到编译目录下-->
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.xml</include>
          <include>**/*.properties</include>
        </includes>
      </resource>
    </resources>
  </build>
</project>

五、SqlMapConfig.xml文件:

  • 此文件是MyBatis的核心配置文件,必须有,且只能有一个。
  • 此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
<!--前四行格式固定,直接复制粘贴-->
<?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>
    <!--读取jdbc.properties属性文件
    属性:
        resources:从resources目录下找指定名称的文件加载
        url:使用绝对路径加载属性文件
    -->
    <properties resource="jdbc.properties"></properties>
    <!--设置日志输出-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--注册实体类别名
		标签:
			package:为该包下所有类注册别名
			typeAlias:为单个类注册别名
	-->
    <typeAliases>
        <package name="com.user.pojo"/>
    </typeAliases>
    <!--配置数据库的环境变量(数据库连接配置)
    属性:
        default:使用下面的environment标签的id属性进行指定配置
    -->
    <environments default="development">
	    <!--
	    <environment>标签可以有多个,使用哪个就将default设成哪个id的值。
	    一个<environment>对应一个SqlSessionFactory对象,一个SqlSessionFactory对象对应一个数据库。
	    -->
        <environment id="development">
            <!--配置事务管理器
            属性:
                type:指定事务管理的方式{
                             "JDBC":事务的控制交给程序员处理
                             "MANAGED":事务的控制由容器(Spring)来管理
                                    }
            -->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源,为程序提供Connection对象。
            数据源在JDK中实际上是一套规范,,我们自己也可以编写数据源组件,只要实现javax.sql.DataSource接口就行了。
            常见数据源组件:druid德鲁伊连接池。
                type:指定不同的配置方式{
                            "JNID":java命名目录接口,在服务器端进行数据库连接池管理
                            "POOLED":使用数据库连接池
                            "UNPOOLED":不使用数据库连接池
                                    }
            -->
            <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>
    <!--注册mapper.xml文件,使Mybatis能找到这些文件
    属性:
        resources:从resources目录下找指定名称的文件注册
        url:使用绝对路径注册文件
        class:动态代理方式下的注册,接口的全限定类名
    -->
    <mappers>
    	<!--使用动态代理,这里属性需要class=业务接口,不使用动态代理这里属性需要指定resource=xml文件-->
    	<!--使用批量注册这里使用package标签,表示包内的所有xml文件都被注册-->
        <mapper class="com.user.mapper.UsersMapper"></mapper>
        <!--这里是批量注册,表示com.user.mapper包下的所有文件都被注册-->
        <package name="com.user.mapper"></package>
    </mappers>
</configuration>

六、UsersMapper.xml文件:

  • sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
  • 可以有多个Mapper.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:指定命名空间(相当于包名),用来区分不同mapper.xml文件

-->
<!--标签中写具体语句,非动态代理这里的namespace可随便写,动态代理下必须写业务接口的全限定类名-->
<mapper namespace="com.user.mapper.UsersMapper">

    <!--完成查询全部学生的功能
    List<Student> getAll();
    属性:
        id:方法名,后续通过这个id调用sql语句
        resultType:指定查询返回的结果集的类型,必须是全限定类名,因为要通过反射创建类对象。如果是集合,则必须是泛型,注意!!!。
        parameterType:指定传入参数的类型
	-->
    <select id="getAll" resultType="user">
        select id,username,birthday,sex,address
        from users;
    </select>
    
    <!--按主键id查询学生信息
    Student getById(Integer id);
	-->    
	<select id="getById" parameterType="Integer" resultType="user">
        select id,username,birthday,sex,address
        from users
        where id = #{id};
    </select>
    
    <!--按学生名模糊查询学生信息
    List<Student> getByName(String name);
	-->    
    <select id="getByName" parameterType="String" resultType="user">
        select id,username,birthday,sex,address
        from users
        where username like "%${name}%";
    </select>

    <!--更新学生信息
	int update(Student stu);
	增删改不需要写resultType,mybatis内部自己写了
	-->
    <update id="update" parameterType="user">
        /*这里的参数是user类中的属性*/
        update users set username = #{userName},birthday = #{birthday},sex = #{sex},address = #{address}
        where id = #{id};
    </update>

    <!--增加学生
    int insert(Student stu);
    增删改不需要写resultType,mybatis内部自己写了
	-->
    <insert id="insert" parameterType="user">
        /*这里的参数是user类中的属性*/
        insert into users(id,username,birthday,sex,address) value(#{id},#{userName},#{birthday},#{sex},#{address});
    </insert>

    <!--按主键删除学生
	int delete(Integer id);
	增删改不需要写resultType,mybatis内部自己写了
	-->
    <delete id="delete" parameterType="Integer">
        delete from users where id = #{id};
    </delete>
</mapper>

七、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);
}

八、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 + '\'' +
                '}';
    }
}


九、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<Student> 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();
    }
}

十、jdbc.properties属性文件:

  • 属性配置文件,封装了连接数据库的信息
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.username=*******
jdbc.password=*******
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姓蔡小朋友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值