mybatis
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?
- maven仓库
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
- 到Github上找https://github.com/mybatis/mybatis-3/releases
- 中文文档地址:https://mybatis.org/mybatis-3/zh/index.html
1.3 持久化
- 数据持久化
将程序中的数据在持久状态和瞬时状态转换的过程
内存:断点即失
数据库DB持久化,IO文件持久化
- 数据持久化原因:
一些对象不能丢掉
内存成本大
1.4 持久层
- 完成持久化工作的代码
- 分界线明显
1.5 MyBatis重要性
-
方便
-
传统的jdbc代码复杂了。建华了,框架。自动化
-
不用也行,但容易上手。
-
优点:
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射。
- 提供对象关系映射标签,支持对象关系组建维护。
- 提供xml标签,支持编写动态sql。
2.第一个mybatis程序
- 流程:搭建环境–>导入mybatis–>编写代码–>测试!
2.1 搭建环境
- 搭建数据库
use school;
CREATE TABLE `user`(
`id` int(40) not NULL,
`name` VARCHAR(100) not NULL,
`pwd` VARCHAR(50) not NULL,
PRIMARY KEY(`id`)
)
- 新建普通maven项目,导入依赖
- 删除src目录
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
2.2 创建模块
- 编写mybaits的核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/school?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/school?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
- 编写mybaits的工具类
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory = null;
static {
//第一步:获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
2.3 编写代码
- 实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private String pwd;
}
- dao接口
public interface UserMapper {
public User selectUserById(int id);
public List<User> selectUser();
}
- dao接口实现类转为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">
<!--namespace绑定对应的UserMapper即实现-->
<mapper namespace="entity.UserMapper">
<select id="selectUserById" resultType="entity.User">
select * from user where id = #{id}
</select>
<!--返回集合对象类型也是用resultType指明集合泛型-->
<select id="selectUser" resultType="entity.User">
select * from user
</select>
</mapper>
2.4 测试
- junit测试
@Test
public void testMybatis01(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectUser();
System.out.println(users.size());
users.forEach(val->{
System.out.println(val.getName());
});
sqlSession.close();
}
<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>
<!--每个UserMapper.xml都需要在mybatis-config.xml文件中配置-->
<mappers>
<mapper resource="com/zk/mybatisExample01/entity/UserMapper.xml"/>
</mappers>
- 问题3:绑定接口错误,命名空间
- 问题4:返回类型不对,未起别名前,用全限定名
- 问题5:方法名不对
3.CRUD
3.1 namespace
- 命名空间中的包名类名要和mapper接口名一致
3.2 Mapper.xml中标签元素
-
id对应namespace中的方法名
-
resultType:sql语句执行的返回值
-
parameterType:sql语句的参数类型
-
UserMapper接口中的参数和mapper.xml中sql语句中的参数一致
public interface UserMapper {
public User selectUserById(int id);
}
<--UserMapper.xml-->
<select id="selectUserById" resultType="com.zk.mybatisExample01.entity.User"
parameterType="int">
select * from user where id = #{id}
</select>
3.4 查询
- 编写接口
public User selectUserById(int id);
- 编写mapper.xml中的sql
<select id="selectUserById" resultType="com.zk.mybatisExample01.entity.User" parameterType="int">
select * from user where id = #{id}
</select>
- 测试
@Test
public void testMybatis02(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user.toString());
sqlSession.close();
}
3.5 增加
- 编写接口
int insertUser(User user);
- 编写mapper.xml中的sql,注意:参数用了对象,那sql中用的是对象中的属性,可以直接当参数取出来
- sql中可以不写数据库,原因在mybatis-config.xml文件中配置了数据库信息
- idea连数据库可以写上,不连不写数据库名,但连数据库后,且需要设置sql方言,在sql di后面设置
<!--对象中的属性,可以直接当参数取出来-->
<insert id="insertUser" parameterType="com.zk.mybatisExample01.entity.User">
INSERT INTO school.`user`(`id`,`name`,`pwd`) VALUES(#{id},#{name},#{pwd})
</insert>
- 测试
//增删该需要提交事务
@Test
public void testMybatis03(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(6, "tony", "132456");
int num = mapper.insertUser(user);
//提交事务
sqlSession.commit();
System.out.println("num===="+num);
sqlSession.close();
}
3.6 修改
- 编写接口
int updateUser(User user);
- 编写mapper.xml中的sql
<update id="updateUser" parameterType="com.zk.mybatisExample01.entity.User">
update school.`user` set name = #{name},pwd = #{pwd} where id = #{id};
</update>
- 测试
@Test
public void testMybatis04(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(4, "mary", "654321");
int num = mapper.updateUser(user);
//提交事务
sqlSession.commit();
System.out.println("num===="+num);
sqlSession.close();
}
3.7 删除
- 编写接口
int deleteUser(int id);
- 编写mapper.xml中的sql
<delete id="deleteUser" parameterType="int">
delete from school.`user` where id = #{id};
</delete>
- 测试
@Test
public void testMybatis05(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int num = mapper.deleteUser(6);
//提交事务
sqlSession.commit();
System.out.println("num===="+num);
sqlSession.close();
}
- 增删该需要提交事务
3.8 错误点
-
namespace用全限定名用.隔开
-
mapper.xml中标签名不要弄错
-
mybatis-config.xml中的mapper映射资源resource用//来寻找路径
<mappers>
<mapper resource="com/zk/mybatisExample01/entity/UserMapper.xml"/>
</mappers>
- mybatis-config.xml中的environment配置错误
- maven资源没有导出问题
3.9 参数Map的使用
- 若实体类或数据库表字段、参数过多,应该考虑使用map
- 实体类字段太多,sql语句用到字段太少,这样new一个对象出来,太浪费空间,不如直接map
int insertUserMap(Map<String,Object> map);
<!--sql参数传map的key键-->
<insert id="insertUserMap" parameterType="map">
INSERT INTO school.`user`(`id`,`name`,`pwd`) VALUES(#{id},#{account},#{password})
</insert>
@Test
public void testMybatis06(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Object> map = new HashMap<>();
map.put("id",5);
map.put("account","test");
map.put("password",111111);
int num = mapper.insertUserMap(map);
//提交事务
sqlSession.commit();
System.out.println("num===="+num);
sqlSession.close();
}
- map传递参数,直接在sql中去除key即可
- 对象传递参数,直接在sql中取出对象属性即可
- 只有一个基本类型参数的情况下,可以直接在sql中取到,mapper.xml中参数可以不写
- 但是多个参数要使用map或者注解
3.10 模糊查询
- 方式1:代码执行时传递通配符%%
//方式安全
List<User> users = mapper.selectUserStr("%ma%");
- 方式2:sql中拼接使用通配符,存在sql注入
<!--存在sql注入-->
<select id="selectUserStr" resultType="com.zk.mybatisExample01.entity.User">
select * from user where name like "%" #{value} "%"
</select>
- mysql 用模糊查询需要使用concat(‘%’,变量,‘%’) ==》CONCAT(str1,str2,…)
本专栏下一篇:mybatis配置解析介绍
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123925.html