美文网首页
[java]36、MyBatis

[java]36、MyBatis

作者: 史记_d5da | 来源:发表于2022-04-30 23:42 被阅读0次

1、概念-什么是MyBatis

MyBatis 是属于持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 操作细节。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJOPlain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

2、数据库事务(Database Transaction)

1、数据库的事务,简称事务
如果N个数据库的操作放到了同一个事务中,那么这N个操作最终要么全都生效,要么全都不生效
2、事务关键语句
START TRANSACTION:开启事务
ROLLBACK:回滚事务:只要一个操作失败,其他所有操作都回到事务开始时状态
COMMIT:提交事务,如果事务中的所有操作都成功了,提交事务,这些操作才真正生效

START TRANSACTION;
UPDATE skill SET level = level - 500 WHERE id = 1;
UPDATE skill SET level = level + 500 WHERE id = 2;
COMMIT;

3、事务的四大特性(ACID
原子性(Atomicity
事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
一致性(Consistency
事务应确保数据库的状态从一个一致状态转变为另一个一致状态。指数据库中数据应满足完整性约束。
隔离性(Isolation
多个事务并发执行时,一个事务的执行不影响其他事务的执行
持久性(Durability
已被提交的事务对数据库的修改应该永久保存在数据库中

3、JDBC的事务管理

JDBC中,使用connection对象来管理事务

Connection connection = DriverManager.getConnection("", "", "");
// 不要自动提交事务
connection.setAutoCommit(false);
try {
    PreparedStatement statement1 = connection.prepareStatement("UPDATE 1");
    statement1.executeUpdate();
    PreparedStatement statement2 = connection.prepareStatement("UPDATE 2");
    statement2.executeUpdate();
} catch (Exception e) {
    e.printStackTrace();
    connection.rollback();
}
connection.commit();

setAutoCommit(false):开启事务
rollback():回滚事务
commit():提交事务

4、MyBatis的使用

1、在pom.xml中添加依赖

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.5</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.49</version>
    </dependency>
</dependencies>

2、在resources文件夹下创建resources/mappers/skill.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="skill">
<!--    字段映射-->
    <resultMap id="rmSkill" type="com.sj.bean.Skill">
        <result property="id" column="id"></result>
        <result property="createdTime" column="created_time"></result>
        <result property="name" column="name"></result>
        <result property="level" column="level"></result>
    </resultMap>
    <select id="list" resultMap="rmSkill">
        SELECT * FROM skill
    </select>
    <!--传一个参数 # 只是相当于占位符, parameterMap可沈略-->
    <select id="get" resultMap="rmSkill" parameterType="int">
        SELECT * FROM skill WHERE id = ${id}
    </select>
<!--    传多个参数-->
    <select id="list2" resultMap="rmSkill" parameterMap="java.util.Map">
        SELECT * FROM skill WHERE id = #{id} OR level > #{level}
    </select>
</mapper>

1、#{id}是参数的占位符,名字任意
2、${}:直接文本替换,模糊查询'%${key}%'可以正常使用,在替换整条SQL语句中可以使用
3、#{}:预编译传值,可以防止SQL注入,在模糊查询中'%${key}%'`不能正常使用


  • 不传参数
public void select1() throws Exception {
    try(SqlSession session = Mybatises.openSession()) {
        List<Skill>skills = session.selectList("skill.list");
        for (Skill skill: skills) {
            System.out.println(skill);
         }
    }
}
  • 传一个参数
public void select2() throws Exception{
    try(SqlSession session = Mybatises.openSession()) {
        Skill skill = session.selectOne("skill.get", 4);
        System.out.println(skill);
    }
}
  • 传多个参数
public void select3() throws Exception{
    try(SqlSession session = Mybatises.openSession()) {
        Map map = new HashMap();
        map.put("id", 4);
        map.put("level", 50);
        List<Skill> skills = session.selectList("skill.list2", map);
        System.out.println(skills);
        // 或者
        Skill skill = new Skill();
        skill.setId(4);
        skill.setLevel(50);
        List<Skill> skills2 = session.selectList("skill.list2", skill);
        System.out.println(skills2);
    }
}

3、在resources下创建mybatis-config.xml文件,并配置mybatis-config.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!--两个参数是约束xml文件-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--    其他设置-->
    <settings>
        <!--        是否开启驼峰命名自动映射, 例如: A_COLUMN 映射到Java属性名 aColumn-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--        打印日志信息-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--    环境-->
    <environments default="development">
        <!--        开发环境-->
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--            采用连接池的方式管理-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/xr"/>
                <property name="username" value="root"/>
                <property name="password" value="shijikl126"/>
            </dataSource>
        </environment>
    </environments>
    <!--    映射文件-->
    <mappers>
        <mapper resource="mappers/skill.xml"/>
    </mappers>
</configuration>

配置SQL日志打印,可以在mybatis-config.xml文件配置如下

<setting name="logImpl" value="STDOUT_LOGGING"/>

或者,在pom.xml文件中配置

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
    <scope>test</scope>
</dependency>

4、在test文件夹下编辑Test代码

public class SkillTest {
    @Test
    public void select() throws Exception {
        Reader reader =  Resources.getResourceAsReader("mybatis-config.xml");
        // 创建工厂构建器
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        // 创建一个工厂
        SqlSessionFactory factory = builder.build(reader);
        // 创建一个session
        SqlSession session = factory.openSession();
        // 执行sql语句
        List<Skill>skills = session.selectList("skill.list");
        for (Skill skill: skills) {
            System.out.println(skill);
        }
        session.close(); // 关闭session
    }
}

5、多表查询
companyexperience两张表进行查询
编写test测试代码

public void select1() throws Exception {
    try(SqlSession session = Mybatises.openSession()) {
        List<Experience>experiences = session.selectList("experience.list");
        for (Experience experience: experiences) {
            System.out.println(experience);
        }
    }
}

创建resources/experience.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="experience">
<!--    字段映射-->
    <resultMap id="rmExperience" type="com.sj.bean.Experience">
        <result property="company.id" column="t2_id"></result>
        <result property="company.name" column="t2_name"></result>
    </resultMap>

    <select id="list" resultMap="rmExperience">
        SELECT
            t1.*,
            t2.id t2_id,
            t2.name t2_name
        FROM
            experience t1
        JOIN company t2 ON t1.company_id = t2.id
    </select>
</mapper>

或者experience.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="experience">
    <select id="list" resultType="com.sj.bean.Experience">
        SELECT
            t1.*,
            t2.id `company.id`,
            t2.name `company.name`
        FROM
            experience t1
        JOIN company t2 ON t1.company_id = t2.id
    </select>
</mapper>

亦可以映射成为map

<mapper namespace="experience">
    <select id="list" resultType="java.util.LinkedHashMap">
        SELECT
            t1.*,
            t2.id `company.id`,
            t2.name `company.name`
        FROM
            experience t1
        JOIN company t2 ON t1.company_id = t2.id
    </select>
</mapper>

java的测试代码编写

@Test
public void select2() throws Exception {
    try(SqlSession session = Mybatises.openSession()) {
        List<Map<String, Object>>experiences = session.selectList("experience.list");
        for (Map<String, Object> experience: experiences) {
            System.out.println(experience);
        }
    }
}

相关文章

网友评论

      本文标题:[java]36、MyBatis

      本文链接:https://www.haomeiwen.com/subject/gklyyrtx.html