Mybatis - 基础学习6
一.CRUD
我们可以在工具类中设置自动提交事务!
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
1.编写接口:使用注解完成简单的sql语句
@Param 它的属性和sql语句中的字段对应,只有属性才需要加,对象就不需要
public interface UserMapper { @Select("select * from user where id = 2") List<User> getUser(); @Insert("insert into user(`id`,`name`,`pwd`) values(6,'nihao','99877')") int addUser(User user); @Update("update user set `name`=#{maa} where id=#{uid}") int updateUser(@Param("uid")int id,@Param("maa")String name); @Delete("delete from user where name=#{maa}") int deteleUser(@Param("maa")String name); }
2.测试
注意:使用注解操作数据库,必须在项目的核心文件下绑定接口
@Test
public void testCRUD(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int key1 = mapper.addUser(new User(6, "hhhh", "963852"));
int key2 = mapper.updateUser(6, "lll");
int key3 = mapper.deteleUser("lll");
if(key1>0){
System.out.println("插入成功!");
}
sqlSession.close();
}
关于 #{ } ${ }的区别
- #{ } 能够很大程度上的防止sql注入的问题
- ${ } 使用的是字符拼接来完成sql语句实现,就不能防止sql注入问题
- 总的来说:#{ } 比 ${ } 更加安全,高效
二.Lombok
- Lombok项目是一个java库
- 它可以自动插入到编辑器和构建工具中(插件plugs)
- 不需要再写getter、setter或equals方法,只要有一个注解,你的类就有一个功能齐全的构建器、自动记录变量
使用步骤:
1.在idea中下载插件’
2.导入jar包(我依然坚定的选择maven)
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency>
3.使用
通常是简化我们的实体类相关的get,set方法,还有有参无参构造
使用前的实体类,可以看到方法体特别多
使用后:我们可以很清晰的看到,只用了几个简单的注解,接写完了实体类所需的方法,构造器,且类中结构干净
总结:Lombok的优缺点
优点:
- 能通过注解自动生成构造器,getter/setter,equals,hashcode,toString等方法,提高了一定的开发效率、
- 让代码变得更加简洁,不用过多的关注对应的方法
- 属性做修改时,也简化了这些属性所生成的getter/sette方法
缺点:
- 不支持多种参数构造器的重载,方法重载(其实可以把其它所需的方法写在类里也可以完成重载)
- 虽然不用手动的去写getter/sette方法,但是大大降低了代码的可读性和完整性,降低了阅读源代码的舒适度
三.构建新项目出现的错误:总的来说就是mybatis对于xml文件扫描过于严格,导致最初我创建包的时候只想测试没有注意到这些细节
问题报错
一直报错,文件提前结束,我一直以为是核心xml配置写错了,连接不到mysql,但是反复检查,并没有错,然后看了过了一会儿,我看到了我们项目结构
除了核心配置xml文件外,还有两个mapper.xml,因为我在核心配置文件中配置的直接是class路径,就是接口路径,没有这个mapper.xml就没注意这个,但是当我点进去的时候发现,果然报错了
然后我赶紧把相关配置写了上去,结果又报了一个新的错误,但是比刚才的错误少,我又有信心了
勉强可以看的出 “Mapper‘s namespace cannot be empty”,应该是mapper没有实例化,没有绑定接口的意思,我赶紧去看我的mapper.xml文件
一眼看上去很正常,但仔细检查会发现,namespqce这个关键字没有
当我写上去了以后才发现就可以正常运行了
总的来说:是一个很好的教训,同时可以发现mybatis的规范和约束真的很严格,这样的错不仔真的检查不出来,毕竟我在核心配置文件绑定接口的时候,没有用到mapper.xml用的是class接口,理论上没有用就不配,结果导致了这么一个错误,是一个很大的提升。