不想学习的小狐狸

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

mybatis中文文档

https://mybatis.org/mybatis-3/zh/getting-started.html

第一个mybatis程序

搭建环境

1、搭建数据库

2、新建项目

1、新建一个普通的maven项目

2、删除src目录

3、导入maven依赖

进入项目先到setting里查看maven的配置对否

<!--导入依赖-->
    <dependencies>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
       <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

创建一个模块

编写mybatis的核心配置文件

<?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核心配置文件-->
<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://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>

编写mybatis工具类

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static{
        try {
            //使用mybatis获取sqlsessionfactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
             sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
   // 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
    // 你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句
     public static SqlSession getSqlSession(){
         return sqlSessionFactory.openSession();
     }
}

编写代码

实体类

//实体类
public class User {
    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
     @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

Dao接口

public interface UserDao {
    List<User> getUserList();
}

接口实现类

<?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绑定一个对应的dao/mapper接口-->
<mapper namespace="com.cheng.dao.UserDao">
    <select id="getUserList" resultType="com.cheng.pojo.User">
        select * from mybatis.user;
    </select>
</mapper>

测试

public class UserDaoTest {
    @Test
    public void test(){
        //获得sqlsession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //方式一:getMapper
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> userList = mapper.getUserList();
        for(User user:userList){
            System.out.println(user);
        }
        //关闭sqlsession
        sqlSession.close();
    }
}

CRUD(增删改要commit事务)

namespace

namespace中的包名要和Dao/mapper接口的包名一致

select

选择,查询语句

id:就是对应的namespace中的方法名

resultType:sql语句执行的返回值

parameterType:参数类型

1、编写接口

 //查询全部用户
    List<User> getUserList();
    //根据ID查询用户
    User getUserById(int id);

2、编写对应的mapper中的sql语句

 <select id="getUserList" resultType="com.cheng.pojo.User">
        select * from mybatis.user;
    </select>
    <select id="getUserById" parameterType="int" resultType="com.cheng.pojo.User">
        select * from mybatis.user where id=#{id}
    </select>

3、测试

 @Test
    public void test(){
        //获得sqlsession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //方式一:getMapper
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserList();
        for(User user:userList){
            System.out.println(user);
        }
        //关闭sqlsession
        sqlSession.close();
    }
    @Test
    public void getUserById(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById(1);
        System.out.println(user);
        sqlSession.close();
    }

Insert

//插入一个用户
    int addUser(User user);
<insert id="addUser" parameterType="com.cheng.pojo.User" >
        insert into mybatis.user(id, name, pwd) values (#{id},#{name},#{pwd})
    </insert>
 @Test
    public void addUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int res=mapper.addUser(new User(4,"哈哈哈","456"));
        if(res>0){
            System.out.println("插入成功");
        }
        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }

update

//修改用户
    int updateUser(User user);
<update id="updateUser" parameterType="com.cheng.pojo.User">
        update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id}
    </update>
 @Test
    public void updateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.updateUser(new User(4,"呵呵","4545"));
        sqlSession.commit();
        sqlSession.close();
    }

delete

 //删除用户
    int deleteUser(int id);

<delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id=#{id}
    </delete>

@Test
    public void deleteUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    mapper.deleteUser(4);
    sqlSession.commit();
    sqlSession.close();
}

map和模糊查询

假设,实体类或者数据库中的表,字段或者参数过多,我们应当考虑使用Map

 //万能的Map
    int addUser2(Map<String,Object> map);
 <insert id="addUser2" parameterType="map">
        insert into mybatis.user (id,pwd) values (#{userid},#{password})
    </insert>
@Test
    public void addUser2(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    Map<String,Object> map=new HashMap<String, Object>();
    map.put("userid",5);
    map.put("password","45245");
    mapper.addUser2(map);
    sqlSession.close();
}

Map传递参数,直接在sql中取出key即可

对象传递参数,直接在sql中取对象的属性即可

只有一个基本类型参数的情况下,可以直接在sql中取到

 


模糊查询


java代码执行的时候,传递通配符% %

List<User> userList = mapper.getUserLike("%李%");

 

在sql拼接中使用通配符

select * from mybatis.user where name like "%"#{value}"%"

 


配置解析


核心配置文件

 


mybatis-config.xml


MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:


  • configuration(配置)

    • properties(属性)
    • settings(设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)
      • environment(环境变量)

        • transactionManager(事务管理器)

        • dataSource(数据源)

    • databaseIdProvider(数据库厂商标识)
    • mappers(映射器)

环境配置(environments)

MyBatis 可以配置成适应多种环境

不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

MyBatis默认的事务管理器是JDBC,连接池:POOLED

属性(properties)

我们可以通过properties属性来实现引用配置文件

编写一个配置文件

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"
username=root
password=123456

在核心配置文件中引入

<!--引入外部配置文件-->
    <properties resource="db.properties">
        <property name="username" value="root"/>
        <property name="pwd" value="1111"/>
    </properties>

 


可以直接引入外部文件


可以在其中增加一些属性配置


如果两个文件有同一个字段,优先使用外部配置文件

 


类型别名(typeAliases)


类型别名可为 Java 类型设置一个缩写名字。


意在降低冗余的全限定类名书写

<!--可以给实体类起别名-->
 <typeAliases>
     <typeAlias type="com.cheng.pojo.User" alias="User"/>
 </typeAliases>

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean

扫描实体类的包,它的默认别名为这个类的类名(首字母小写)

 


<typeAliases>
     <package name="com.cheng.pojo"/>
 </typeAliases>

在实体类比较少的时候,使用第一种方式

如果实体类十分多,建议使用第二种

第一种可以自定义,第二种则不行,如果非要改,需要在实体上增加注解

 


@Alias("user")
public class User {

映射器(mappers)

方式一

 <mappers>
        <mapper resource="com/cheng/dao/UserMapper.xml"/>
    </mappers>

方式二:使用class文件绑定注册

 <mapper class="com.cheng.dao.UserMapper"/>

 


注意点:


  • 接口和他的mapper配置文件必须同名

  • 接口和他额mapper配置文件必须在同一个包下

 


ResultMap结果集映射

 <!--结果集映射-->
    <resultMap id="UserMap" type="User">
        <!--column数据库中的字段,property实体类中的属性-->
        <result column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="pwd" property="password"/>
    </resultMap>
    <select id="getUserById" resultMap="UserMap">
        select * from mybatis.user where id=#{id}
    </select>

 


日志工厂


在mybatis的核心配置文件中配置日志

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

 


分页

//分页
    List<User> getUserByLimit(Map<String,Object> map);
 <select id="getUserByLimit" parameterType="map" resultType="com.cheng.pojo.User">
        select * from mybatis.user limit #{startIndex},#{pageSize}
    </select>
@Test
    public void getUserByLimit(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap<String, Object> map = new HashMap<String, Object>();
       map.put("startIndex",0);
       map.put("pageSize",2);
        List<User> userList = mapper.getUserByLimit(map);
        for(User user :userList){
            System.out.println(user);
        }
        sqlSession.close();
    }

 

 

 


动态SQL


动态SQL就是指根据不同的条件生成不同的SQL语句








posted on 2021-06-17 17:23  一只小狐狸kis  阅读(44)  评论(0编辑  收藏  举报