【MyBatis】HelloMyBatis——快速入门与增删改查

news/2024/5/19 0:49:17 标签: mybatis, mysql, java, jdbc

原生JDBC的设计缺陷

原生JDBC开发存在许多问题:

1)频繁创建/释放数据库连接,造成资源浪费

2)sql语句和java代码是耦合死的,这种硬编码不利于后期维护

3)查询操作时,需要手动将结果集的数据封装到实体中;插入操作时,需要手动将实体的数据一个个传给sql语句的占位符

上述问题都有对应的解决方案:

1)使用数据库连接池

2)sql语句抽取到配置文件中,从而解耦

3)使用反射、内省等底层技术,将实体属性与表字段进行自动映射

 
 

什么是MyBatis

mybatis是一个优秀的基于java的持久层框架。它内部封装了jdbc,使得开发者只需关注sql语句本身,而不必花费精力去加载驱动、创建连接、创建statement等。

mybatis通过xml配置或注解配置,一方面,实现statement中占位符与java实体的动态映射,并形成一个完整的sql语句;另一方面,sql语句执行返回的结果集也同样通过动态映射,最终生成一个java实体。

 
 

MyBatis快速入门

开发步骤:

① 引入MyBatis相关坐标

② 编写User实体类

③ 编写映射文件(userMapper.xml)

④ 编写核心文件(sqlMapConfig.xml)

⑤ 测试

代码实现:

① 引入MyBatis相关坐标

<!-- 仅供参考 -->
<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.16</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
</dependencies>

② 编写User实体类

java">java.com.samarua.domain.User
-------------------------------------------------------------------------------------------
public class User {

    private int id;
    private String username;
    private String password;
	//...
}

③ 编写映射文件(userMapper.xml)

path: resources.com.samarua.mapper.userMapper.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="userMapper">

    <select id="findAll" resultType="com.samarua.domain.User">
        select * from user
    </select>

</mapper>

④ 编写核心文件(sqlMapConfig.xml)

path: resources.sqlMapConfig.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">

<configuration>
    
    <!-- 数据源环境 -->
    <environments default="test">
        <environment id="test">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/loliDB"/>
                <property name="username" value="root"/>
                <property name="password" value="20006212000d"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="com/samarua/mapper/userMapper.xml"/>
    </mappers>
    
</configuration>

⑤ 测试

java">public class MyBatisTest {

    @Test
    public void test1() throws IOException {
        // 加载核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        // 获得会话工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        // 获得会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 执行sql语句(参数:namespace+id)
        List<User> userList = sqlSession.selectList("userMapper.findAll");
        // 打印结果
        System.out.println(userList);
        // 释放资源
        sqlSession.close();
    }

}

在这里插入图片描述

 
 

MyBatis增删改查

1)parameterType=传入实体/参数的类型,resultType=返回查询结果的类型

2)占位符为#{传入实体的属性名};如果传入的是不是实体类型而是普通参数类型Interger,String…则{}内写什么都行

3)除了查询操作,增/删/改操作均需要手动提交事务————sqlSession.commit()

<!-- userMapper.xml -->
<!-- 约束头略 -->
<mapper namespace="userMapper">

    <!-- 增 -->
    <insert id="save" parameterType="com.samarua.domain.User">
        insert into user values(#{id}, #{username}, #{password})
    </insert>
    <!-- 删 -->
    <delete id="delete" parameterType="java.lang.Integer">
        delete from user where id = #{id}
    </delete>
    <!-- 改 -->
    <update id="update" parameterType="com.samarua.domain.User">
        update user set username = #{username}, password = #{password} where id = #{id}
    </update>
    <!-- 查 -->
    <select id="findAll" resultType="com.samarua.domain.User">
        select * from user
    </select>

</mapper>
java">// 不难看出,传入的参数对应parameterType,返回的结果对应resultType
sqlSession.insert("userMapper.save", user);
sqlSession.delete("userMapper.delete", 3);
sqlSession.update("userMapper.update", user);
List<User> userList = sqlSession.selectList("userMapper.findAll");

 
 
 
 

 
 
 
 

 
 
 
 

More >_<


http://www.niftyadmin.cn/n/1330041.html

相关文章

【MyBatis】特定场景下的语句拼接——动态sql语句

<if>标签 xxxMapper.xml配置文件中的写法&#xff1a; <select id"findByCondition" parameterType"user" resultType"user">select * from user<where><if test"id!0">and id #{id}</if><if tes…

【MyBatis】sqlSession对象的间接使用——代理开发方式

MyBatis传统开发方式 先提前说一点&#xff0c;现阶段dao层也可以叫做mapper层。 传统开发方式就是MVC中dao层的经典写法&#xff0c;只是把sql逻辑写在xxxMapper.xml配置文件中而已&#xff1a; [接口]com.samarua.mapper.userMapper ------------------------------------…

【经典专题】从此开始玩转二分——A模板:命中

二分法看似千变万化&#xff0c;但都可归纳为两种模板。 命中模板——目标值已有确定值。万军丛中只此一个目标&#xff0c;便可一击命中。 收缩模板——目标值还未确定&#xff0c;只知道它所符合的条件。前面一堆false&#xff0c;后面一堆true&#xff0c;真正的目标是第一个…

【经典专题】从此开始玩转二分——B模板:收缩

二分法看似千变万化&#xff0c;但都可归纳为两种模板。 命中模板——目标值已有确定值。万军丛中只此一个目标&#xff0c;便可一击命中。 收缩模板——目标值还未确定&#xff0c;只知道它所符合的条件。前面一堆false&#xff0c;后面一堆true&#xff0c;真正的目标是第一个…

【LeetCode】Sama的个人记录_54

>>> 位运算解法1: >>> res左移 -> 将n的二进制最后一位加在res最后一位上 -> n右移 (32次完成所有位的转移)class Solution {public int reverseBits(int n) {int res 0;int cnt 32;while (cnt > 0) {res << 1;res (n & 1);n >>…

【MyBatis】核心配置文件的相关参数——sqlMapConfig.xml中的标签

properties MyBatis同样拥有类似EL的语法&#xff0c;也同样经常对数据源配置参数进行解耦。 <!-- 引入外部资源文件 --> <properties resource"jdbc.properties"/>typeAliases aliases译为“别名”。 我们在xxxMapper.xml中写parameterType/resultT…

2018第九届蓝桥杯省赛,国赛参赛经验心得分享(JavaB组)

我来自广东某大学&#xff0c;今年大一&#xff0c;刚刚参加完蓝桥杯&#xff0c;这是我的第一篇博客&#xff0c;希望能给你带来一些帮助&#xff0c;不足之处希望指正。 关于比赛前的一些经历: 原本想要大二才接触这个比赛的&#xff0c;赶巧在2017年12月14日那天有个外校…

【MyBatis】如何让用resultMap表示一张大表——多表查询

理解思路 之前学习的MyBatis查询中&#xff0c;查询的如果是单个实体/实体集合&#xff0c;那么就把结果类型resultType写为com.samarua.domain.User/user&#xff1b;查询的如果是某个单一的属性值&#xff0c;那么就把结果类型resultType写为java.lang.Integer/int…那么&am…