简介:使sql与代码分离,提供映射标签和XML标签,支持编写动态sql。
使用:
1.配置maven的pom.xml文件,导入所需依赖
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.31</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
注意:配置文件(资源)有时候无法导出
<!--防止资源导出失败--> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
2.在resources下,创建mybatis配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://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="driver" value="com.mysql.cj.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="123456"/> </dataSource> </environment> </environments> <!--每创建一个Mapper.xml都需要在这里注册绑定--> <mappers> <mapper resource="com/kuang/dao/UserMapper.xml"></mapper> </mappers> </configuration>
3.得到SqlSession对象
public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { String resource = "mybatis-config.xml"; InputStream inputStream= Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
4.创建pojo实体类(注意:必须有无参构造函数)
5.创建Mapper(就是JDBC的DAO层)
public interface UserMapper { List<User> getUserList(); User getUserById(int id); void addUser(User user); }
6.每创建一个DAO接口,就要创建一个Mapper.xml(相当于JDBC中DAO层接口的实现类)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--相当于JDBC里面接口的实现类--> <!--映射接口--> <mapper namespace="com.kuang.dao.UserMapper"> <!--id必须和方法名一致--> <select id="getUserList" resultType="com.kuang.pojo.User"> select * from mybatis.user </select> <select id="getUserById" parameterType="int" resultType="com.kuang.pojo.User"> select * from mybatis.user where id = #{id} </select> <insert id="addUser" parameterType="com.kuang.pojo.User"> insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd}) </insert> </mapper>
7.Mapper.xml配置完,需要在mybatis配置文件中进行注册绑定
<!--每创建一个Mapper.xml都需要在这里注册绑定--> <mappers> <mapper resource="com/kuang/dao/UserMapper.xml"></mapper> </mappers>
8.调用
a)得到SqlSession
SqlSession sqlSession = MybatisUtils.getSqlSession();
b)getMapper方法相当于得到了实现类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
c)调用接口方法
List<User> userList = mapper.getUserList();
d)关闭
sqlSession.close();
注意:当对数据库进行增删改时候,需要进行提交事务 sqlSession.commit();
public void test1(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); //执行sql UserMapper mapper = sqlSession.getMapper(UserMapper.class);//getMapper方法相当于得到了实现类 List<User> userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); } sqlSession.close(); } public void test3(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); //执行sql UserMapper mapper = sqlSession.getMapper(UserMapper.class);//getMapper方法相当于得到了实现类 mapper.addUser(new User(666,"码农","coding")); //增删改需要提交事务!!! sqlSession.commit(); test1(); sqlSession.close(); }
万能Map
属性优化:
mybatis-config.xml还可以引用外部资源配置
别名优化:
基本类型的别名:int -> _int(其他同理)
包装类的别名:Integer -> int(其他同理)
映射:(xml注册绑定到mybatis-config)
解决属性名(实体类)与字段名(数据库)不一致情况:
多表嵌套查询:
多对一
1.嵌套子查询
2.联表查询(一个select解决,推荐!)
一对多
动态sql:
if
choose
set
sql
foreach
缓存:
一级缓存(默认开启):SqlSession级别的,生存周期只在SqlSession存活期间(openSession->sqlSession.close)
二级缓存(需要将pojo实体序列化):作用域更大,是namespace级别的,作用于整个Mapper.xml中
查询顺序:二级缓存->一级缓存->数据库