MyBatis入门指南

MyBatis是支持定制SQL,存储过程以及高级映射优秀的持久层框架。

MyBatis入门指南_第1张图片


查询user表中所有数据

  1. 创建user表,添加数据
  2. 导入依赖,创建模块
  3. 编写MyBatis核心配置文件
  4. 编写SQL映射文件
  5. 编写代码
    1. 定义P0J0
    2. 加载核心配置文件,获取SqlSessionFactory对象
    3. 获取SqlSession对象,执行SQL语句
    4. 释放资源

一、创建user

use mybatis;  
drop table if exists tb_user;  
  
create table tb_user(  
    id int primary key auto_increment,  
    username varchar(20),  
    password varchar(20),  
    gender char(1),  
    addr varchar(30)  
);  

insert into tb_user values (1, '张三', '123', '男', '北京');  
insert into tb_user values (2, '李四', '234', '女', '天津');  
insert into tb_user values (3, '王五', '11', '男', '西安');

创建实体类

public class User {
	private Integer id;
	private String name;
	private String password;
	private char sex;
	private String addr;
}

二、导入依赖


<dependency>
    <groupId>org.mybatisgroupId>
    <artifactId>mybatisartifactId>
    <version>3.5.16version>
dependency>

三、编写MyBatis配置


  
DOCTYPE configuration  
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
        "http://mybatis.org/dtd/mybatis-3-config.dtd">  
<configuration>  
<environments default="development">  
    <environment id="development">  
        <transactionManager type="JDBC"/>  
        <dataSource type="POOLED">  
              
            <property name="driver" value="org.mariadb.jdbc.Driver"/>  
            <property name="url" value="jdbc:mariadb://localhost:3306/mybatis"/>  
            <property name="username" value="root"/>  
            <property name="password" value="20040927"/>  
        dataSource>        
    environment>
environments>  
<mappers>  
      
    <mapper resource="UserMapper.xml"/>  
mappers>  
configuration>

四、编写SQL映射文件


  
DOCTYPE mapper  
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  
<mapper namespace="test">  
    <select id="selectAll" resultType="cn.cangli.todo.pojo.User">  
        select * from tb_user;  
    select>  
mapper>

五、编写代码

public class TestUser {  
    @Test  
    public void testUser() throws IOException {  
        //1.加载mybatis的核心配置文件,获取SqlSessionFactory  
        String resource = "mybatis-config.xml";  
        InputStream inputStream = Resources.getResourceAsStream(resource);  
        SqlSessionFactory sqlSessionFactory =  
                new SqlSessionFactoryBuilder().build(inputStream);  
  
        //2.获取SqlSession对象,用他来执行Sql  
        SqlSession sqlSession = sqlSessionFactory.openSession();  
  
        //3.执行Sql  
        List<User> users = sqlSession.selectList("test.selectAll");  
  
        System.out.println(users);  
  
        //4.释放资源  
        sqlSession.close();  
        inputStream.close();  
    }  
}

MyBatis入门指南_第2张图片

  1. SqlSessionFactoryBuilder用于构建SqlSessionFactory对象,每个基于MyBatis的应用都是以SqlSessionFactory为核心的。
  2. 有了SqlSessionFactory,我们就可以从中获得SqlSession实例,每一个SqlSession都代表一个会话,每个会话相互隔离,互不影响。
  3. SqlSession使用完毕要释放资源,使用try(SqlSession session = factory.openSession(true)){}
  4. SqlSessionFactory用完就扔,但是SqlSessionFactory可以留着

Mybatis面向接口编程

添加与Mapper接口的映射


  
DOCTYPE mapper  
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
   
<mapper namespace="cn.clang.mybatis.mapper.UserMapper">  
	<insert id="insertUser">
		insert into t_user values(10,'小李','123456','男','上海')
	insert>
mapper>

创建Mapper接口

public interface UserMapper {
	/**
	 * MyBatis面向接口编程
	 * 1、映射文件的namespace和mapper接口的全类名保持一致
	 * 2、映射文件中SQL语句中的id要和mapper接口中的方法名保持一致
	 */
	 int inserUser();
}

引入配置文件

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

代码实现

public class MyBatisTest {
	@Test
	public void test

}

传入参数

类似于JDBC中的PreparedStatement,预编译和防止SQL注入

resultTypes属性

传入一个参数,为了防止SQL注入,我们使用#而不是$

  
<mapper namespace="test">  
    <select id="selectUserById" resultType="cn.cangli.todo.pojo.User" parameterType="_int">  
        select * from tb_user where id = #{id};   
    select>  
mapper>

不过,MyBatis会做类型推断,因此这里parameterType可以省略

  
<mapper namespace="test">  
    <select id="selectUserById" resultType="cn.cangli.todo.pojo.User">  
        select * from tb_user where id = #{id};   
    select>  
mapper>

代码

User user=session.selectOne("selectUserById", 3);

传入两个参数

<select id="selectUserByIdAndAge" resultType="User">
	select * from user where id = #{id} and age = # {age}
select>

代码

User user = session.selectOne("selectUserByIdAndAge",
		Map.of("id",1,"age",18));

或者

User user = session.selectOne("selectUserByIdAndAge",new Param(1,18));

class Param {
	int id;
	int age;
}

resultMaps属性

假设实体类

class Param {
	int id;
	String userName;
	int age;
}

而数据库中的属性是id、name、age

可能返回结果
User(id=1, username=null, age=18)

为解决这个问题,xml改写

<select id="selectUserByIdAndAge" resultMap="test">
	select * from user where id = #{id} and age = # {age}
select>

<resultMap id="test" type="User">
	<result column="id" property="id">
	<result column="name" property="username">
	<result column="age" property="age">
resultMap>

官方提供了自动映射功能,数据库中的蛇形命名会自动转换为驼峰形式,我们只需要在顶部开启设置

<settings>
	<setting name="nameUnderscoreToCamelCase" value="ture"/>
settings>
<select id="selectUsersByAge" resultType="User">
	select * from user where age >= #{age}
select>

selectMap方法

Map map selectMap("selectAllUser", "id")表示以id作为key,查询到的结果作为Map

基于注解实现MyBatis

@Mapper //标记Mapper接口
@Select("执行查询语句,返回结果")
@Insert("执行插入语句")
@Update("执行更新语句")
@Delete("执行删除语句")

MyBatis

  1. 添加依赖: mybatismariadb驱动
  2. 配置数据库
     spring:
    	 datasource:
    		 url: jdbc:mariadb://localhost:3306/mybatis
    		 username: root
    		 password: root
    		 driver-class-name: org.mariadb.jdbc.Driver
    
  3. Mapper
	@Mapper
	public interface UserInfoMapper {
		@Select("select * from userinfo") //接口方法的实现
		List<UserInfo> getUserInfoAll();
	}

selectCursor方法

Cursor<User> cursor = session.selectCursor("selectAllUser");
for(User user : cursor) {
	System.out.println(user);
	cursor.isOpen(); //是否已经开始遍历
	cursor.getCurrentIndex();//获取遍历到第几个(下标)
}
cursor.isConsumed(); //是否遍历完了

select方法

session.select("selectAllUser", context -> {
	System.out.println(context.getResultCount());
	System.out.println(context.getREsultObject());
	context.stop();
})
>由于这段代码的重复性很高,我们可以单独创建一个工具类
```java
 //1.加载mybatis的核心配置文件,获取SqlSessionFactory  
        String resource = "mybatis-config.xml";  
        InputStream inputStream = Resources.getResourceAsStream(resource);  
        SqlSessionFactory sqlSessionFactory =  
                new SqlSessionFactoryBuilder().build(inputStream);  
  
        //2.获取SqlSession对象,用他来执行Sql  
        SqlSession sqlSession = sqlSessionFactory.openSession();  
  

工具类

public class MyBatisUtils {
	private static SqlSessionFactory factory;
	static {
		try {
			factory = new SqlSessionFactoryBuilder.build(new FileInputStream("mybatis-config.xml"));
		} catch(FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	//自动提交
	public SqlSession openSession(boolean autoCommit) {
		return factory.openSession(autoCommit);
	}
}

简化后的代码

```java
public class TestUser {  
    @Test  
    public void testUser() throws IOException {  
        SqlSession sqlSession = MyBatisUtils.openSession(true);
        
        //3.执行Sql  
        List<User> users = sqlSession.selectList("test.selectAll");  
        System.out.println(users);  
    }  
}

mybatis-config.xml配置详解

  
DOCTYPE configuration  
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
        "http://mybatis.org/dtd/mybatis-3-config.dtd">  
<configuration>  
<environments default="development">  
    <environment id="development">  
          
        
        <transactionManager type="JDBC"/>  
        
        <dataSource type="POOLED">  
              
            <property name="driver" value="org.mariadb.jdbc.Driver"/>  
            <property name="url" value="jdbc:mariadb://localhost:3306/mybatis"/>  
            <property name="username" value="root"/>  
            <property name="password" value="20040927"/>  
        dataSource>   
    environment>
    <environment id="test">  
          
        <transactionManager type="JDBC"/>  
        <dataSource type="POOLED">  
              
            <property name="driver" value="org.mariadb.jdbc.Driver"/>  
            <property name="url" value="jdbc:mariadb://localhost:3306/mybatis"/>  
            <property name="username" value="root"/>  
            <property name="password" value="20040927"/>  
        dataSource>   
    environment>
environments>  
<mappers>  
      
    <mapper resource="UserMapper.xml"/>  
mappers>  
configuration>

你可能感兴趣的:(mybatis,java,tomcat)