Mybati启动配置,简单增删改查和事务

这边的东西全部来自 https://itbaima.net/document

Mybatis

基础配置

  • 目录
    在这里插入图片描述

  • 需要JavaBean, MySQL表, mapper.xml, 接口, mybatis-config.xml

1.mybatis-config.xml

配置文件负责连接数据库 同时扫描到mapper.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://localhost:3306/m1?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
<!--    mapper 是扫描接口对应配置xml的 还有一种是到时候直接写文件夹-->
<!--    <mappers>-->
<!--        <mapper resource="myb/TestMapper.xml"/>-->
<!--    </mappers>-->
</configuration>

2.interface

接口负责定义方法

public interface UserMapper {
    User selectUserById(int id);
    List<User> selectAllUsers();
    @MapKey("id")//mybatis会把这个id作为key 不写也不报错
    List<Map> selectAllUsers2();
    void insertUser(User user);
}

3.mapper.xml

mapper.xml负责映射interface的方法

  • namespace 接口所在的位置
  • id 接口的目标方法
  • 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="myb.mapper.UserMapper">
    <!--    id 接口的目标方法   resultType 查询的返回值-->
    <!--    parameterType="integer" 不写也没事-->
    <select id="selectUserById" resultType="myb.bean.User" >
        select * from users where id=#{id}
    </select>
    <select id="selectAllUsers" resultType="myb.bean.User">
        select * from users
    </select>
    <select id="selectAllUsers2" resultType="Map">
        select * from users
    </select>
    <insert id="insertUser" >
        insert into users values(null,#{username},#{password},#{email})
    </insert>
</mapper>

4.JavaBean

JavaBean负责映射表

@Data
@ToString
@Accessors(chain = true)//链式写法 lombok的注解
public class User {
    private int id;
    private String username;
    private String email;
    private String password;

    // 构造方法、getter 和 setter 略
}

5.mysql表

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50),
    email VARCHAR(100),
    password VARCHAR(50)
);

6.测试

  1. 配置文件完成后,我们需要在Java程序启动时,让Mybatis对配置文件进行读取并得到一个SqlSessionFactory对象:
  2. 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的,我们可以通过SqlSessionFactory来创建多个新的会话,SqlSession对象,每个会话就相当于我不同的地方登陆一个账号去访问数据库,你也可以认为这就是之前JDBC中的Statement对象,会话之间相互隔离,没有任何关联。
    @Test
    public void test2() throws IOException {

        // 指定 MyBatis 配置文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // 创建 SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 获取 SqlSession 
        // sqlSessionFactory.openSession()默认autoCommit=false
        try (SqlSession session = sqlSessionFactory.openSession()) { 
            // 获取 UserMapper 接口的实例
            UserMapper mapper = session.getMapper(UserMapper.class);
            // 执行查询操作
            User user = mapper.selectUserById(1);
            System.out.println(user);
        }
    }

简单增删改查

增删改都需要 在提交之前 手动提交 sqlSession session.commit();

1.查询

1. 查一个

1.1 接口

    User selectUserById(int id);

1.2.mapper.xml

    <select id="selectUserById" resultType="myb.bean.User" >
        select * from users where id=#{id}
    </select>
查一批
  • 两种方法 一个是返回List<User> 一个是返回List<Map>

2.1.接口

    List<User> selectAllUsers();
    @MapKey("id")//mybatis会把这个id作为key 不写也不报错
    List<Map> selectAllUsers2();

2.2.mapper.xml

    <select id="selectAllUsers" resultType="myb.bean.User">
        select * from users
    </select>
    <select id="selectAllUsers2" resultType="Map">
        select * from users
    </select>

2.增加

配置里有个选项parameterType="xxx" 不写也没事 mybatis 自动识别
也不推荐写

2.1 接口

    void insertUser(User user);

2.2 mapper.xml

    <insert id="insertUser" >
<!--    <insert id="insertUser"  parameterType="User" -->
        insert into users values(null,#{username},#{password},#{email})
    </insert>

2.3 提交

userMapper.insertUser(new User().setUsername("张三").setPassword("123456").setEmail("x"));
session.commit();//这里需要手动提交sqlSession

3.修改

3.1 接口

    void updateUser(User user);

3.2 mapper.xml

    <update id="updateUser" >
        update users set username=#{username},password=#{password},email=#{email} where id=#{id}
    </update>

3.3 提交

userMpaaer.updateUser(new User().setId(1).setUsername("张三").setPassword("123456").setEmail("x"));
session.commit();//这里需要手动提交sqlSession

4.删除

4.1 接口

    void deleteUserById(int id);

4.2 mapper.xml

    <delete id="deleteUserById" >
        delete from users where id=#{id}
    </delete>

4.3 提交

userMapper.deleteUserById(1);
session.commit();//这里需要手动提交sqlSession

JavaBean多个构造器时构造器的指定

  • 目标映射的JavaBean有多个构造器可能会报错, 这样配置
<resultMap id="Test" type="User">
    <constructor>
        <idArg column="id" javaType="int"/>
        <arg column="username" javaType="String"/>
        <arg column="password" javaType="String"/>
        <arg column="email" javaType="String"/>
    </constructor>
</resultMap>
<select id="selectAllUsers" resultMap="Test">
        select * from users
</select>

MySQL列名和JavaBean字段名的指定

  1. 如果我们的列名和字段名不一致,我们可以在mapper.xml中指定列名
  2. 手动定义resultMap 然后在select中指定resultMap="id"
<resultMap id="Test" type="User">
<!--        mysql的表列名 bean的属性名-->
    <result column="sid" property="sid"/>
    <result column="sex" property="name"/>
    <result column="name" property="sex"/>
</resultMap>
<select id="selectAllUsers" resultMap="Test">
    select * from users
</select>

mybatis 的事务

我们可以在获取SqlSession关闭自动提交来开启事务模式,和JDBC其实都差不多:

public static void main(String[] args) {
    try (SqlSession sqlSession = MybatisUtil.getSession(false)){
        TestMapper testMapper = sqlSession.getMapper(TestMapper.class);

        testMapper.addStudent(new Student().setSex("男").setName("小王"));

        testMapper.selectStudent().forEach(System.out::println);
    }
}

我们发现,在关闭自动提交后,我们的内容是没有进入到数据库的,现在我们来试一下在最后提交事务:

sqlSession.commit();

在事务提交后,我们的内容才会被写入到数据库中。现在我们来试试看回滚操作:

try (SqlSession sqlSession = MybatisUtil.getSession(false)){
    TestMapper testMapper = sqlSession.getMapper(TestMapper.class);

    testMapper.addStudent(new Student().setSex("男").setName("小王"));

    testMapper.selectStudent().forEach(System.out::println);
    sqlSession.rollback();
    sqlSession.commit();
}

回滚操作也印证成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值