ORMapping:Object Relationship Mapping 对象关系映射
实现数据持久化的开发框架,对JDBC的封装
与jdbc相比减少了50%代码量
最简单的持久化框架,小巧易学
与应用程序的解耦,sql写在xml内,降低耦合度,便于统一管理和优化、重用。
提供xml标签,支持编写动态sql语句
提供映射标签,支持对象与数据库的ORM字段关系映射。
缺点:
sql语句编写工作量较大
sql语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
核心接口类:
SqlSessionFactoryBuilder
SqlSessionFactory build()
SqlSessionFactory
openSession()
SqlSession
getMapper
maven依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
<?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="developer">
<environment id="developer">
<!-- jdbc 事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!-- POOLED配置JDBC数据源连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value=""/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
</configuration>
mybatis需要开发者自定义sql语句,写在mapper.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="com.cys.mapper.AccountMapper">
<insert id="save" parameterType="com.cys.entity.Account">
insert into t_account(username, password, age) values(#{username}, #{password}, #{age})
</insert>
</mapper>
manaspace通常设置为所在包名+文件名形式
在config.xml添加mapper注册
<mappers>
<mapper resource="com/cys/mapper/AccountMapper.xml"></mapper>
</mappers>
- 调用myBatis原生接口添加执行操作
public class Test {
public static void main(String[] args) {
InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = build.openSession();
String statement = "com.cys.mapper.AccountMapper.save";
Account cys = new Account(1L, "cys", "133", 14);
sqlSession.insert(statement, cys);
sqlSession.commit();
}
}
通过Mapper代理实现自定义接口
1.自定义接口,定义相关业务方法;
public interface AccountRepository {
int save (Account account);
int update(Account account);
int deleteById(long id);
List<Account> findAll();
Account findById(long id);
}
2.编写方法对应的Mapper.xml,定义接口对应的sql语句。
规则:
Mapper.xml中namespace为接口的全类名
Mapper.xml中statement的id为接口对应的方法名
Mapper.xml中的parameterType和接口中对应的方法的参数类型一致。
Mapper.xml中的resultType和接口中对应的方法的返回值类型一致。
<?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.cys.mapper.AccountMapper">
<insert id="save" parameterType="com.cys.entity.Account">
insert into t_account(username, password, age) values(#{username}, #{password}, #{age})
</insert>
<update id="update" parameterType="com.cys.entity.Account">
update t_account set username = #{username}, password = #{password}, age = #{age} where id = #{id}
</update>
<delete id="deleteById" parameterType="long">
delete from t_account where id = #{id}
</delete>
<select id="findAll" resultType="com.cys.entity.Account">
select * from t_account
</select>
<select id="findById" parameterType="long" resultType="com.cys.entity.Account">
select *
from t_account where id = #{id};
</select>
</mapper>
package com.cys;
import com.cys.entity.Account;
import com.cys.repository.AccountRepository;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
/*
* @author Administrator <br/>
* @date: 2021/4/21 0021 21:24 <br/>
* @version: 1.0
* @since JDK 1.8
* */
public class Test2 {
public static void main(String[] args) {
InputStream inputStream = Test2.class.getClassLoader().getResourceAsStream("");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = build.openSession();
AccountRepository mapper = sqlSession.getMapper(AccountRepository.class);
List<Account> all = mapper.findAll();
for (Account account: all) {
System.out.println(account);
}
sqlSession.close();
}
}
Mapper.xml
-
statenebt标签:select、update、delete、insert标签
-
parameterType:参数数据类型
1、基本数据类型,例如通过id查询Accountselect * from t_account where id = #{id}; </select>
2、String类型
3、包装类
4、多个参数,比如有String和int的 name、age;
不写参数类型,通过下标取值,从0开始;<select id="findByNameAndAge" resultType="com.cys.entity.Account"> select * from t_account where username = #{param0} and age=#{param1} </select>
5、javaBean作为参数
<insert id="save" parameterType="com.cys.entity.Account"> insert into t_account(username, password, age) values(#{username}, #{password}, #{age}) </insert>
-
resultType结果数据类型
1、基本数据类型
2、包装类
3、String类型
4、java Bean -
级联查询