Mybatis入门

前言:之前一直在用SpringJPA和JdbcTemplate,Mybatis用过一段时间但是忘了,今天从最基础的地方从新复习一遍Mybatis,具体讲解不多,主要看代码吧

目录

第一章 原生Java操作数据库

第二章 原生Mybatis操作数据库

2.1 maven配置

2.2 SqlMapConfig.xml

2.3 sql的xml文件

2.4 运行代码

第三章 Mybatis使用接口方式操作数据库

3.1 接口

3.2 sql的xml文件

3.3 SqlMapConfig.xml

3.4 运行代码

第四章 Mybatis结合Spring操作数据库

4.1 maven配置

4.2 数据库配置文件

4.3 Mybatis个性化配置

4.4 Spring配置文件

4.5 sql的xml文件

4.6 运行代码

第五章 Mybatis结合SpringBoot操作数据库

5.1 maven配置

5.2 sql的xml文件

5.3 application.properties

5.4 运行代码

 


第一章 原生Java操作数据库

public class MysqlDemo {
    static final String DB_URL = "jdbc:mysql://localhost:3306/mysql_learn?serverTimezone=GMT%2B8";
    static final String USER = "root";
    static final String PASS = "123456";

    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("opening the database...");
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
            stmt = conn.createStatement();
            String sql;
            sql = "select * from person";
            ResultSet rs = stmt.executeQuery(sql);
            while(rs.next()) {
                // getInt getString 都是指获得参数所指的那一列的数据
                String name = rs.getString("name");
                int age = rs.getInt("age");
                String school = rs.getString("school");
                String home = rs.getString("home");
                System.out.println(age+name+home+school);
            }
            // 使用后关闭
            rs.close();
            stmt.close();
            conn.close();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }


    }

}
<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
</dependency>

 

第二章 原生Mybatis操作数据库

2.1 maven配置

<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.4.5</version>
</dependency>
<dependency>
     <groupId>log4j</groupId>
     <artifactId>log4j</artifactId>
     <version>1.2.12</version>
</dependency>

2.2 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="mysql">
        <!--配置mysql的环境-->
        <environment id="mysql">
            <!--配置事务的类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置连接池-->
            <dataSource type="POOLED">
                <!--配置连接数据库的4个基本信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mysql_learn?serverTimezone=GMT%2B8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
    <mappers>
        <mapper resource="mappers/Person.xml"/>
    </mappers>
</configuration>

2.3 sql的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">

<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="Person">
    <select id="findUserById" parameterType="String" resultType="common.Person">
        select * from person where person_id = #{0}
    </select>
</mapper>

2.4 运行代码

package mybatis;

/**
 * @author ZhangChen
 **/
public class MybatisDemo {
    public static void main(String[] args) {
        new MybatisDemo().start();
    }

    public void start(){
        try {
            testSearchById();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void testSearchById() throws IOException {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession session = sqlSessionFactory.openSession();
        //4.执行Sql语句
        Person person = session.selectOne("Person.findUserById", "1");

        //5. 打印结果
        System.out.println(person.getName());
        //6.释放资源
        session.close();
        in.close();
    }
}

 

 

第三章 Mybatis使用接口方式操作数据库

上面我们自己创建session,然后选择sql语句,传入参数查找,这样的话比较麻烦,我们观察到,如果我们能将接口与sql语句映射起来,那我们就能通过动态代理的方式根据接口创建类,在方法获取session,然后传入session与接口对应的sql语句,和我们传入的参数,就可以比较方便的使用Mybatis查询数据。

总的来说,就是:

同时,考虑到mapper多了之后,如果一个个都指定位置写在mappers中将会比较麻烦,可以定义一个包直接进行扫描。

特点值得注意的是:如果使用包指定配置的话,xxx.xml的名字必须和接口的名字一样,同时指定的包的路径必须和接口的路径一样(要让xml文件和dao层接口类在编译后生成在同一个文件夹)

这里留两个问题后面解决:为什么名字要一样,为什么xml文件编译后要和接口在同一个文件夹,感觉应该是源码设计的问题。

<mappers>
        <mapper resource="mappers/Person.xml"/>
    </mappers>

变成 

<mappers>
        <package name="mappers"></package>
    </mappers>

 

3.1 接口

public interface PersonDao {
    Person getPerson(String personId);
}

3.2 sql的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">

<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="mybatisinterface.PersonDao">
    <select id="getPerson" parameterType="String" resultType="common.Person">
        select * from person where person_id = #{0}
    </select>
</mapper>

3.3 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="mysql">
        <!--配置mysql的环境-->
        <environment id="mysql">
            <!--配置事务的类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置连接池-->
            <dataSource type="POOLED">
                <!--配置连接数据库的4个基本信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mysql_learn?serverTimezone=GMT%2B8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
    <mappers>
        <package name="mybatisinterface"/>
    </mappers>
</configuration>

3.4 运行代码

public class MybatisInterfaceDemo {
    public static void main(String[] args) {
        new MybatisInterfaceDemo().start();
    }

    public void start(){
        try {
            testSearchById();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void testSearchById() throws IOException {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession session = sqlSessionFactory.openSession();
        //4.执行Sql语句
        PersonDao personDao = session.getMapper(PersonDao.class);
        Person person = personDao.getPerson("1");
        //5. 打印结果
        System.out.println(person.getName());
        //6.释放资源
        session.close();
        in.close();
    }
}

 

第四章 Mybatis结合Spring操作数据库

4.1 maven配置

<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.4.5</version>
</dependency>
<dependency>
     <groupId>log4j</groupId>
     <artifactId>log4j</artifactId>
     <version>1.2.12</version>
</dependency>
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.2</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>

4.2 数据库配置文件

db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mysql_learn?serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=123456

4.3 Mybatis个性化配置

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">
<configuration>
	<!-- 配置全局属性 -->
	<settings>
		<!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 -->
		<setting name="useGeneratedKeys" value="true" />

		<!-- 使用列别名替换列名 默认:true -->
		<setting name="useColumnLabel" value="true" />

		<!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} -->
		<setting name="mapUnderscoreToCamelCase" value="true" />
	</settings>
</configuration>

4.4 Spring配置文件

spring-dao.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xmlns:cache="http://www.springframework.org/schema/cache"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">

	<context:annotation-config/>
	<context:property-placeholder location="classpath:*.properties" />

	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
		<!-- 配置连接池属性 -->
		<property name="driverClassName" value="${jdbc.driver}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>

	<!-- 4.配置SqlSessionFactory对象 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 注入数据库连接池 -->
		<property name="dataSource" ref="dataSource" />
		<!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
		<property name="configLocation" value="classpath:mybatis-config.xml" />
		<!-- 扫描sql配置文件:mapper需要的xml文件 -->
		<property name="mapperLocations" value="classpath:mybatisspring/*.xml" />
	</bean>

	<!-- 5.配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 注入sqlSessionFactory -->
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
		<!-- 给出需要扫描Dao接口包 -->
		<property name="basePackage" value="mybatisspring.dao" />
	</bean>

	<context:component-scan base-package="mybatisspring.service" />

</beans>

4.5 sql的xml文件

<mapper namespace="mybatisspring.dao.PersonDao">
    <select id="getPerson" parameterType="String" resultType="common.Person">
        select * from person where person_id = #{0}
    </select>
</mapper>

4.6 运行代码

public interface PersonDao {
    Person getPerson(String personId);
}
@Service
public class PersonService {
    @Autowired
    PersonDao personDao;
    public Person getPerson(String personId){
        return  personDao.getPerson(personId);
    }
}
public class MybatisSpring {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/spring-dao.xml");
        PersonService personService = applicationContext.getBean(PersonService.class);
        Person person = personService.getPerson("1");
        System.out.println(person.getName());
    }
}

 

第五章 Mybatis结合SpringBoot操作数据库

5.1 maven配置

插件就是SpringBoot的默认插件

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

5.2 sql的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">

<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="com.aesjourey.mybatisspringboot.dao.PersonMapper">
    <select id="getPersonById" parameterType="String" resultType="com.aesjourey.mybatisspringboot.entity.Person">
        select * from person where person_id = #{0}
    </select>
</mapper>

5.3 application.properties

server.port=8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mysql_learn?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

mybatis.mapperLocations=classpath:mappers/*.xml

5.4 运行代码

启动类:

@SpringBootApplication
@MapperScan("com.aesjourey.mybatisspringboot.dao")
public class MybatisspringbootApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisspringbootApplication.class, args);
    }
}

实体类:

@Getter
@Setter
public class Person {
    String person_id;
    String name;
    int age;
    String school;
    String home;
}

controller:

@RestController
public class getPerson {
    @Autowired
    PersonService personService;
    @RequestMapping("/getPersonByPersonId")
    public Person getPersonByPersonId(String personId){
        Person person = personService.getPersonById(personId);
        return person;
    }
}

service:

@Service
public class PersonService {
    @Autowired
    PersonMapper personMapper;
    public Person getPersonById(String peopleId){
        Person person = personMapper.getPersonById(peopleId);
        return person;
    }
}

dao:

public interface PersonMapper {
    Person getPersonById(String personId);
}

 

 

 

 

 

 

 

### MyBatis入门教程 #### 1. MyBatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。消除了几乎所有的 JDBC 代码和参数的手动设置以及结果集的检索。MyBatis 可以通过简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects) 映射成数据库中的记录[^1]。 #### 2. 日志输出配置 为了方便调试SQL语句,在`mybatis-config.xml`文件中可以加入如下配置: ```xml <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> ``` 这会使得执行的所有SQL语句都会被打印到控制台,便于开发人员查看和排查问题。 #### 3. 参数传递方式对比 在MyBatis中提供了两种不同的占位符用于构建动态SQL:`#{}` 和 `${}` 。其中 `#{}` 表达式的值会被视为预编译语句的一个参数,并由JDBC驱动自动处理转义字符;而`${}` 则直接替换为变量的实际内容,存在SQL注入风险,因此建议优先使用`#{}` 来防止潜在的安全隐患。 #### 4. 实体类定义 对于每一个要操作的数据表来说都需要创建对应的Java Bean对象即实体类。这里展示了一个基于 Lombok 注解简化后的User实体类例子: ```java import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("user") public class User { @TableId(value = "id", type = IdType.AUTO) private Long id; private String name; private Integer age; private String email; } ``` 此段代码利用了Lombok库提供的`@Data`自动生成getter/setter方法,减少了样板代码的数量并提高了可读性和维护效率[^2]。 #### 5. Mapper 接口编写 Mapper接口是用来声明针对特定数据表的操作行为的地方。通常情况下只需要按照一定命名规则定义好相应的方法签名即可完成CRUD功能实现。例如下面是一个典型的UserMapper接口片段: ```java package com.example.mapper; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface UserMapper { int insert(User user); List<User> selectAll(); void updateById(Long id, User updatedUser); boolean deleteById(Long id); } ``` 上述示例展示了如何简单地定义一些基础性的增删改查函数原型,实际业务逻辑则交给了XML映射文件或者内联注解去具体描述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值