Mybatis之数据库连接+PageHelper分页插件+Mybatis-Plus插件

发布时间 2023-04-03 09:05:26作者: 古锁阳关

MyBatis Plus 教程(人人便成为)

https://www.cnblogs.com/chch213/p/16320820.html

前言

ORM框架:对象关系映射  object relational mapping  半自动ORM映射工具(自己编写sql语句)    Hibernater属于全自动
映射规则:数据库表 > 类 | 表字段 > 类的属性 | 表数据 > 对象
 
JDBC操作数据库
复制代码
public class JDBCTest {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            // 1、数据库连接参数
            String url = "jdbc:mysql://localhost:3306/user?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8";
            String username = "123";
            String password = "123";
            // 2、获加载数据库连接驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 3、创建数据库连接对象
            connection = DriverManager.getConnection(url, username, password);
            // 4、预处理sql语句
            preparedStatement = connection.prepareStatement("select * from user");
            // 5、执行sql语句
            resultSet = preparedStatement.executeQuery();
            // 6、解析结果集
            while (resultSet.next()) {
                User user = new User();
                user.setUserName(resultSet.getString("username"));
                System.out.println(user.toString());
            }
            // 7、关闭资源
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                resultSet.close();
                preparedStatement.close();
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
复制代码

 

Mybatis操作数据库

官网

mybatis – MyBatis 3 | 简介

复制代码
// 加载核心配置文件
String resource = "org/mybatis/builder/mybatis-config.xml"; 
InputStream inputStream = Resources.getResourceAsStream(resource); 
// 获取sqlsession工厂对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); 
SqlSessionFactory factory = builder.build(inputStream);
// 通过工厂对象获取sqlsession对象
sqlSession = factory.openSession(true);
// 获取接口的实现类代理对象
Mapper mapper = sqlSession.getMapper(T.class);
// 通过实现类对象调用方法
User user = mapper.queryUser(id);
复制代码

 

Mybatis接口的动态代理实现DAO

Mapper 接口开发需要遵循以下规范:

1) Mapper.xml文件中的namespace与mapper接口的全限定名(包名.类名)相同

2) Mapper接口方法名和Mapper.xml中定义的每个statement的id(唯一标识)相同

3) Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同

4) Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

 怎么实现动态代理的?
 
复制代码
    public static void mapperTest() {
        InputStream is = null;
        SqlSession sqlSession = null;
        try {
            // 加载核心配置文件
            is = Resources.getResourceAsStream("mybatis-config.xml");
            // 获取sqlSession工厂对象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            // 获取sqlSession对象
            sqlSession = sqlSessionFactory.openSession();
            // 获取代理对象
            IUserServiceDao mapper = sqlSession.getMapper(IUserServiceDao.class);
            // 调用方法
            List<String> list = new ArrayList<>(1);
            list.add("12");
            List<UserVO> userVOList = mapper.queryUserList(list);
            System.out.println(userVOList.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                sqlSession.close();
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
复制代码
getMapper() 方法最终获取到 org.apache.ibatis.binding.MapperProxy 代理对象
 
-  <sql>:抽取 SQL 语句标签。 
-  <include>:引入 SQL 片段标签。 
   <sql id=“片段唯一标识”>抽取的 SQL 语句</sql> <include refid=“片段唯一标识”/>

 

PageHelper分页插件
 
 
 
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <property name="helperDialect" value="mysql"/>
            <property name="reasonable" value="true"/>
        </plugin>
    </plugins>

PageHelper.startPage(1, 2); // 开启分页

 
PageHelper源码解析:
public class PageHelper extends PageMethod implements Dialect, Chain {
    private PageParams pageParams;  // 分页参数
    private PageAutoDialect autoDialect; // 数据源
    private PageBoundSqlInterceptors pageBoundSqlInterceptors; // sql处理

 

 
Mybatis常用注解
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@One:实现一对一结果集封装
@Many:实现一对多结果集封装
 
 
复制代码
public interface IUserServiceDao {
    //查询全部
    @Select("SELECT * FROM user")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "name",property = "name"),
            @Result(
                    property = "phone",  // 被包含对象的变量名
                    javaType = List.class,  // 被包含对象的实际数据类型
                    column = "id",          // 根据查询出的user表的id字段来查询phone表
                    /*
                        many、@Many 一对多查询的固定写法
                        select属性:指定调用哪个接口中的哪个查询方法
                     */
                    many = @Many(select = "com.exmple.demo.IPhoneDao.selectByCid")
            )
    })
    public abstract List<Classes> selectAll();
}
复制代码

 

 Mybatis-Plus使用
官网
 
POM文件依赖配置:
        <!-- mybatis-plus 插件依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.5.0</version>
        </dependency>

 

Dao层定义接口:

public interface IUserServicePlusDao extends BaseMapper<PhoneNumber> {
}
 
实体类映射表:
复制代码
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
@ToString
@EqualsAndHashCode
@TableName("phone_number")
public class PhoneNumber {
    // id
    private String id;
    // 地址
    private String address;
    // 用户
    private String userId;
    // 有效标志
    private String isValid;
    // 创建时间
    private Date createDate;
}
复制代码