MyBatis 快速入门【中】
6.创建NLC_MyBatis\mybatis_quickstart\src\main\java\com\nlc\mapper\MonsterMapper.xml
配置addMonster方法
1. id=“addMonster” 就是接口的方法名
2. parameterType=“com.nlc.entity.Monster” 放入的形参的类型
3. 注意"com.nlc.entity.Monster" 可以简写
4. 写入sql语句=> 在sqlyog 写完成-测试通过,再拿过来
5. (age, birthday, email, gender, name, salary) 表的字段
6. (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary}) 是从传入的monster对象属性值
7. 这里 #{age} age 对应monster对象的属性名,其它一样
<?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"> <!-- 1. 这是一个mapper xml 文件 2. 该文件可以去实现对应的接口的方法 3. namespace 指定该xml文件和哪个接口对应!!! --> <mapper namespace="com.nlc.mapper.MonsterMapper"> <!--配置addMonster 1. id="addMonster" 就是接口的方法名 2. parameterType="com.nlc.entity.Monster" 放入的形参的类型 3. 注意"com.nlc.entity.Monster" 可以简写 4. 写入sql语句=> 在sqlyog 写完成-测试通过,再拿过来 5. (`age`, `birthday`, `email`, `gender`, `name`, `salary`) 表的字段 6. (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary}) 是从传入的monster对象属性值 7. 这里 #{age} age 对应monster对象的属性名,其它一样 --> <insert id="addMonster" parameterType="com.nlc.entity.Monster" useGeneratedKeys="true" keyProperty="id"> INSERT INTO `monster` (`age`, `birthday`, `email`, `gender`, `name`, `salary`) VALUES (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary}) </insert> </mapper>
7. 修改NLC_MyBatis\mybatis_quickstart\src\main\resources\mybatis-config.xml
- 这里我们配置需要关联的Mapper.xml
- 这里我们可以通过菜单 Path from source root
<mappers> <mapper resource="com/nlc/mapper/MonsterMapper.xml"/> </mappers>
8. 创建工具类NLC_MyBatis\mybatis_quickstart\src\main\java\com\nlc\util\MyBatisUtils.java
MyBatisUtils 工具类,可以得到SqlSession
public class MyBatisUtils { //属性 private static SqlSessionFactory sqlSessionFactory; //编写静态代码块-初始化sqlSessionFactory static { try { //指定资源文件, 配置文件mybatis-config.xml String resource = "mybatis-config.xml"; //获取到配置文件mybatis-config.xml 对应的inputStream //加载文件时,默认到resources目录=>运行后的工作目录target-classes InputStream resourceAsStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); System.out.println("sqlSessionFactory="+ sqlSessionFactory.getClass()); } catch (IOException e) { e.printStackTrace(); } } /** * 1. 获得SqlSession 的实例 * 2. SqlSession 提供了对数据库执行SQL 命令所需的所有方法。 * 3. 通过SqlSession 实例来直接执行已映射的SQL 语句 * @return */ //编写方法,返回SqlSession对象-会话 public static SqlSession getSqlSession() { return sqlSessionFactory.openSession(); } }
9.创建NLC_MyBatis\mybatis_quickstart\src\test\java\com\nlc\mapper\MonsterMapperTest.java
完成初始化配置,创建测试方法
public class MonsterMapperTest { //属性 //这个是Sql 会话,通过它可以发出sql 语句 private SqlSession sqlSession; private MonsterMapper monsterMapper; /** * 1. 当方法标注 @Before, 表示在执行你的目标测试方法前,会先执行该方法,相当于spring的前置通知 * 2. 这里在测试的时候,可能会出现一些麻烦,下面会说解决方案 */ //编写方法完成初始化 @Before public void init() { //通过SqlSessionFactory 对象获取一个SqlSession 会话 sqlSession = MyBatisUtils.getSqlSession(); //获取到到MonsterMapper对象 class com.sun.proxy.$Proxy7 代理对象 //, 底层是使用了动态代理机制 monsterMapper = sqlSession.getMapper(MonsterMapper.class); System.out.println("monsterMapper=" + monsterMapper.getClass()); } @Test public void addMonster() { for (int i = 0; i < 2; i++) { Monster monster = new Monster(); monster.setAge(10 + i); monster.setBirthday(new Date()); monster.setEmail("kate@qq.com"); monster.setGender(1); monster.setName("大象精-" + i); monster.setSalary(1000 + i * 10); monsterMapper.addMonster(monster); System.out.println("添加对象--" + monster); System.out.println("添加到表中后, 自增长的id=" + monster.getId()); } //如果是增删改, 需要提交事务 if(sqlSession != null) { sqlSession.commit(); sqlSession.close(); } System.out.println("保存成功..."); }
10.异常测试
错误原因
看看是否可以添加成功, 这时可能会出现找不到Xxxxmapper.xml 错误, 分析原因:
解决方法
1.在父项目NLC_MyBatis增加build配置,导出xml文件。
2.idea->build->rebuild project[要执行,否则还是错误]。
3.这时应该就可以了,如果不行,需要切换一下maven路径。
在父工程的pom.xml 加入build 配置
在build中配置resources,来防止我们资源导出失败的问题
1.不同的idea/maven 可能提示的错误不一样
2.不变应万变,少什么文件,就增加相应配置即可
3.含义是将 src/main/java目录和子目录 和 src/main/resources目录和子目录的资源文件 xml 和 properties在build项目时,导出到对应的target目录下。
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> </resources> </build>
上面不成功,切换maven目录
### 成功验证
😄总结
- 出现找不到文件的异常时,可能是路径映射的问题,按照小编上面的方法就可以解决。
- 静态代码块只会执行一次,创建sqlSessionFactory后,获取的sqlSession 都是同一个地方的。
- 如果是查询不需要进行commit提交,但是需要close把sqlSession放回sqlSessionFactory。
- 增删改这种需要对数据库进行改变的行为,需要commit提交。
- 获取资源文件加载时,默认到resources目录=>运行后的工作目录target-classes。
😁热门专栏推荐
第1篇 -MyBatis 介绍
MyBatis入门篇 MyBatis(简化数据库操作的持久层框架)–快速入门[上]
文章到这里就结束了,如果有什么疑问的地方欢迎指出,诸大佬们一起来评论区一起讨论😁
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞