【1】Mybatis入门、增删改查

Mybatis

需要基础:

  • JDBC
  • Mysql
  • Java基础
  • Maven
  • Junit

1、简介

1.1、什么是Mybatis

  • MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
  • MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了[google code](https://baike.baidu.com/item/google code/2346604),并且改名为MyBatis 。
  • 2013年11月迁移到Github

1.2、如何获取Mybatis

  • Github:

1.3、持久化

数据持久化

  • 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
  • 内存:断电即失
  • 数据库(jdbc),io文件持久化。
  • 生活中:冷藏、罐头、照片

为什么需要持久化?

  • 有一些对象,不能让他丢掉。

  • 内存太贵

1.4、持久层

Dao层、Service层、Controller层

  • 完成持久化工作的代码块
  • 曾界限十分明显

1.5、为什么需要Mybatis

  • 方便

  • 传统的jdbc代码太复杂了。为了简化,出现了框架,自动化

  • 帮助程序猿将数据存入到数据库中

  • 不用mybatis也可以。更容易上手。

  • 优点:

    • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
    • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
    • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
    • 提供映射标签,支持对象与数据库的orm字段关系映射。
    • 提供对象关系映射标签,支持对象关系组建维护。
    • 提供xml标签,支持编写动态sql。

2、第一个Mybatis程序

思路:搭建环境–>导入Mybatis—>编写代码—>测试

3、CRUD

1、namespace

namespace中的包名要和Dao/mapper接口的包名一致!

2、select

选择,查询语句:

  • id:就是对应的namespace的方法名
  • resultType:sql语句执行的返回值
  • parameterType:抽象方法输入的参数类型

实现过程:下面插入、修改、删除步骤都一样

  1. 编写接口抽象方法
List<User> getUserInfo();
  1. 编写对应的mapper.xml中的sql语句
<mapper namespace="com.kuber.dao.UserMapper">
    <select id="getUserInfo" resultType="com.kuber.pojo.User">
        select * from users
    </select>
</mapper>
  1. 测试
@Test
    public void getUserInfo(){
    
    
        /*获取SqlSession*/
        SqlSession sqlSession;
        try {
    
    
            /*获取SqlSession*/
            sqlSession = MybatisUtils.getSqlSession();

            /*执行sql*/
            /*相当于 UserMapper mapper = new UserMapperImpl();*/
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            List<User> users = mapper.getUserInfo();
            for (User user : users) {
    
    
                System.out.println(user);
            }
            sqlSession.close();
        }finally {
    
    
            MybatisUtils.closeSqlSession();
        }
    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rfdhL4xD-1604566530913)(img\执行结果1.png)]

3、insert

  1. 编写接口方法
int addUser(User user);
  1. 编写对应的mapper.xml中的sql语句
	<insert id="addUser" parameterType="com.kuber.pojo.User">
        insert into users values(#{uid},#{username},#{password})
    </insert>
  1. 测试
@Test
    public void addUser(){
    
    
        /*增删改必须要提交事务*/
        SqlSession sqlSession;
        try {
    
    
            sqlSession = MybatisUtils.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            User user = new User(null,"tonyma","111");
            int num = mapper.addUser(user);
            if(num > 0){
    
    
                System.out.println("插入成功");
            }else {
    
    
                System.out.println("插入失败");
            }
            /*提交事务*/
            sqlSession.commit();
        }finally {
    
    
            MybatisUtils.closeSqlSession();
        }

    }

4、update

  1. 编写接口方法
    int updateUser(User user);
  1. 编写对应的mapper.xml中的sql语句
<update id="updateUser" parameterType="com.kuber.pojo.User">
	update users set username = #{username},password = #{password} where uid = #{uid}
</update>
  1. 测试
    @Test
    public void updateUser(){
    
    
        SqlSession sqlSession;
        try {
    
    
            sqlSession = MybatisUtils.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            int num = mapper.updateUser(new User(7,"jackma","123456"));
            if (num > 0){
    
    
                System.out.println("修改成功");
            }else {
    
    
                System.out.println("修改失败");
            }
            sqlSession.commit();
        }finally {
    
    
            MybatisUtils.closeSqlSession();
        }


    }

5、delete

  1. 编写接口方法
    int deleteUser(int id);
  1. 编写对应的mapper.xml中的sql语句
    <delete id="deleteUser" parameterType="int">
        delete from users where uid = #{id}
    </delete>
  1. 测试
    @Test
    public void deleteUser(){
    
    
        SqlSession sqlSession;
        try {
    
    
            sqlSession = MybatisUtils.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            int num = mapper.deleteUser(9);
            if (num > 0){
    
    
                System.out.println("删除成功");
            }else{
    
    
                System.out.println("删除失败");
            }
            sqlSession.commit();
        }finally {
    
    
            MybatisUtils.closeSqlSession();
        }


    }
  • 增删改需要提交事务!

6、易出错点

  • 标签不要匹配错

  • resource绑定mapper,需要使用路径

  • 程序配置文件必须符合规范

  • maven资源没有导出问题

    在pom.xml文件中添加如下代码块

        <!--在build中配置resours,来防止我们资源导出失败的问题-->
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
            </resources>
        </build>
    

7、万能Map

假设,我们的实体类,或者数据库中的表,字段或者参数过多,可以使用Map

    <insert id="addUser2" parameterType="map">
        insert into users(uid,username,password) values(#{uid},#{uname},#{upwd})
    </insert>
@Test
public void addUser2(){
    
    
    SqlSession sqlSession;
    try {
    
    
        sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("uid",8);
        map.put("uname","jacktony");
        map.put("upwd","22333");
        int counter = mapper.addUser2(map);
        if (counter > 0){
    
    
            System.out.println("插入成功!");
        }else {
    
    
            System.out.println("插入失败!");
        }
        sqlSession.commit();
    }finally {
    
    
        MybatisUtils.closeSqlSession();
    }
}

8、思考

模糊查询怎么写?

  1. Java代码执行的时候,传递通配符%%
  2. 在sql拼接中使用通配符(注意防止sql注入)
    <select id="getLikeUserInfo" parameterType="string" resultType="com.kuber.pojo.User">
        select  * from users where username like #{value}
    </select>
    @Test
    public void getLikeUserInfo(){
    
    
        SqlSession sqlSession;
        try {
    
    
            sqlSession = MybatisUtils.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            List<User> users = mapper.getLikeUserInfo("%han%");
            for (User user : users) {
    
    
                System.out.println(user);
            }
        }finally {
    
    
            MybatisUtils.closeSqlSession();
        }

    }

猜你喜欢

转载自blog.csdn.net/weixin_43215322/article/details/109515732
今日推荐