Mybatis
引言
1.什么是框架
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法。简单理解就是为了方便我们程序员开发 减少代码量及代码质量的工具
2.什么是ORM框架
- ORM:对象关系映射,将程序的一个对象与表中的一行数据一一对应
- ORM框架提供了持久化类与表的映射关系,通过映射配置文件的信息,把对象持久化到数据库中
3.使用JDBC完成ORM操作的缺点
- 存在大量的冗余代码
- 手动创建Connetion,Statement等
- 手动将结果集封装成实体对象
- 查询效率低,没有对数据访问进行优化
Mybatis框架
1.概念
Mybatis是一个优秀的基于Java的持久层框架,最原有的JDBC操作进行了封装,使开发者只需要关注sql本身,配置相关的文件就可以达到自动完成ORM的操作
2.下载
官网:http://www.mybatis.org/mybatis-3/
下载:http://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.1
构建Maven项目
这个就不详细说了,不会的可以看“一起学习框架SSM之Spring”
Mybatis环境搭建
1.引入Mybatis依赖包
2.创建Mybatis配置文件
mybatis开发步骤
1.定义实体类
2.定义DAO接口
有了mybatis的话就不需要定义DAO接口的实现类,进行数据操作,编写Mapper.xml来做这样的工作
3.编写Mapper.xml
编写后,mybatis会启动后会动态生成Dao接口的实现类
4.注册Mapper
MyBatis启动只会加载MyBatis配置文件,所以要把mapper文件注册到MyBatis配置文件上
5.测试
优化以及细节
- 数据库的连接信息和参数可以通过properties文件来统一管理,为以后更好的维护
- mapper.xml文件下的resultType=“cn.ozl.entity.User” 由于会多次使用生成该实体类,避免每次都写如此冗长的代码,可以给其加个类的别名
可是如果有多个实体类,就需要每次去更改别名,也是非常繁琐的,解决方案如下:
在 < typeAliases > 标签下定义实体类所在的包,每个实体类都会自动注册一个别名 这个别名就是实体类名
创建log4j配置文件
1.pom.xml加入lo4j依赖
2.创建并配置log4.properties
这个以后会详细去讲的,这个就先看就可以
MyBatis的CRUD操作
1.查询
1.1 序号参数绑定
前面已经提到一个序号参数绑定就是
<select id="queryUser" resultType="User">
select id,username,password,gender,regist_time
from mybatis
where id=#{
arg0}<!--第一个参数的值-->
</select>
还有一个序号参数绑定就是
1.2 注解参数绑定
UserDao
User queryUserByPasswordById(@Param("id") Integer id, @Param("password") String password);//注解参数
UserDao-Mapper.xml
<!--注解参数绑定-->
<select id="queryUserByPasswordById" resultType="User">
select id,username,password,gender,regist_time
from mybatis
where id=#{
id} and password=#{
password}
</select>
mybatistest
User user4 = mapper.queryUserByPasswordById(1, "123");
System.out.println(user4);
1.3 Map参数绑定
UserDao
User queryUserByPasswordById2(Map map);//map参数
UserDao-Mapper.xml
<!--map参数绑定-->
<select id="queryUserByPasswordById2" resultType="User">
select id,username,password,gender,regist_time
from mybatis
where id=#{
id} and password=#{
password}
</select>
mybatistest
Map map=new HashMap();
map.put("id",2);
map.put("password",456);
User user5 = mapper.queryUserByPasswordById2(map);
System.out.println(user5);
1.4 对象参数绑定
UserDao
User queryUserByPasswordById3(User user);//对象参数
UserDao-Mapper.xml
<!--对象参数绑定-->
<select id="queryUserByPasswordById3" resultType="User">
select id,username,password,gender,regist_time
from mybatis
where id=#{
id} and password=#{
password}
</select>
mybatistest
User user=new User();
user.setId(1);
user.setPassword("123");
User user6 = mapper.queryUserByPasswordById3(user);
System.out.println(user6);
1.5 模糊查询
UserDao
List<User> queryUserByName(@Param("username") String username);//模糊查询
UserDao-Mapper.xml
<!--模糊查询-->
<select id="queryUserByName" resultType="User">
select id,username,password,gender,regist_time
from mybatis
where username like concat('%',#{
username},'%')<!--拼接'%'-->
</select>
mybatistest
List<User> users = mapper.queryUserByName("q");
System.out.println(users);
for (User user7:users
) {
System.out.println(user7);
};
2.删除
UserDao
void deleteUser(@Param("id") Integer id);//删除
UserDao-Mapper.xml
<!--删除查询-->
<delete id="deleteUser" parameterType="int">
delete
from mybatis
where id=#{
id}
</delete>
mybatistest
// 删除
System.out.println("******************");
mapper.deleteUser(1);
// 提交事务
sqlSession.commit();
// sqlSession.rollback();
3.修改
UserDao
void updateUser(User user);//更新
UserDao-Mapper.xml
<!--更新-->
<update id="updateUser" parameterType="User">
update mybatis
set username=#{
username},password=#{
password}
where id=#{
id}
</update>
mybatistest
// 更新
User user = new User();
user.setId(2);
user.setUsername("tyu");
user.setPassword("678");
mapper.updateUser(user);
// 提交事务
sqlSession.commit();
4.添加
UserDao
void addUser(User user);
UserDao-Mapper.xml
<!--添加-->
<insert id="addUser" parameterType="User">
insert into mybatis values(#{
id},#{
username},#{
password},#{
gender},#{
regist_time})
</insert>
mybatistest
// 添加
User user=new User(3,"oko","34545",true,new Date());
mapper.addUser(user);
// 提交事务
sqlSession.commit();
主键回填
为什么要主键回填
添加
User user=new User(null,"oko1","345453",true,new Date());
mapper.addUser(user);
// 提交事务
sqlSession.commit();
System.out.println(user);
最后的结果是:
User{
id=null, username='oko1', password='345453', gender=true, regist_time=Sun Sep 27 14:34:41 CST 2020}
数据库上id是有值的,但是实际上java程序中id是没有值的,这会导致后续的业务处理执行不了,因为缺少了id这个主键的值
1.通过last_insert_id()查询主键
<!--添加-->
<insert id="addUser" parameterType="User">
<selectKey order="AFTER" resultType="int" keyProperty="id"><!--order决定执行的先后顺序,keyproperty是方法参数的属性名-->
select last_insert_id()
</selectKey>
insert into mybatis values(#{
id},#{
username},#{
password},#{
gender},#{
regist_time})
</insert>
2.通过uuid()查询主键
<insert id="insertStudent" parameterType="Student">
<selectKey order="BEFORE" keyProperty="id" resultType="string">
select replace(uuid(),'-','')
</selectKey>
insert into ok values (#{
id},#{
username})
</insert>