一、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", "zhaoliu@163.com", "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", "zhaoliu@163.com", "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", "zhaoliu@163.com", "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", "zhaoliu@sina.com", "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