什么是mybatis ?
MyBatis 是一款一流的支持自定义 SQL、存储过程和高级映射的持久化框架。MyBatis 几乎消除了所有的 JDBC 代码,也基本不需要手工去设置参数和获取检索结果。MyBatis 能够使用简单的XML 格式或者注解进行来配置,能够映射基本数据元素、Map 接口和 POJOs(普通 java 对象)到 数据库中的记录。
简单理解的话 , 就是与专门与数据库交互的框架
目录
mybatis架构 :
1. 核心配置文件
![](https://i-blog.csdnimg.cn/blog_migrate/750107ebaa858312a231616d2271b5ae.png)
它们都是外部化,可替代的属性。可以配置在一个典型的 Java 属性文件中,或者通过properties 元素的子元素进行配置。
Setting 元素下是些非常重要的设置选项,用于设置和改变 MyBatis 运行中的行为。下面的表格列出了 Setting 元素支持的属性、默认值及其功能。
别名是一个较短的 Java 类型的名称。这只是与 XML 配置文件相关联,减少输入多余的完整类名。
MyBatis 能够配置多套运行环境,这有助于将您的 SQL 映射到多个数据库上。例如,在您的开发、测试、生产环境中,您可能有不同的配置。或者您可能有多个共享同一 schema 的生产用数据库,或者您想将相同的 SQL 映射应用到两个数据库等等许多用例。
现在,MyBatis 的行为属性都已经在上面的配置元素中配置好了,接下来开始定义映射 SQL语句。但首先,我们需要告诉 MyBatis 在哪里能够找到我们定义的映射 SQL 语句。在这方面, JAVA 自动发现没有提供好的方法,因此最好的方法是告诉 MyBatis 在哪里能够找到这些映射文件
这个元素中我们告诉mybatis与哪个接口进行映射
2. sql映射文件
<?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">
<mapper namespace="com.ff.mybatis.dao.UserDao"> </mapper>
<mapper></mapper>上面是约束 , <mapper>里面的namespace属性就是这个xml文件对应的接口
那么我们要如何在接口对应的xml文件中写sql呢 ?
插入数据
<insert id=" 唯一标识 " useGeneratedKeys=" 把新增加的主键赋值到自己定义的 keyProperty " keyProperty=“ 接收主键的属性 parameterType=" 参数类型 ">insert into user(userName,userAge)values(#{userName},#{userAge})</insert>
#{} 占位符,是经过预编译的,编译好 SQL 语句再取值,#方式能够防止 sql 注入
${} , 采用的是字符串拼接方式, 多用于传列名
<update id= " 唯一标识 " parameterType=“ 参数类型 ">update ts_user set userName = #{userName},userAge = #{userAge} where userId = #{userId}</update>
<delete id= " 唯一标识 " parameterType= " 参数类型 " >delete from ts_user where userId = #{id}</delete>
<select id=" 唯一标识 " resultType=" 返回结果集类型 ">select * from ts_user where id= #{id}</select>
其中 resultType 是查询返回的结果类型
参数传递
parameterType为传入的参数类型 , 一般传入的类型较复杂时使用
User selectUsers(int id);delete from ts_user where userId = #{id}
User selectUsers(@Param(“id”)int id,@Param(“name”)String name);
这里也是可以直接拿到对应的值
那么什么时候用到parameterType呢 ?
我们一般在传入一个对象类型的时候使用 , 它可以拿出对象里面的值,例如
<insert id = "insertUser" parameterType = "User" >insert into users (id, username, password) values (#{id}, #{username}, #{password})</insert>
这里我们也可以使用map传递
User selectUser(Map<Integer,String> map)<select id="selectUser" parameterType="map" resultType="User"> select * from t_user where id=#{id} </select>
parameterType选择 map 或者hashmap , #{id} 表示map的键, sql直接通过键拿到值
3. POJO 对象输出映射
当我们与数据库交互获得查询后的结果时,mybatis怎么去处理它们呢?
当返回基本类型时
int findUserInfoCount();<select id="findUserInfoCount" resultType="int">select count(*) from userInfo</select>
resultType选择 int , 接口的返回值类型也是 int
但如果 我们接口中定义的方法返回值是一个对象, 这时怎么办呢?
User userLogin(String name) //返回值为自定义的引用类型
这时我们只需将 resultType的值设置为我们自定义的引用类型即可 , 当查询到结果后, 如果数据库字段和我们自定义类中的属性一致的话 , mybatis就会自动创建一个对象,将查询到的结果直接映射到对象中, 然后把该对象给我们返回, 这里 mybatis为我们创建对象默认调用无参的构造方法
这就是mybatis框架的便捷之处 , 另外也可以在settings配置中设置驼峰映射
<setting name="mapUnderscoreToCamelCase" value="true"/>
由于命名规范 , 在数据库中我们一般命名字段为 user_name, java中的匹配属性为userName,开启此设置, 我们便不考虑必须使得数据库中的字段和java中类的属性名字一样
搭建 :
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
创建 model 目录 创建User类
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
新建dao目录 , 创建LoginDao接口
public interface LoginDao {
//定义方法
User userLogin(String name);
}
在 resources 目录下创建 mapper目录 ,新建LoginMapper.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">
<mapper namespace="dao.LoginDao">
<!-- sql语句-->
<select id="userLogin" resultType="User">
select name from t_user where name=#{name}
</select>
</mapper>
resources目录下新建config.properties配置文件
driverName=com.mysql.cj.jdbc.Driver
urlName=jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC
userName=root
password=root
resources目录下新建mybatis核心配置文件Mybatis-cof.xml文件
<?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">
<!--mybatis核心配置-->
<configuration>
<!-- 导入配置文件-->
<properties resource="config.properties">
</properties>
<!-- 为类配置别名-->
<typeAliases>
<typeAlias type="model.User" alias="User"/>
</typeAliases>
<!-- 配置环境-->
<environments default="development">
<environment id="development">
<!--配置事务管理类型,使用jdbc事务管理7-->
<transactionManager type="JDBC">
</transactionManager>
<!--加载mysql驱动-->
<dataSource type="UNPOOLED">
<property name="driver" value="${driverName}"/>
<property name="url" value="${urlName}"/>
<property name="username" value="${userName}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--添加sql映射文件-->
<mappers>
<mapper resource="mapper/LoginMapper.xml"/>
</mappers>
</configuration>
新建 util 目录 , 创建MybatisUtil类
public class MybatisUtil {
static SqlSessionFactory sessionFactory=null;
static {
Reader reader=null;
try {
//读取mybatis核心配置文件
reader = Resources.getResourceAsReader("Mybatis-cof.xml");
} catch (IOException e) {
e.printStackTrace();
}
//创建SqlSessionFactory对象,它是创建SqlSession的工厂
//创建开销较大,一个程序只有一个,创建既不用关闭
sessionFactory=new SqlSessionFactoryBuilder().build(reader);
}
public static SqlSession getSqlSession() {
return sessionFactory.openSession();
}
}
测试类 :
public class Test {
public static void main(String[] args) {
SqlSession sqlSession= MybatisUtil.getSqlSession();
//获得接口的代理对象
LoginDao mapper=sqlSession.getMapper(LoginDao.class);
User user = mapper.userLogin("b李雷");
System.out.println(user);
//提交事务
sqlSession.commit();
//销毁关闭
sqlSession.close();
}
}
测试所用数据库表如下 :
执行 :
查询成功