文章目录:
1.3 在StudentDao.xml文件中添加insert标签(使用占位符)
1.通过占位符实现insert操作
https://blog.csdn.net/weixin_43823808/article/details/114142592
1.2 在StudentDao接口中添加一个抽象方法
package com.bjpowernode.dao; import com.bjpowernode.entity.Student; /** * */ public interface StudentDao { //查询一个学生 Student selectStudentById(Integer id); //添加学生 //返回值int:表示本次操作影响的数据库的行数 int insertStudent(Student student); }
1.3 在StudentDao.xml文件中添加insert标签(使用占位符)
<?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.bjpowernode.dao.StudentDao"> <!--添加insert 如果传入给MyBatis的是一个Java对象,使用 #{属性名} 获取此属性的值 属性值放到 #{} 占位符的位置,MyBatis执行此属性对应的 getXXX()方法 例如:#{id},MyBatis执行 getId()方法 --> <insert id="insertStudent"> insert into student values(#{id},#{name},#{email},#{age}) </insert> </mapper>
1.4 在MyBatis.xml主配置文件中添加日志标签
<!--设置日志--> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings>
//测试MyBatis执行sql语句 @Test public void testinsertStudent() throws IOException { String config="mybatis.xml"; InputStream inputStream=Resources.getResourceAsStream(config); SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream); SqlSession session=factory.openSession(); String sqlId="com.bjpowernode.dao.StudentDao" + "." + "insertStudent"; Student student=new Student(); student.setId(1005); student.setName("张飞"); student.setEmail("zhangfei@qq.com"); student.setAge(26); int rows=session.insert(sqlId,student); System.out.println("使用MyBatis添加一个学生,rows=" + rows); //MyBatis默认执行sql语句是 手工提交事务模式,在做insert、update、delete后需要提交事务 session.commit(); session.close(); }
在上面的测试代码中,如果没有session.commit(); 这句话,则无法将数据添加到数据库中。(大家可以自行尝试)
这是因为 MyBatis 默认执行sql语句是手工提交事务模式,在做insert、update、delete后需要提交事务,也就是说在执行完insert、update、delete后,需要 session.commit(); 这行代码来手动将事务提交才行。
那么 MyBatis 有没有自动提交事务的方法呢? 答案是:当然有!!!
在上面的代码中有这样一行:👇👇👇
SqlSession session=factory.openSession();
这个 openSession() 是 SqlSession 接口的一个实现方法,在其中有很多方法进行了重载,我们只需对这个方法进行修改即可实现自动提交事务:SqlSession session=factory.openSession(true);
见如下代码:👇👇👇
//测试MyBatis执行sql语句 @Test public void testAutoCommitInsertStudent() throws IOException { String config="mybatis.xml"; InputStream inputStream=Resources.getResourceAsStream(config); SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream); //openSession(true):创建一个有自动提交功能的 SqlSession //openSession(false):创建一个非自动提交功能的 SqlSession,需手动提交 //openSession():同 openSession(false) SqlSession session=factory.openSession(true); String sqlId="com.bjpowernode.dao.StudentDao" + "." + "insertStudent"; Student student=new Student(); student.setId(1007); student.setName("小明"); student.setEmail("xiaoming@qq.com"); student.setAge(15); int rows=session.insert(sqlId,student); System.out.println("使用MyBatis添加一个学生,rows=" + rows); session.close(); }
可以看到,这段代码中并没有 session.commit(); 这句话,但是仍然可以向数据库中添加数据!!!
以上步骤是通过占位符实现了insert操作,那么对于update、delete操作都是换汤不换药,在这里就不再举例了!!!
2.MyBatis框架中一些重要对象
Resources类,顾名思义就是资源,用于读取资源文件(主配置信息)。其有很多方法通过加载并解析资源文件,返回不同类型的 IO 流对象。
对应于代码中的这一行:👇👇👇
InputStream inputStream=Resources.getResourceAsStream(config);
负责创建SqlSessionFactory对象。SqlSessionFactory 的创建,需要使用 SqlSessionFactoryBuilder 对象的 build() 方法。
对应于代码中的这一行:👇👇👇
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory接口对象是一个重量级对象(系统开销大的对象),是线程安全的,所以一个应用只需要一个该对象即可。
创建 SqlSession 需要使用 SqlSessionFactory 接口的的 openSession()方法。
作用是 SqlSession 的工厂,也即创建 SqlSession 的对象。
它的实现类如下:👇👇👇
public class DefaultSqlSessionFactory implements SqlSessionFactory { }
SqlSessionFactory接口中的重要方法:👇👇👇
openSession(true):创建一个有自动提交功能的 SqlSession openSession(false):创建一个非自动提交功能的 SqlSession,需手动提交 openSession():同 openSession(false)
SqlSession接口对象用于执行持久化操作。一个 SqlSession 对应着一次数据库会话,一次会话以 SqlSession 对象的创建开始,以 SqlSession 对象的关闭结束。
SqlSession接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其 close() 方法,将其关闭。再次需要会话,再次创建。 SqlSession在方法内部创建,使用完毕后关闭。
SqlSession的对象是通过 SqlSessionFactory 来获取的。
它的实现类如下:👇👇👇
public class DefaultSqlSession implements SqlSession { }
SqlSession接口中的重要方法:👇👇👇
selectOne:执行sql语句,最多得到一行记录,多余1行则会抛出异常 selectList:执行sql语句,返回多行数据 selectMap:执行sql语句,得到一个Map结果 insert:执行insert语句 update:执行update语句 delete:执行delete语句 commit:提交事务 rollback:回滚事务