Mybatis学习笔记
MyBatis概述
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
新建项目
1.新建一个普通的maven项目
2.删除src目录
3.导入maven依赖
创建一个模块
1.编写mybatis的核心配置文件
<?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.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8/"/>
<property name="username" value="root"/>
<property name="password" value="fa6298500"/>
</dataSource>
</environment>
</environments>
</configuration>
2.编写mybatis工具类
//mybatis工具类
//sqlSessionFactory --> sqlSession
public class MybatisUtils
{
private static SqlSessionFactory sqlSessionFactory;
static
{
try
{
//使用mybatis获得sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
catch (IOException e)
{
e.printStackTrace();
}
}
//既然有了sqlSessionFactory,就可以从中获得sqlSession实例了
//sqlSession完全包含了面向数据库执行SQL命令所需的所有方法
public static SqlSession getSqlSession()
{
return sqlSessionFactory.openSession();
}
}
3.编写实体类
package com.pojo;
//数据库实体类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User
{
private int id;
private String name;
private String pwd;
}
4.Dao接口
public interface UserDao
{
List<User> getUserList();
}
5.接口实现类
<?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=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.dao.UserDao">
<!-- select查询语句 -->
<select id="getUserList" resultType="com.pojo.User">
select * from mybatislearn.user;
</select>
</mapper>
测试
org.apache.ibatis.binding.BindingException: Type interface com.dao.UserMapper is not known to the MapperRegistry.
错误原因:每一个mapper文件都需要在Mybatis核心配置文件中注册
java.lang.ExceptionInInitializerError
错误原因:maven的约定大于配置
解决方法:
在build中配置resources,来防止资源导出失败的问题
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
这段代码放入两个pom.xml中
CRUD
1.namespace
namespace中的包名要与Dao/mapper接口的包名一致
2.select
选择,查询语句;
- id:对应namespace中的方法名
- resultType:sql语句执行的返回值
- parameterType:参数类型
1.编写接口
//查询全部用户
List<User> getUserList();
2.编写对应的mapper中的sql语句
<select id="getUserList" resultType="com.pojo.User">
select * from mybatislearn.user;
</select>
3.测试
@Test
public void test()
{
try (SqlSession sqlSession = MybatisUtils.getSqlSession())
{
//第一步,获取SqlSession对象
//第二步,执行sql
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = userMapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
}
}
3.insert
<!--对象中的属性,可以直接取出来 -->
<insert id = "addUser" parameterType = "com.pojo.User">
insert into mybatislearn.user(id, name, pwd) values(#{id},#{name},#{pwd});
</insert>
4.update
<update id = "updateUser" parameterType = "com.pojo.User">
update mybatislearn.user set name = #{name},pwd = #{pwd} where id = #{id};
</update>
5.delete
<delete id = "deleteUser" parameterType = "com.pojo.User">
delete from mybatislearn.user where id = #{id};
</delete>
注意点
- 增删改需要提交事务
sqlSession.commit();
万能的map
假设我们的实体类或者数据库中的表,字段或者参数过多,我们应当考虑使用map
int addUser2(Map<String, Object> map);
<insert id = "addUser2" parameterType = "map">
insert into mybatislearn.user(id,pwd) values (#{userID},#{passWord});
</insert>
@Test
public void getUserById2()
{
try(SqlSession sqlSession = MybatisUtils.getSqlSession())
{
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("mima","123456");
userMapper.getUserById2(map);
sqlSession.commit();
}
}
Map传递参数,直接在sql中取出key即可(parameterType = "map")
对象传递参数,直接在sql中取对象的属性即可(parameterType = "Object")
只有一个参数的情况下,可以直接在sql中取到!
多个参数用map或者注解
模糊查询怎么实现
1.Java代码执行的时候,传递通配符% %
List<User> userList= userMapper.getUserLike("%李%");
2.在sql拼接中使用通配符!
select * from mybatislearn.user where name like "%"#{value}"%";
2.环境配置(environments)
MyBatis可以配置成适应多种环境
不过要记住:尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境
默认事务管理器:JDBC 连接池:POOLED
3.属性(properties)
我们可以通过properties来实现引用配置文件
这些属性都是可外部配置且可动态替换的,既可以在典型的Java属性文件中配置,
也可通过properties元素的子元素来传递【db.properties】
编写一个配置文件
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456
在核心配置文件中映入
<!-- 引入外部配置文件 -->
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="password" value="fa6298500"/>
</properties>
- 可以直接引入外部文件
- 可以在其中增加一些属性配置
- 如果两个文件有同一个字段,优先使用外部配置文件的!
类型别名(typeAliases)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写
<!-- 可以给实体类起别名 -->
<typeAliases>
<typeAlias type = "com.pojo.User" alias="User"/>
</typeAliases>
也可以指定一个包名,MyBatis会在包名下面搜索需要的Java Bean,比如:扫描实体类的包,它的默认别名就为这个类的类名,首字母小写。
<!-- 可以给实体类起别名 -->
<typeAliases>
<package name = "com.pojo"/>
</typeAliases>
在实体类比较少的时候,使用第一种方式
如果实体类十分多,建议使用第二种
第一种可以DIY别名,第二种不行,如果非要改,需要在实体上添加注解
分页
- 减少数据的处理量
1.使用limit分页
语法:select * from user limit startIndex,pageSize;
使用mybatis实现分页,核心sql
1.接口
List<User> getUserByLimit(Map<String, Object> map);
2.Mapper.xml
<select id="getUserByLimit" parameterType="map" resultType="User">
select * from mybatislearn.user limit #{startIndex},#{pageSize};
</select>
3.测试
public void getUserByLimit()
{
try(SqlSession sqlSession = MybatisUtils.getSqlSession())
{
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("startIndex",0 );
map.put("pageSize",2);
List<User> userList = userMapper.getUserByLimit(map);
for (User user : userList)
{
System.out.println(user);
}
}
}
使用注解开发
1.注解在接口上实现
@Select("select * from mybatislearn.user")
List<User> getUsers();
}
2.需要在核心配置文件中绑定接口
<!--绑定接口 -->
<mappers>
<mapper class="com.dao.UserMapper"/>
</mappers>
3.测试
SpringBoot整合MyBatis
整合包
mybatis-spring-boot-starter
1.导入包
2.配置文件
3.mybatis配置
4.编写sql
5.service层调用dao层
6.controller调用service层
总结
整体来说Mybatis的学习难度不大,and用XML写sql真的香啊!不用频繁修改代码里的sql语句很方便!具体可以去参考狂神说Java的Mybatis学习视频。