目录
3.创建Mybatis的映射文件——配置查询表的sql语句包装
2.设置SQL映射文件namespace属性为Mapper接口全限定名
一、MyBatis是什么?
MyBatis是一款优秀的持久性框架,用于简化JDBC开发。
持久层:负责将数据到保存到数据库的那一层代码
JavaEE三层架构:表现层,业务层,持久层
框架:一个半成品软件,可重用的,通用的,软件基础代码模型
二、MyBatis快速入门
1.导入MyBatis坐标
导入Mybatis
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
导入数据库坐标
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
2.创建Mybatis的XML配置文件——配置数据库连接的
在Mybatis官网看到,需要一个配置文件:mybatis-config.xml
里面内容下面的简单示例
修改
(1)driver就是肯定要改成mysql的驱动:
com.mysql.jdbc.Driver
(2)url也要改,连接数据库s_app:
jdbc:mysql:///s_app?useSSL=false
(3)用户名密码也改一下就行
(4)<mapper>这是加载指定mapper的映射文件路径
3.创建Mybatis的映射文件——配置查询表的sql语句包装
官网上有示例写sql语句的文件
其中name和id可以随便取,调用的时候使用,然后resultType是返回结果,在下面写上sql语句
4.具体的代码实现
(1)先通过配置的XML文件,创建一个工厂
(2)然后花去工厂对象,来执行sql语句,最后释放资源即可
三、实战实现
1.导入坐标
在pom.xml文件下
导入两个jar包
2.创建xml配置文件
创建mybatis-config.xml
我将密码,url,driver改好(我用的是最新版的mysql,driver变了)
连接数据库mybatis,映射文件也改过了,为UserMapper.xml
<?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.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
3.创建Mybaties映射文件
创建UserMapper.xml文件
我将tb_user的数据全部查询,返回类型为User这个类,类的地址也卸载resultType中
<?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">
<mapper namespace="test">
<select id="selectAll" resultType="com.rosen.pojo.User">
select * from mybatis.tb_user
</select>
</mapper>
根据表创建一个类:User,每个成员变量名必须和数据库中名字相同
4.代码实现
创建工厂,调用sql语句,把返回的user打印出来
import com.mysql.cj.protocol.ReadAheadInputStream;
import com.rosen.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class mytest {
public static void main(String[] args) throws IOException {
String resource="mybatis-config.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
List<User> users = sqlSession.selectList("test.selectAll");
System.out.println(users);
sqlSession.close();
}
四、Mapper代理开发
刚才写代码,调用test.selectAll每次写一次就要查找id和name很麻烦
因此又有新的方法来替换。
1.定义接口
定义与SQL映射文同名的Mapper接口,目录也要一样(最新版不需要)
方法1:映射文件直接拖入接口目录下
为了分开
方法2:在resource使用com.rosen.mapper发现不会分层目录,改成com/rosen/mapper就是三层目录了,然后把映射文件写入。在main里面把接口文件写入com.rosen.mapper。这样两个文件就在一个目录了
2.设置SQL映射文件namespace属性为Mapper接口全限定名
就是把原来的namespace改成对应接口的路径
3.在mapper接口文件书写方法
就是映射文件的id为方法名字,返回还是集合列表
package com.rosen.mapper;
import com.rosen.pojo.User;
import java.util.List;
public interface UserMapper {
List<User> selectAll();
}
4.配置文件中的映射文件路径修改
5.执行代码
直接读取接口,然后调用方法就行
import com.rosen.mapper.UserMapper;
import com.rosen.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class mytest {
public static void main(String[] args) throws IOException {
String resource= "mybatis-config.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
//List<User> users = sqlSession.selectList("test.selectAll");
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectAll();
System.out.println(users);
sqlSession.close();
}
}
6.补充
(1)扫描mapper的包
因为不同表有不同的映射文件,不能一个一个加吧,就有包扫描的方式
改为package就直接扫描了
(2)插件加成
下载完后蓝色鸟和红色鸟一一对应
(3).类名和属性名不一样怎么办
起别名的方法
(4)有输入参数的
映射文件中输入参数是#{id}——>防止注入,$ {id}——>普通替换
接口里面设置id参数,其他就可以正常使用了
(5)大于号小于号无法使用
xml的小于号为开始符号,因此sql语句无法正常使用
1)转译字符
2)CTATA区
如:
(6)多条件查询
可以参数传递,可以类里面有成员变量传递,也可以键值传递
(7)注解映射语句
不用再xml映射文件上写具体sql代码,直接在接口上写注解即可完成查询