Mybatis
需要基础:
- JDBC
- Mysql
- Java基础
- Maven
- Junit
1、简介
1.1、什么是Mybatis
- MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
- MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
- MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了[google code](https://baike.baidu.com/item/google code/2346604),并且改名为MyBatis 。
- 2013年11月迁移到Github。
1.2、如何获取Mybatis
- Github:
1.3、持久化
数据持久化
- 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
- 内存:断电即失
- 数据库(jdbc),io文件持久化。
- 生活中:冷藏、罐头、照片
为什么需要持久化?
-
有一些对象,不能让他丢掉。
-
内存太贵
1.4、持久层
Dao层、Service层、Controller层
- 完成持久化工作的代码块
- 曾界限十分明显
1.5、为什么需要Mybatis
-
方便
-
传统的jdbc代码太复杂了。为了简化,出现了框架,自动化
-
帮助程序猿将数据存入到数据库中
-
不用mybatis也可以。更容易上手。
-
优点:
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射。
- 提供对象关系映射标签,支持对象关系组建维护。
- 提供xml标签,支持编写动态sql。
2、第一个Mybatis程序
思路:搭建环境–>导入Mybatis—>编写代码—>测试
3、CRUD
1、namespace
namespace中的包名要和Dao/mapper接口的包名一致!
2、select
选择,查询语句:
- id:就是对应的namespace的方法名
- resultType:sql语句执行的返回值
- parameterType:抽象方法输入的参数类型
实现过程:下面插入、修改、删除步骤都一样
- 编写接口抽象方法
List<User> getUserInfo();
- 编写对应的mapper.xml中的sql语句
<mapper namespace="com.kuber.dao.UserMapper">
<select id="getUserInfo" resultType="com.kuber.pojo.User">
select * from users
</select>
</mapper>
- 测试
@Test
public void getUserInfo(){
/*获取SqlSession*/
SqlSession sqlSession;
try {
/*获取SqlSession*/
sqlSession = MybatisUtils.getSqlSession();
/*执行sql*/
/*相当于 UserMapper mapper = new UserMapperImpl();*/
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUserInfo();
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}finally {
MybatisUtils.closeSqlSession();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rfdhL4xD-1604566530913)(img\执行结果1.png)]
3、insert
- 编写接口方法
int addUser(User user);
- 编写对应的mapper.xml中的sql语句
<insert id="addUser" parameterType="com.kuber.pojo.User">
insert into users values(#{uid},#{username},#{password})
</insert>
- 测试
@Test
public void addUser(){
/*增删改必须要提交事务*/
SqlSession sqlSession;
try {
sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(null,"tonyma","111");
int num = mapper.addUser(user);
if(num > 0){
System.out.println("插入成功");
}else {
System.out.println("插入失败");
}
/*提交事务*/
sqlSession.commit();
}finally {
MybatisUtils.closeSqlSession();
}
}
4、update
- 编写接口方法
int updateUser(User user);
- 编写对应的mapper.xml中的sql语句
<update id="updateUser" parameterType="com.kuber.pojo.User">
update users set username = #{username},password = #{password} where uid = #{uid}
</update>
- 测试
@Test
public void updateUser(){
SqlSession sqlSession;
try {
sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int num = mapper.updateUser(new User(7,"jackma","123456"));
if (num > 0){
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
sqlSession.commit();
}finally {
MybatisUtils.closeSqlSession();
}
}
5、delete
- 编写接口方法
int deleteUser(int id);
- 编写对应的mapper.xml中的sql语句
<delete id="deleteUser" parameterType="int">
delete from users where uid = #{id}
</delete>
- 测试
@Test
public void deleteUser(){
SqlSession sqlSession;
try {
sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int num = mapper.deleteUser(9);
if (num > 0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
sqlSession.commit();
}finally {
MybatisUtils.closeSqlSession();
}
}
- 增删改需要提交事务!
6、易出错点
-
标签不要匹配错
-
resource绑定mapper,需要使用路径
-
程序配置文件必须符合规范
-
maven资源没有导出问题
在pom.xml文件中添加如下代码块
<!--在build中配置resours,来防止我们资源导出失败的问题--> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
7、万能Map
假设,我们的实体类,或者数据库中的表,字段或者参数过多,可以使用Map
<insert id="addUser2" parameterType="map">
insert into users(uid,username,password) values(#{uid},#{uname},#{upwd})
</insert>
@Test
public void addUser2(){
SqlSession sqlSession;
try {
sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("uid",8);
map.put("uname","jacktony");
map.put("upwd","22333");
int counter = mapper.addUser2(map);
if (counter > 0){
System.out.println("插入成功!");
}else {
System.out.println("插入失败!");
}
sqlSession.commit();
}finally {
MybatisUtils.closeSqlSession();
}
}
8、思考
模糊查询怎么写?
- Java代码执行的时候,传递通配符%%
- 在sql拼接中使用通配符(注意防止sql注入)
<select id="getLikeUserInfo" parameterType="string" resultType="com.kuber.pojo.User">
select * from users where username like #{value}
</select>
@Test
public void getLikeUserInfo(){
SqlSession sqlSession;
try {
sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getLikeUserInfo("%han%");
for (User user : users) {
System.out.println(user);
}
}finally {
MybatisUtils.closeSqlSession();
}
}