首页 > 其他分享 >02.MyBatis的操作

02.MyBatis的操作

时间:2023-03-20 09:00:58浏览次数:35  
标签:02 String UserMapper SqlSession session User 操作 MyBatis import

一、MyBatis的CRUD操作

案例:用户信息表的操作

我们使用面向接口编程来实现。<mapper namespace="com.sdbi.mapper.UserMapper">

(一)添加

添加一条用户信息。

1、在UserMapper.java接口中定义添加方法

package com.sdbi.mapper;

import com.sdbi.pojo.User;

public interface UserMapper {
    public User findByName(String name);

    public User findById(Integer id);

    public int insertUser(User user);
}

2、在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为映射根节点 -->
<mapper namespace="com.sdbi.mapper.UserMapper">
    <!-- id是接口中的“方法名”,parameterType是传入参数的数据类型,resultType是返回的实体类名(包名.类名)-->
    <select id="findByName" parameterType="String" resultType="com.sdbi.pojo.User">
        select *
        from tb_users
        where name = #{name}
    </select>

    <select id="findById" parameterType="Integer" resultType="com.sdbi.pojo.User">
        select *
        from tb_users
        where id = #{id}
    </select>

    <insert id="insertUser">
        insert into tb_users (name, password, email, birthday)
        values (#{name}, #{password}, #{email}, #{birthday})
    </insert>
</mapper>

由于我们在UserMapper.java接口中已经为创建的insertUser()方法指定了参数是com.sdbi.pojo.User,所以在<insert>标签中我们可以省略parameterType属性,不必写出来。

3、调用添加方法,测试效果

(1)修改User类,增加两个构造方法

这里注意,如果定义了有参的构造方法,那么这里一定也要重写无参的构造方法,因为MyBatis框架会去调用这个无参的构造方法来构造对象,封装数据。

package com.sdbi.pojo;

public class User {
    private int id;
    private String name;
    private String password;
    private String email;
    private String birthday;

    // 如果定义了有参的构造方法,那么这里一定也要重写无参的构造方法,因为MyBatis框架会去调用这个无参的构造方法来构造对象,封装数据
    public User() {
    }

    public User(int id, String name, String password, String email, String birthday) {
        this.id = id;
        this.name = name;
        this.password = password;
        this.email = email;
        this.birthday = birthday;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                ", birthday='" + birthday + '\'' +
                '}';
    }
}

(2)修改UserServlet类,定义添加数据的insertUser()方法,并且在doGet()方法中调用该方法。

另外,为了让代码结构清晰,我们将之前的查询功能代码也单独封装到findByName()方法中。

 1 package com.sdbi.servlet;
 2 
 3 
 4 import com.sdbi.mapper.UserMapper;
 5 import com.sdbi.pojo.User;
 6 import org.apache.ibatis.io.Resources;
 7 import org.apache.ibatis.session.SqlSession;
 8 import org.apache.ibatis.session.SqlSessionFactory;
 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
10 
11 import javax.servlet.ServletException;
12 import javax.servlet.annotation.WebServlet;
13 import javax.servlet.http.HttpServlet;
14 import javax.servlet.http.HttpServletRequest;
15 import javax.servlet.http.HttpServletResponse;
16 import java.io.IOException;
17 import java.io.Reader;
18 
19 @WebServlet("/UserServlet")
20 public class UserServlet extends HttpServlet {
21 
22     @Override
23     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
24         System.out.println("doGet()...start");
25         resp.setContentType("text/html;charset=utf-8");
26         resp.getWriter().println("MyBatis:");
27 
28 //        findByName(req, resp);
29         insertUser(req, resp);
30 
31         System.out.println("doGet()...end");
32     }
33 
34     private void insertUser(HttpServletRequest req, HttpServletResponse resp) throws IOException {
35         System.out.println("insertUser()...start");
36         String resouces = "mybatis-config.xml";
37         // 创建流
38         Reader reader = null;
39         // 读取mybatis-config.xml文件内容到reader对象中
40         reader = Resources.getResourceAsReader(resouces);
41         // 初始化MyBatis数据源,创建SqlSessionFactory类的实例
42         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
43         // 创建SqlSession类的实例
44         SqlSession session = sqlSessionFactory.openSession();
45         // 调用SqlSession的getMapper方法,获取指定接口的实现类对象
46         UserMapper userMapper = session.getMapper(UserMapper.class);
47 
48         int i = userMapper.insertUser(new User(0, "zhaoliu", "111", "[email protected]", "1981-08-11"));
49 
50         resp.getWriter().println("插入" + i + "条记录");
51         // 关闭SqlSession对象
52         session.close();
53         System.out.println("insertUser()...end");
54     }
55 
56     private void findByName(HttpServletRequest req, HttpServletResponse resp) throws IOException {
57         String resouces = "mybatis-config.xml";
58         // 创建流
59         Reader reader = null;
60         try {
61             // 读取mybatis-config.xml文件内容到reader对象中
62             reader = Resources.getResourceAsReader(resouces);
63         } catch (IOException e) {
64             e.printStackTrace();
65         }
66         // 初始化MyBatis数据源,创建SqlSessionFactory类的实例
67         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
68         // 创建SqlSession类的实例
69         SqlSession session = sqlSessionFactory.openSession();
70         // 调用SqlSession的getMapper方法,获取指定接口的实现类对象
71         UserMapper userMapper = session.getMapper(UserMapper.class);
72         // 传入参数,调用实现类对象的方法,返回结果User
73         User user = userMapper.findByName("zhangsan");
74 //        User user = userMapper.findById(3);
75         // 输出结果
76         System.out.println(user.toString());
77         resp.getWriter().println(user.toString());
78         // 关闭SqlSession对象
79         session.close();
80     }
81 }

运行程序,结果如下:

虽然提示成功“插入1条记录”,但是我们查询数据库发现,tb_users表里没有并没有增加数据。

这是为什么呢?

这是因为,我们向数据库里添加了数据,但是没有提交这个事务。

我们在第49行的位置增加session.commit(); 

 1 package com.sdbi.servlet;
 2 
 3 
 4 import com.sdbi.mapper.UserMapper;
 5 import com.sdbi.pojo.User;
 6 import org.apache.ibatis.io.Resources;
 7 import org.apache.ibatis.session.SqlSession;
 8 import org.apache.ibatis.session.SqlSessionFactory;
 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
10 
11 import javax.servlet.ServletException;
12 import javax.servlet.annotation.WebServlet;
13 import javax.servlet.http.HttpServlet;
14 import javax.servlet.http.HttpServletRequest;
15 import javax.servlet.http.HttpServletResponse;
16 import java.io.IOException;
17 import java.io.Reader;
18 
19 @WebServlet("/UserServlet")
20 public class UserServlet extends HttpServlet {
21 
22     @Override
23     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
24         System.out.println("doGet()...start");
25         resp.setContentType("text/html;charset=utf-8");
26         resp.getWriter().println("MyBatis:");
27 
28 //        findByName(req, resp);
29         insertUser(req, resp);
30 
31         System.out.println("doGet()...end");
32     }
33 
34     private void insertUser(HttpServletRequest req, HttpServletResponse resp) throws IOException {
35         System.out.println("insertUser()...start");
36         String resouces = "mybatis-config.xml";
37         // 创建流
38         Reader reader = null;
39         // 读取mybatis-config.xml文件内容到reader对象中
40         reader = Resources.getResourceAsReader(resouces);
41         // 初始化MyBatis数据源,创建SqlSessionFactory类的实例
42         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
43         // 创建SqlSession类的实例
44         SqlSession session = sqlSessionFactory.openSession();
45         // 调用SqlSession的getMapper方法,获取指定接口的实现类对象
46         UserMapper userMapper = session.getMapper(UserMapper.class);
47 
48         int i = userMapper.insertUser(new User(0, "zhaoliu", "111", "[email protected]", "1981-08-11"));
49         session.commit(); // 提交事务
50         resp.getWriter().println("插入" + i + "条记录");
51         // 关闭SqlSession对象
52         session.close();
53         System.out.println("insertUser()...end");
54     }
55 
56     private void findByName(HttpServletRequest req, HttpServletResponse resp) throws IOException {
57         String resouces = "mybatis-config.xml";
58         // 创建流
59         Reader reader = null;
60         try {
61             // 读取mybatis-config.xml文件内容到reader对象中
62             reader = Resources.getResourceAsReader(resouces);
63         } catch (IOException e) {
64             e.printStackTrace();
65         }
66         // 初始化MyBatis数据源,创建SqlSessionFactory类的实例
67         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
68         // 创建SqlSession类的实例
69         SqlSession session = sqlSessionFactory.openSession();
70         // 调用SqlSession的getMapper方法,获取指定接口的实现类对象
71         UserMapper userMapper = session.getMapper(UserMapper.class);
72         // 传入参数,调用实现类对象的方法,返回结果User
73         User user = userMapper.findByName("zhangsan");
74 //        User user = userMapper.findById(3);
75         // 输出结果
76         System.out.println(user.toString());
77         resp.getWriter().println(user.toString());
78         // 关闭SqlSession对象
79         session.close();
80     }
81 }

再执行UserServlet,查看数据库,发现数据添加成功了。

细心的同学会发现,我们构造要添加的User对象时,id属性的值是0,但是数据库中实际增加的记录的id值不是0,这是因为,在创建表是,我们让id字段是自增长的,这样的话,不论你指定添加数据的id值是几,数据库都是按照自增长的方式来填写id字段。

还有,我们在映射文件UserMapper.xml中定义的<insert>标签的参数是 #{name}, #{password}, #{email}, #{birthday}

<insert id="insertUser">
    insert into tb_users (name, password, email, birthday)
    values (#{name}, #{password}, #{email}, #{birthday})
</insert>

而我们在调用UserMapper接口的insertUser()方法时传入的是User对象。

int i = userMapper.insertUser(new User(0, "zhaoliu", "111", "[email protected]", "1981-08-11"));

这里的参数是怎么传值的呢?

我们在映射文件UserMapper.xml中定义SQL语句时,只要按照User类的属性名称设置参数即可。

MyBatis会根据User类的对象的属性名,将参数值传入SQL语句。

(二)删除

根据用户名删除一条用户信息。

1、在UserMapper.java接口中定义添加方法

public int deleteUser(String name);

2、在UserMapper.xml中对接口方法进行“实现”

<delete id="deleteUser">
    delete
    from tb_users
    where name = #{name}
</delete>

3、调用添加方法,测试效果

在UserServlet中定义deleteUser()方法

private void deleteUser(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    System.out.println("deleteUser()...start");
    String resouces = "mybatis-config.xml";
    // 创建流
    Reader reader = null;
    // 读取mybatis-config.xml文件内容到reader对象中
    reader = Resources.getResourceAsReader(resouces);
    // 初始化MyBatis数据源,创建SqlSessionFactory类的实例
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    // 创建SqlSession类的实例
    SqlSession session = sqlSessionFactory.openSession();
    // 调用SqlSession的getMapper方法,获取指定接口的实现类对象
    UserMapper userMapper = session.getMapper(UserMapper.class);

    int i = userMapper.deleteUser("lisi");
    session.commit(); // 提交事务
    resp.getWriter().println("删除" + i + "条记录");
    // 关闭SqlSession对象
    session.close();
    System.out.println("deleteUser()...end");
}

在doGet()方法中调用该方法

deleteUser(req, resp);

运行程序,结果如下:

(三)修改

根据用户名修改用户的密码、email等信息。

1、在UserMapper.java接口中定义添加方法

public int updateUser(User user); 

2、在UserMapper.xml中对接口方法进行“实现”

<update id="updateUser">
    update tb_users
    set password = #{password},
        email    = #{email},
        birthday = #{birthday}
    where name = #{name}
</update>

3、调用添加方法,测试效果

在UserServlet中定义updateUser()方法

private void updateUser(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    System.out.println("updateUser()...start");
    String resouces = "mybatis-config.xml";
    // 创建流
    Reader reader = null;
    // 读取mybatis-config.xml文件内容到reader对象中
    reader = Resources.getResourceAsReader(resouces);
    // 初始化MyBatis数据源,创建SqlSessionFactory类的实例
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    // 创建SqlSession类的实例
    SqlSession session = sqlSessionFactory.openSession();
    // 调用SqlSession的getMapper方法,获取指定接口的实现类对象
    UserMapper userMapper = session.getMapper(UserMapper.class);

    int i = userMapper.updateUser(new User(0, "zhaoliu", "222", "[email protected]", "1981-08-11"));
    session.commit(); // 提交事务
    resp.getWriter().println("更新" + i + "条记录");
    // 关闭SqlSession对象
    session.close();
    System.out.println("updateUser()...end");
}

在doGet()方法中调用该方法

updateUser(req, resp);

运行程序,结果如下:

 

(四)查询

 

1、在UserMapper.java接口中定义添加方法

 

 

2、在UserMapper.xml中对接口方法进行“实现”

 

 

 

3、调用添加方法,测试效果

标签:02,String,UserMapper,SqlSession,session,User,操作,MyBatis,import
From: https://www.cnblogs.com/lihuawei/p/17216697.html

相关文章

  • 2023.3.19 规划
    规划比赛里面写不出来的,cf和atc打少了,自己模拟少了;但是这东西我得先知道,会写模板才行;主流的算法都得会不能到哪都简单搜索,那就到哪里都坐牢;所以先是去选择最靠......
  • csp:202104-2:邻域均值
    这道题可以用最简单的方式:四层遍历暴力求解,不过稍微计算一下时间复杂度就会发现这绝对超时。实际上,这道题略微有一点滑动窗口的思想,通过不断更新窗口来求解,可以将算法的时......
  • csp:202109-2:非零段划分
    这道题乍看之下感觉很简单,但是想到的确实O(n^2)的算法,直接超时。只要在暴力算法的基础上考虑到每趟遍历的共性,改进一下,就能通过了!下面是我的100分答案:#include<iostream......
  • nodejs 操作redis的集合操作
    constredis=require('redis');constclient=redis.createClient();//向集合中添加元素client.sadd('myset','foo','bar','baz',(err,result)=>{cons......
  • 2023.3.19周学习总结
    一.本周任务进度1.线段树分裂合并学习完,并且练习了几个题2.上周的补题也补完了3.打了一把牛客和两把cf还有一把abc4.学习了斜率优化DP的凸包优化二.......
  • Spring Study-lesson14-事务-2023-03-19
    遵循ACID原则,这样保证批量事务其中一项报错,整个批量事务都不执行。案例:在spring-dao.xml中加载aop和tx注意细节:xmlns:aop(或tx)要有整个名字,另外注意>和“”的位......
  • 2023/3/19 考试总结
    其实今天没有什么好说的,四个半小时全在做第一题前两个小时在推式子,但其中一个半小时的式子是没用的。这时候突然知道正解怎么做了,发现是道水题,就花了一个半小时将代......
  • 2023-3-13
    2023-3-13练习题8.35证明\(\partialA=\overline{A}\cap(A^{\circ})^c\).根据定义,有\(\overline{A}\)与\((A^c)^{\circ}\)互为补集.所以有\(\overline{A}\c......
  • Presto-gateway 讲解与实战操作
    目录一、概述二、部署mysql三、部署多套presto集群四、部署presto-gateway与简单使用1)下载2)Maven编译3)修改配置4)sql初始化5)启动服务6)增加和修改presto集群1、通过CU......
  • Activiti7 基础篇 流程操作 流程定义
    一、流程定义概述流程定义是线下按照bpmn2.0标准去描述业务流程,通常使用idea中的插件对业务流程进行建模。使用idea下的designer设计器绘制流程,并会生成两个文件:.bpmn......