文章目录
MyBatis
什么是MyBatis
MyBatis是一款优秀的持久层框架,用于简化JDBC开发
官网:https://mybatis.net.cn/
持久层
负责将数据保存到数据库的那一层代码
JavaEE的三层架构:表现层、业务层、持久层
MyBatis简化
JDBC举例:
//1、注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取Connection连接
String url = "jdbc:mysql:///db1?useSSL=false";
String uname = "root";
String pwd = "1234";
Connection conn = DriverManager.getConnection(url,uname,pwd);
//接收输入的查询条件
String gender = "男";
//定义sql
String sql = "select * from tb_user where gender = ?";
//获取pstmt对象
PreparedStatement pstmt = conn.prepareStatement(sql);
//设置?的值
pstmt.setString(1.gender);
//执行sql
ResultSet rs = pstmt.executeQuery();
//遍历Result,获取数据
User user = null;
ArrayList<User> users = new ArrayList<>();
while(rs.next()){
//获取数据
int id = rs.getInt("id");
String usename = rs.getString("username");
String password = rs.getString("password");
//创建对象,设置属性值
user = new User();
user.setId(id);
user.setUsername(username);
user.setPassword(password);
user.setGender(gender);
//转入集合
user.add(user);
}
//释放资源
rs.close();
pstmt.close();
conn.close();
MyBatis快速入门
步骤:
MyBatis核心配置文件
<!-- 数据库连接信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="xxxxxx"/>
pom.xml:
<dependencies>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!-- 添加slf4j日志api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.20</version>
</dependency>
<!-- 添加logback-classic依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 添加logback-core依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
Mapper代理开发
目的:
解决原生方式中的硬编码
简化后期执行SQL
步骤:
1、定义与SQL映射文件同名的Mapper接口,并将接口Mapper和SQL映射文件放置在同一目录下
(SQL映射文件尽量都放置在resources下,便于项目的开发。)
(在创建文件时不使用“.”,使用“/”,虽然显示成“.”,但可以满足要求)
2、设置SQL映射文件的namespace属性为Mapper接口全限定名
<mapper namespace="com.MyBatisDemo.mapper.UserMapper">
········
</mapper>
3、在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
4、编码
①通过SqlSession的getMapper方法获取Mapper接口的代理对象
②调用对应方法完成sql的执行
细节:如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载
<mappers>
<!-- Mapper代理方式-->
<package name="com.MyBatis.mapper"/>
</mappers>
总结:整个运行流程
获取了SqlSession对象,
SqlSession sqlSession = sqlSessionFactory.openSession();
通过他来获取一个对应的Mapper,获取一个UserMapper接口的代理对象,通过这行代码
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
就可以找到UserMapper的接口,又因为在当前目录下面有一个同名的映射文件,可以找到对应的UserMapper的xml文件,就可以找到对应的sql语句。
通过serMapper.selectAll()来调用他的方法,一调用方法,UserMapper这位置的selectAll()方法就对应了sql语句的id,就可以找到这个文件里面的对应的id,有了id之后就可以获取对应的sql语句,之后又因为返回值是list,所以底层执行的还是sqlSession.selectList(“test.selectAll”);
MyBatis核心配置文件
environment :配置数据库连接环境信息,可以配置多个,通过default属性切换不同的environment。
transactionManager:事务的管理方式(后会被Spring取代)
dataSource:数据库连接池(后会被Spring取代)
类型别名:
<typeAliases>
<package name="com.MyBatisDemo.pojo"/>
</typeAliases>
配置文件完成增删改查
要完成的功能:
1、查询
查询所有数据
查看详情
条件查询
2、添加
3、修改
修改全部字段
修改动态字段
4、删除
删除一个
删除全部
准备环境:
创设数据表tb_brand
实体类Brand
新建测试用例
安装MyBatisX插件
MyBatisX插件介绍:他是一款基于IDEA的快速开发插件,为效率而生
查询-查询所有数据
完成该功能使用哪些sql语句?——————select * from tb_brand;
要不要参数?——————不要
完成了之后给用户返回的——————List集合里放Brand对象
总结:
<!--
数据库表的字段名称 和 实体类的属性名称不一样 , 则不能自动封装数据
* 起别名:对不一样的列明起别名,让别名和实体类的属性名一样
*缺点:每次查询都要定义一次别名 使用sql片段解决该问题 *缺点:不灵活
* resultMap:
1、定义<resultMap>标签
2、在<select>标签中,使用resultMap属性替换resultType属性
-->
<!-- id:唯一标识
type:映射的类型,支持别名
-->
<resultMap id="brandResultMap" type="brand">
<!-- id:完成主键字段的映射
column:表的列名
property:实体类的属性名
result:完成一般字段的映射
column:表的列名
property:实体类的属性名
-->
<result column="brand_name" property="brandName"></result>
<result column="company_name" property="companyName"></result>
</resultMap>
<select id="selectAll" resultMap="brandResultMap">
select *
from tb_brand;
</select>
查询-查看详情
<!-- 参数占位符:
#{} 会将其替换为?,为了防止SQL注入
${} 拼sql,会存在SQL注入问题
使用时机: 参数传递的时候使用#{}
表名或者列名不固定的情况下,使用${}
参数类型: parameterType:可以省略
特殊字符处理:
转义字符
CDATA区:大写CD,根据提示补全 防止想要输入的特殊字符
-->
<select id="selectById" resultMap="brandResultMap">
select *
from tb_brand where id = #{id};
</select>
总结:
查询-多条件查询
总结:
查询-动态查询
多条件的动态条件查询
总结:
单条件的动态条件查询
从多个条件中选择一个
choose(when,otherwise):选择,类似于Java中的switch语句
添加
返回添加数据的主键
<insert id="add" useGeneratedKeys="true" keyProperty="id"></insert>
修改
修改全部字段
修改动态字段
删除
删除一个
批量删除
MyBatis参数传递
单个参数:
POJO类型:直接使用,属性名 和 参数占位符名称一致
Map集合:直接使用,属性名 和 参数占位符名称一致
Collection:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0",collection集合)
map.put("collection",collection集合)
List:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0",list集合)
map.put("collection",list集合)
map.put("list",list集合)
Array:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0",数组)
map.put("array",数组)
其他类型:直接使用
多个参数:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0",参数值1)
map.put("param1",参数值1)
map.put("param2",参数值2)
map.put("arg1",参数值2)
--------------------@Param("username")
map.put("username",参数值1)
map.put("param1",参数值1)
map.put("param2",参数值2)
map.put("arg1",参数值2)
建议:
将来都使用@Param注解来修改Map集合中默认的键名,并使用修改后的名称来获取值,这样可读性更高
注解完成增删改查
使用注解开发比配置文件开发更为方便
使用注解来映射简单 语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java注解不仅力不从心,还会让本来就复杂的SQL语句更加混乱不堪,因此,如果需要做一些很复杂的操作,最好用XML来映射语句。
选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,取决于个人。