【MyBatis通俗易懂20190928狂神说】01 第一个mybatis程序,jdbc宝藏代码,配置,编写pojo,mapper,xml

1. 初识MyBatis

环境

  • jdk1.8

  • mysql 5.7 ,(mysql8.0 也不错)

  • maven 3.6.1,我的是 3.5.3

  • mybatis 教程用:3.5.2 当时最新

文档说明

  • 最新
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.10</version> //2022年5月24日
</dependency>
  • 网址
Home pagehttp://www.mybatis.org/mybatis-3 /zh/index.html
Source codehttp://github.com/mybatis/mybatis-3

简介

MyBatis本是apache的一个开源项目iBatis,

2010年这个项目由apache software foundation迁移到了[google code](https://baike.baidu.com/item/google code/2346604),并且改名为MyBatis。

2013年11月迁移到Github

MyBatis 是一款优秀的持久层框架,

  • 它支持自定义 SQL

  • 存储过程以及高级映射。

MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

MyBatis 可以通过

  • 简单的 XML 或注解来配置和映射原始类型、接口和

  • Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

特点

  • 简单易学:
  • 灵活:
  • sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的orm字段关系映射。
  • 提供对象关系映射标签,支持对象关系组建维护。
  • 提供xml标签,支持编写动态sql。

2. 第一个mybatis程序

didispace 的程序

1. 数据库

CREATE TABLE `USER` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(55) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

2. pom文件

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/>
    </parent>
    <properties>
        <java.version>1.8</java.version>
    </properties>

	<dependencies>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId> //默认为8.0.15
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

3. 实体类

@Data
@NoArgsConstructor
public class User {

    private Long id;
    private String name;
    private Integer age;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

4. Mapper 和 xml

  • src.main.java.xx.mapper下:
public interface UserMapper {
    User findByName(@Param("name") String name);
    int insert(@Param("name") String name, @Param("age") Integer age);
}
  • resources.mapper下
<?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="com.xx.mapper.UserMapper">
    <select id="findByName" resultType="com.xx.entity.User">
        SELECT * FROM USER WHERE NAME = #{name}
    </select>

    <insert id="insert">
        INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})
    </insert>
</mapper>

5. 配置

@MapperScan("com.xx.mapper") //扫描 mapper接口
@SpringBootApplication
  • 配置数据库 和 xml扫描
spring.datasource.url=jdbc:mysql://192.168.2.219:3306/springbootdb
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

mybatis.mapper-locations=classpath:mapper/*.xml

6. 测试

@RunWith(SpringRunner.class)
@SpringBootTest
//@Transactional
public class Chapter36ApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
	//@Rollback
    public void test() throws Exception {
        userMapper.insert("BBB", 20);
        User u = userMapper.findByName("AAA");
        Assert.assertEquals(20, u.getAge().intValue());
    }

}

我的测试

        <version>2.7.2</version> boot

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
里面的mybatis为:3.5.9
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
    </dependency>

    <mysql.version>8.0.29</mysql.version>
spring.datasource.url=jdbc:mysql://192.168.2.219:3306/springbootdb?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8

mysql 5.7.25-log,用最新的boot,也要配置时区 
  • Mapper 接口上,加不加注解都行。@Mapper
@SpringBootTest
class TempMybatisApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    void contextLoads() {
        userMapper.insert("ccc", 20);
        User u = userMapper.findByName("ccc");
        System.out.printf(u.getName());
    }

}

狂神的

innoDB 和 myisam

ISAM

  • 它不支持事务处理,也不能够容错
  • MyIASM是IASM表的新版本
    • NULL列索引。
  • MyISAM
    优点:速度快,磁盘空间占用少;某个库或表的磁盘占用情况既可以通过操作系统查相应的文件(夹)的大小得知,也可以通过SQL语句SHOW TABLE STATUS查得
    缺点:没有数据完整性机制,即不支持事务和外键

InnoDB

  • 提供了事务控制能力功能
    优点:支持事务和外键,数据完整性机制比较完备;可以用SHOW TABLE STATUS查得某个库或表的磁盘占用
    缺点:速度超慢,磁盘空间占用多;所有库都存于一个(通常情况)或数个文件中,无法通过操作系统了解某个库或表的占用空间

  • Mysql已经计划移除对BDB的支持,转而全力发展InnoDB。

0. 创建sql

CREATE DATABASE `mybatis`;

USE `mybatis`;

CREATE TABLE `user`(
`id` INT(20) NOT NULL PRIMARY KEY,
`NAME` VARCHAR(30) DEFAULT NULL,
`pwd` VARCHAR(30) DEFAULT NULL
) ENGINE = INNODB DEFAULT CHARSET= utf8;

INSERT INTO `user` ( `id`, `name`, `pwd` )
VALUES
	( 1, '狂神', '1234231' ),
	( 2, '张三', '1234231' ),
	( 3, '李四', '123456')

1. 导入依赖

创建父类
	<!-- 父工程 -->
    <groupId>org.kuang</groupId>
    <artifactId>MyBatis-Study</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>mybatis-01</module>
    </modules>

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
    </dependencies>
创建一个模块
    <parent>
        <artifactId>MyBatis-Study</artifactId>
        <groupId>org.kuang</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>mybatis-01</artifactId>

	我的idea都加了,这些。原教程未加
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

2. 配置mybatis

  • resouce 下 创建:mybatis-config.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"> //这个dtd可能报错,没事
<configuration>
    <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://192.168.2.218:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/> //ssl我的配置true报错
                <property name="username" value="root"/>
                <property name="password" value="xxx"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/kuang/dao/UserMapper.xml"/>
    </mappers>
</configuration>
		&amp; 就是&,在xml转义了

		useSSL=true 安全连接,我的数据库,配置为true报错。
        autoReconnect=true &amp;
        
        useUnicode=true &amp; 使用Unicode编码
        characterEncoding=UTF-8 &amp; 设置编码为UTF8
        
        tinyInt1isBit=false //极小的int1 is bit
        
        serverTimezone=GMT%2B8 //mysql8记得配置时区 
        
        2连接,2字符,1极小,1时区
tiny       
adj.
极小的,微小的

3. 编写SqlSessionFactory工具类

  • 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
    • SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
    • 你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
  • 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。
    • SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。
public class MyBatisUtils {

    public static SqlSessionFactory sqlSessionFactory;

    //静态加载
    static {
        //资源
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            //从资源,获取 输入流
            inputStream = Resources.getResourceAsStream(resource);
            //构建 工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSeqSession() {
        //获取 session
        return sqlSessionFactory.openSession();
    }
}

4. 编写pojo mapper 和 xml

  • pojo包
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private int id;
    private String name;
    private String pwd;
}
  • dao包
public interface UserDao {
    List<User> getUserList();
}
  • dao包,建立 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="com.kuang.dao.UserDao">
    <select id="getUserList" resultType="com.kuang.pojo.User">
        select * from mybatis.user
    </select>
</mapper>

5. 编写测试类

    @Test
    public void testList() {
        SqlSession seqSession = MyBatisUtils.getSeqSession();

        UserDao mapper = seqSession.getMapper(UserDao.class);

        List<User> userList = mapper.getUserList();

        //就是src/main/java下的 第一个包开始:一般为 com.xxx
        //对应为:target/classes下的,我这边 为dao.xxx,所以我这样写
        //List<User> userList= seqSession.selectList("dao.UserDao.getUserList"); 方式2
        
        for (User u : userList) {
            System.out.println(u.getName());
        }

        seqSession.close();
    }

//最后请把 UserDao 改为 UserMapper 接口

6. maven编译问题

  • 错误1:绑定异常,UserDao 是 未知的 对于,mapper仓库。未配置扫描的mapper

  • 错误2:UserMapper.xml不存在。maven找不到文件,因为target目录下没有

    • 我们写的配置文件,无法被导出。
    • 在build中 配置 resources,来防止 我们资源导出失败的问题
      • 就是:我们的xml放入到了 Java目录下,默认导出不来。
      • 子项目,都放入如下配置,更保险。只配置父类,也行。
    <build>
        <!--这样也可以把所有的xml文件,打包到相应位置。-->
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering> 本教程里面配置的是true,百度上有人配置false。都行。
            </resource>
        </resources>
    </build>

3. 重要的对象

  • SqlSessionFactoryBuilder
    • 一旦创建了 SqlSessionFactory,就不再需要它了
  • SqlSessionFactory
    • SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在
    • 使用单例模式或者静态单例模式。
  • SqlSession
    • qlSession 的实例不是线程安全的,因此是不能被共享的
    • 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,
try (SqlSession session = sqlSessionFactory.openSession()) {
  // 你的应用逻辑代码
}

4. 宝藏代码,JDBC

		Connection c = null;
        try {
			//加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //连接数据库
            String url = "jdbc:mysql://192.168.2.219:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8";
            c = DriverManager.getConnection(url, "root", "密码");
            //通知数据库 开启事务,false为开启
            c.setAutoCommit(false);

            String sql = "update user set name='更新了' where id='3'";
            
            c.prepareStatement(sql).executeUpdate();

            //制造错误

            // 提交
            c.commit();
            System.out.println("success");

        } catch (Exception e) {
            try {
                //异常了先回滚
                c.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            try {
                //最终 一定关闭 连接
                c.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值