NO.2 MyBatis框架:创建Mapper接口和映射文件,实现基本增删改查

目录

1、Mapper接口和映射文件关系

2、Mapper接口和映射文件的命名规则

2.1 Mapper接口的命名规则

2.2 映射文件的命名规则

3、Mapper接口和映射文件的创建及增删改查的实现

3.1 Mapper接口和映射文件的创建

3.2 增删改查的实现

3.2.1表结构

3.2.2 创建表User对应的实体类

3.3.3 创建表User对应的Mapper接口

3.3.4 创建UserMapper接口对应的映射文件,并实现Sql语句

4、MyBatis核心配置文件关联Mapper接口和映射文件

5、测试Mapper接口中的方法

6、测试结果


1、Mapper接口和映射文件关系

个人理解为:Mapper接口类似于以前的Dao接口,映射文件类似于实现Dao接口中的各个方法。

在Mapper接口中定义了对数据库的各种操作方法,这些方法的实现需要在映射文件编写各种SQL语句。

2、Mapper接口和映射文件的命名规则

一个Mapper接口(映射文件)对应一个实体类,对应一张表的操作方法(SQL语句)。Mapper接口用于声明操作数据库的方法; MyBatis映射文件用于编写SQL,访问以及操作表中的数据。

MyBatis的Mapper接口的位置是src/main/项目名/mappers目录下;映射文件存放的位置是src/main/resources/mappers目录下。

2.1 Mapper接口的命名规则

表所对应的实体类的类名+Mapper

例如:表t_user,对应的实体类为User,所对应的Mapper为UserMapper。

2.2 映射文件的命名规则

表所对应的实体类的类名+Mapper.xml

例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml 。

3、Mapper接口和映射文件的创建及增删改查的实现

3.1 Mapper接口和映射文件的创建

Mapper接口的创建和普通的Java接口创建方法相同。

映射文件的创建如下,mapper标签中的namespace属性是mapper接口的路径。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Mapper接口路径">

</mapper>

3.2 增删改查的实现

下面以表t_user为例创建Mapper接口和映射文件,实现基本的增删改查。

3.2.1表结构

t_user表的结构如查下所示:

3.2.2 创建表User对应的实体类

public class User {
    private Integer id;
    private String userName;
    private String password;
    private Integer age;
    private char gender;

    public User() {
    }

    public User(Integer id, String userName, String password, Integer age, char gender) {
        this.id = id;
        this.userName = userName;
        this.password = password;
        this.age = age;
        this.gender = gender;
    }

    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 String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                '}';
    }
}

3.3.3 创建表User对应的Mapper接口

import com.review.mybatis.pojo.User;

public interface UserMapper {
    //添加用户
    int insertUser(User user);
    //根据用户名和密码删除用户
    int deleteUser(String username,String password);
    //修改用户信息
    int modifyUser(User user,Integer id);
    //根据用户名查询用户信息
    User getUserByUsername(String username);
}

3.3.4 创建UserMapper接口对应的映射文件,并实现Sql语句

MyBatis中可以面向接口操作数据,要保证两个一致:

1、mapper接口的全类名和映射文件的命名空间(namespace)保持一致

2、mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.review.mybatis.mapper.UserMapper">
<!--    int insertUser(User user);-->
    <insert id="insertUser" >
        insert into t_user(id,userName,password,age,gender) values(null,#{userName},#{password},#{age},#{gender})
    </insert>
<!--    int deleteUser(String username,String password);-->
    <delete id="deleteUser">
        delete from t_user where username=#{arg0} and password=#{arg1}
    </delete>
<!--    int modifyUser(User user,Integer id);-->
    <update id="modifyUser" >
        update t_user set username=#{arg0.userName},password=#{arg0.password},age=#{arg0.age},gender=#{arg0.gender} where id=#{arg1}
    </update>
<!--    User getUserByUsername(String username);-->
    <select id="getUserByUsername" resultType="User">
        select id,username,password,age,gender from t_user where username=#{arg0}
    </select>
</mapper>

上述代码中mapper接口和映射文件要保证一致:

①mapper接口的全类名和映射文件的namespace一致

②mapper接口的方法的方法名和映射文件中的sql的id保持一致

执行UserMapper接口中的方法时,通过映射文件中属性id绑定的方法名执行Sql语句。

对于查询操作:resultType:设置结果类型,记查询的数据要转换成的java类型,代码中将数据转成User类型

MyBatis获取参数值的两种方式:${}和#{}。

${}的本质就是字符串拼接,#{}的本质就是占位符赋值;${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号。

映射文件中无法识别Mapper接口方法中的形参,若mapper接口中的方法参数为一个时,可以用任何字符串表示该参数;若mapper接口中的方法参数为多个时 此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1...为键,以参数为值;以 param1,param2...为键,以参数为值;因此只需要通过${}和#{}访问map集合的键就可以获取相对应的值。

4、MyBatis核心配置文件关联Mapper接口和映射文件

通过包设置类型别名,指定包下所有的类型将全部拥有默认的别名,即类名且不区分大小写,方便UserMapper.xml文件中resultType属性的设置:

resultType=”User“等同于resultType="com.review.mybatis.pojo.User"

通过包设置类型别名如下所示:

<typeAliases>
    <package name="com.review.mybatis.pojo"/>
</typeAliases>

以包的方式引入映射文件,在通过Mapper接口调用方法时,通过MyBatis核心配置文件查找到映射文件的位置,从而执行sql语句。但是以包的方式引入映射文件必须满足两个条件:
1、mapper接口和映射文件所在的包必须一致
2、mapper接口的名字和映射文件的名字必须一致

如下所示:

    <mappers>
        <package name="com.review.mybatis.mapper"/>
    </mappers>

 完整的MyBatis核心配置文件如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--
        MyBatis核心配置文件中的标签必须要按照指定的顺序配置:
        properties?,settings?,typeAliases?,typeHandlers?,
        objectFactory?,objectWrapperFactory?,reflectorFactory?,
        plugins?,environments?,databaseIdProvider?,mappers?
    -->
    <properties resource="jdbc.properties"/>
    <typeAliases>
        <package name="com.review.mybatis.pojo"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>

        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
                <property name="username" value="root"/>
                <property name="password" value="123456789"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <package name="com.review.mybatis.mapper"/>
    </mappers>
</configuration>

MyBatis配置文件:配置连接数据库的环境,实现数据库连接_qq_46053741的博客-CSDN博客

5、测试Mapper接口中的方法

创建一个测试类,测试Mapper接口中的方法:

import com.review.mybatis.mapper.UserMapper;
import com.review.mybatis.pojo.User;
import com.review.mybatis.utils.JdbcUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;


public class UserMapperTest {

    @Test
    public void insertUser() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        //获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        int isInsert=0;
        isInsert=userMapper.insertUser(new User(null,"小黑子","1234",34,'男'));
        if(isInsert>0){
            System.out.println("数据添加成功");
        }else{
            System.out.println("数据添加失败");
        }
        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }

    @Test
    public void deleteUser() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        //获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        int isDelete=0;
        isDelete=userMapper.deleteUser("蔡徐坤","123456");
        if(isDelete>0){
            System.out.println("数据删除成功");
        }else{
            System.out.println("数据删除失败");
        }
        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }

    @Test
    public void modifyUser() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        //获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        User user=new User(3,"小黑子","1234",30,'男');
        int isModify=0;
        isModify=userMapper.modifyUser(user,3);
        if(isModify>0){
            System.out.println("数据修改成功");
        }else{
            System.out.println("数据修改失败");
        }
        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }

    @Test
    public void getUserByUsername() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        //获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        User user=userMapper.getUserByUsername("小黑子");

        System.out.println(user);

        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }
}

代码中UserMapper接口无法实例化对象,因此采用UserMapper的代理实现类对象
      

UserMapper userMapper=sqlSession.getMapper(UserMapper.class);

6、测试结果

int insertUser(User user)测试结果:

控制台:

数据库:

 

 int modifyUser(User user,Integer id)测试结果:

控制台:

数据库:

 

 User getUserByUsername(String username)测试结果:

控制台:

​​​​​​​ int deleteUser(String username,String password)测试结果:

控制台:

数据库:

​​​​​​​​​​​​​​

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 是一个开源的持久化框架,可以帮助我们简化数据库操作的编写。下面是一个使用 MyBatis 实现增删改查系统的示例: 1. 配置 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> <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="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers> </configuration> ``` 其中,配置文件中需要配置数据库的连接信息和映射文件的位置。 2. 创建数据表 在数据库创建一个用户表,例如: ``` CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` 3. 创建实体类 创建一个 User 实体类,例如: ``` public class User { private Integer id; private String name; private Integer age; // getter and setter } ``` 4. 创建映射文件 在项目中创建一个 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="com.example.mapper.UserMapper"> <!-- 查询全部用户 --> <select id="findAll" resultType="User"> SELECT * FROM user </select> <!-- 根据 id 查询用户 --> <select id="findById" parameterType="int" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> <!-- 新增用户 --> <insert id="insert" parameterType="User"> INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert> <!-- 修改用户 --> <update id="update" parameterType="User"> UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id} </update> <!-- 删除用户 --> <delete id="delete" parameterType="int"> DELETE FROM user WHERE id = #{id} </delete> </mapper> ``` 其中,映射文件中定义了对应的 SQL 语句和参数类型。 5. 创建 DAO 层 创建一个 UserDAO 接口实现类,例如: ``` public interface UserDAO { List<User> findAll(); User findById(Integer id); void insert(User user); void update(User user); void delete(Integer id); } public class UserDAOImpl implements UserDAO { private SqlSessionFactory sessionFactory; public UserDAOImpl(SqlSessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public List<User> findAll() { try (SqlSession session = sessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); return mapper.findAll(); } } public User findById(Integer id) { try (SqlSession session = sessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); return mapper.findById(id); } } public void insert(User user) { try (SqlSession session = sessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); mapper.insert(user); session.commit(); } } public void update(User user) { try (SqlSession session = sessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); mapper.update(user); session.commit(); } } public void delete(Integer id) { try (SqlSession session = sessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); mapper.delete(id); session.commit(); } } } ``` 其中,UserDAO 接口中定义了增删改查的方法,UserDAOImpl 实现了 UserDAO 接口,并且调用了对应的映射文件中的 SQL 语句。 6. 使用 DAO 层 在项目中使用 UserDAO 接口实现类来进行数据库的操作,例如: ``` SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); UserDAO userDAO = new UserDAOImpl(sessionFactory); // 查询全部用户 List<User> userList = userDAO.findAll(); // 根据 id 查询用户 User user = userDAO.findById(1); // 新增用户 User newUser = new User(); newUser.setName("Tom"); newUser.setAge(20); userDAO.insert(newUser); // 修改用户 user.setName("Jerry"); user.setAge(30); userDAO.update(user); // 删除用户 userDAO.delete(1); ``` 这样就可以使用 MyBatis 框架实现增删改查系统了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值