【Mybatis】Mybatis基础(上)

末蓝、 2023-10-02 15:07 49阅读 0赞

目录

1、简介

1.1、什么是Mybatis

1.2、为什么需要mybatis

2、第一个mybatis程序

2.1、搭建数据库

2.2、新建项目

2.3、创建一个子模块

2.4、编写代码

2.5、测试

3、CRUD(增查改删)

3.1、namepace

3.2、select

3.3、insert

3.4、update

3.5、delete

3.6、注意事项!

4、使用map(增查改删)

4.1、insert

4.2、select

4.3、update

4.4、delete

5、模糊查询

6、配置解析

6.1、核心配置文件

6.2、环境配置(environments)

6.3、属性(properties)

6.4、类型别名(typeAliases)

6.5、设置(Settings)

6.6、其他配置

6.7、映射器(mappers)


1、简介

1.1、什么是Mybatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

简而言之就是更加方便地使用数据库。

建议边看官方配置文件边学习:mybatis – MyBatis 3 | 简介

1.2、为什么需要mybatis

MyBatis则简化了传统JDBC方法,解决了:①频繁链接和释放数据库的浪费、②SQL语句与代码的高耦合、③参数传递麻烦、④结果解析麻烦。

2、第一个mybatis程序

思路:搭建环境—->导入Mybatis—>编写代码—>测试

项目结构图:

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA56eD5aS055qE5omT5bel5LuU_size_9_color_FFFFFF_t_70_g_se_x_16

2.1、搭建数据库

  1. CREATE TABLE `user` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `pwd` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

b82b756670c945cda5ebc94b7fc8cf31.png

2.2、新建项目

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

2.删除src目录(父工程)

3.导入依赖

  1. <!--导入依赖-->
  2. <dependencies>
  3. <!--mysql驱动-->
  4. <dependency>
  5. <groupId>mysql</groupId>
  6. <artifactId>mysql-connector-java</artifactId>
  7. <version>5.1.47</version>
  8. </dependency>
  9. <!--mybatis-->
  10. <dependency>
  11. <groupId>org.mybatis</groupId>
  12. <artifactId>mybatis</artifactId>
  13. <version>3.5.2</version>
  14. </dependency>
  15. <!--Junit-->
  16. <dependency>
  17. <groupId>junit</groupId>
  18. <artifactId>junit</artifactId>
  19. <version>4.12</version>
  20. </dependency>
  21. </dependencies>

2.3、创建一个子模块

  • 编写mybatis的核心配置文件

    <?xml version=”1.0” encoding=”UTF-8” ?>
    <!DOCTYPE configuration

    1. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    2. "http://mybatis.org/dtd/mybatis-3-config.dtd">






    //localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>








  • 编写mybatis工具类

    //SqlSessionFactory —> SqlSession
    public class MybatisUtils {

    1. private static SqlSessionFactory sqlSessionFactory;
    2. static{
    3. try {
    4. //使用mybatis第一步:获取sqlSessionFactory对象
    5. String resource = "mybatis-config.xml";
    6. InputStream inputStream;
    7. inputStream = Resources.getResourceAsStream(resource);
    8. sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    9. } catch (IOException e) {
    10. e.printStackTrace();
    11. }
    12. }

    1. //有了sqlSessionFactory就可以获取sqlSession的实例
    2. //sqlSession完全包含了面向数据库执行SQL命令所需的方法
    3. public static SqlSession getsqlSession(){
    4. return sqlSessionFactory.openSession();
    5. }

    }

2.4、编写代码

  • 实体类

    public class User {

    1. private int id;
    2. private String name;
    3. private String pwd;

    1. public User() {
    2. }
    3. public User(int id, String name, String pwd) {
    4. this.id = id;
    5. this.name = name;
    6. this.pwd = pwd;
    7. }
    8. public int getId() {
    9. return id;
    10. }
    11. public void setId(int id) {
    12. this.id = id;
    13. }
    14. public String getName() {
    15. return name;
    16. }
    17. public void setName(String name) {
    18. this.name = name;
    19. }

    1. public String getPwd() {
    2. return pwd;
    3. }

    1. public void setPwd(String pwd) {
    2. this.pwd = pwd;
    3. }
    4. @Override
    5. public String toString() {
    6. return "User{" +
    7. "id=" + id +
    8. ", name='" + name + '\'' +
    9. ", pwd='" + pwd + '\'' +
    10. '}';
    11. }

    }

  • Dao接口

    public interface UserDao {

    1. List<User> getUserList();

    }

  • 接口实现类(由原来的UserDaoImpl转变为一个Mapper配置文件)

    <!DOCTYPE mapper

    1. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    2. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">



2.5、测试

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA56eD5aS055qE5omT5bel5LuU_size_20_color_FFFFFF_t_70_g_se_x_16

Junit测试:

  1. @Test
  2. public void test(){
  3. //第一步:获取sqlSession对象
  4. SqlSession sqlSession = MybatisUtils.getsqlSession();
  5. try{
  6. //第二步:执行SQL
  7. //方法一:最新的
  8. UserDao mapper = sqlSession.getMapper(UserDao.class);
  9. List<User> userList = mapper.getUserList();
  10. //方法二:不推荐
  11. //List<User> userList = sqlSession.selectList("com.wen.Dao.UserDao.getUserList");
  12. for (User user : userList) {
  13. System.out.println(user.toString());
  14. }
  15. }catch (Exception e){
  16. e.printStackTrace();
  17. }
  18. finally {
  19. //第四步:关闭sqlSession
  20. sqlSession.close();
  21. }
  22. }

注意事项:

在运行过程中可能会有的问题:

  • 配置文件没有注册:

    1. <mapper resource="com/wen/Dao/UserMapper.xml"/>


watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA56eD5aS055qE5omT5bel5LuU_size_6_color_FFFFFF_t_70_g_se_x_16

  • maven导出资源问题:




    src/main/resources

    /*.xml
    /.properties

    true


    src/main/java

    **/
    .xml
    */.properties

    true


#

3、CRUD(增查改删)

3.1、namepace

namepace中的包名要和Dao/Mapper接口的包名一致。

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA56eD5aS055qE5omT5bel5LuU_size_6_color_FFFFFF_t_70_g_se_x_16 1

3.2、select

选择、查询语句

  • id:就是对应的namespace中的方法名
  • resultType:SQL语句执行的返回值
  • parameterType:参数类型

1.编写UserMapper接口

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

2.编写对应的mapper中的SQL语句

  1. <!--这是一个查询语句-->
  2. <select id="getUserList" resultType="com.wen.pojo.User">
  3. select * from mybatis.user
  4. </select>
  5. <select id="getUserById" parameterType="int" resultType="com.wen.pojo.User">
  6. select * from mybatis.user where id = #{id}
  7. </select>

3.测试

  1. @Test
  2. public void test(){
  3. //第一步:获取sqlSession对象
  4. SqlSession sqlSession = MybatisUtils.getsqlSession();
  5. try{
  6. //第二步:执行SQL
  7. //方法一:最新的
  8. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  9. List<User> userList = mapper.getUserList();
  10. //方法二:不推荐
  11. //List<User> userList = sqlSession.selectList("com.wen.Dao.UserMapper.getUserList");
  12. for (User user : userList) {
  13. System.out.println(user.toString());
  14. }
  15. }catch (Exception e){
  16. e.printStackTrace();
  17. }
  18. finally {
  19. //第四步:关闭sqlSession
  20. sqlSession.close();
  21. }
  22. }
  23. @Test
  24. public void getUserById(){
  25. SqlSession sqlSession = MybatisUtils.getsqlSession();
  26. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  27. User user = mapper.getUserById(1);
  28. System.out.println(user);
  29. }

3.3、insert

1.编写UserMapper接口

  1. //插入一个用户
  2. int addUser(User user);

2.编写对应的mapper中的SQL语句

  1. <!--插入语句-->
  2. <insert id="addUser" parameterType="com.wen.pojo.User">
  3. insert into mybatis.user (id,name,pwd) values(#{id},#{name},#{pwd});
  4. </insert>

3.测试

  1. @Test
  2. //增删改需要提交事务
  3. public void addUser(){
  4. SqlSession sqlSession = MybatisUtils.getsqlSession();
  5. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  6. int rs = mapper.addUser(new User(4, "第四", "123456"));
  7. if (rs > 0){
  8. System.out.println("插入成功");
  9. }
  10. //提交事务
  11. sqlSession.commit();
  12. sqlSession.close();
  13. }

3.4、update

1.编写UserMapper接口

  1. //修改用户
  2. int updateUser(User user);

2.编写对应的mapper中的SQL语句

  1. <!--修改语句-->
  2. <update id="updateUser" parameterType="com.wen.pojo.User">
  3. update mybatis.user set name = #{name},pwd = #{pwd} where id = #{id}
  4. </update>

3.测试

  1. @Test
  2. public void updateUser(){
  3. SqlSession sqlSession = MybatisUtils.getsqlSession();
  4. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  5. int rs = mapper.updateUser(new User(4, "小四", "123"));
  6. sqlSession.commit();
  7. sqlSession.close();
  8. }

3.5、delete

1.编写UserMapper接口

  1. //删除用户
  2. int deleteUser(int id);

2.编写对应的mapper中的SQL语句

  1. <!--删除语句-->
  2. <delete id="deleteUser" parameterType="int">
  3. delete from mybatis.user where id = #{id}
  4. </delete>

3.测试

  1. @Test
  2. public void deleteUser(){
  3. SqlSession sqlSession = MybatisUtils.getsqlSession();
  4. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  5. int rs = mapper.deleteUser(4);
  6. sqlSession.commit();
  7. sqlSession.close();
  8. }

3.6、注意事项!

  • 增删改需要提交事务,否则无法修改

4、使用map(增查改删)

实体类或数据库中的表,字段,参数过多,应考虑使用Map。

  • Map传递参数,直接在SQL中取出key即可
  • 对象传递参数,直接在SQL中取出对象属性即可
  • 只有一个基本类型参数的情况下,可以直接在SQL中取到
  • 多个参数用map,或者注解!

4.1、insert

  1. //使用Map方法来添加
  2. int addUser_map(Map<String,Object> map);
  3. <!--插入语句,使用map,传递map中的key-->
  4. <insert id="addUser_map" parameterType="map">
  5. insert into mybatis.user (id,name,pwd) values(#{userid},#{username},#{userpwd});
  6. </insert>
  7. @Test
  8. //通过map来添加
  9. public void addUser_map(){
  10. SqlSession sqlSession = MybatisUtils.getsqlSession();
  11. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  12. Map<String, Object> map = new HashMap<String, Object>();
  13. map.put("userid",4);
  14. map.put("username","老四");
  15. map.put("userpwd","741");
  16. mapper.addUser_map(map);
  17. //提交事务
  18. sqlSession.commit();
  19. sqlSession.close();
  20. }

4.2、select

  1. //使用map查询用户
  2. User getUserById_map(Map<String,Object> map);
  3. <select id="getUserById_map" parameterType="map" resultType="com.wen.pojo.User">
  4. select * from mybatis.user where id = #{userid} and name = #{username}
  5. </select>
  6. //通过map查询
  7. @Test
  8. public void getUserById_map(){
  9. SqlSession sqlSession = MybatisUtils.getsqlSession();
  10. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  11. Map<String, Object> map = new HashMap<String, Object>();
  12. map.put("username","老四");
  13. map.put("userid",4);
  14. System.out.println(mapper.getUserById_map(map));
  15. sqlSession.close();
  16. }

4.3、update

  1. //通过map修改用户
  2. int updateUser_map(Map<String,Object> map);
  3. <!--通过map修改语句-->
  4. <update id="updateUser_map" parameterType="map">
  5. update mybatis.user set name = #{username},pwd = #{userpwd} where id = #{userid}
  6. </update>
  7. //通过map修改
  8. @Test
  9. public void updateUser_map(){
  10. SqlSession sqlSession = MybatisUtils.getsqlSession();
  11. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  12. Map<String,Object> map = new HashMap<String,Object>();
  13. map.put("username","李四");
  14. map.put("userpwd","423");
  15. map.put("userid",4);
  16. mapper.updateUser_map(map);
  17. sqlSession.commit();
  18. sqlSession.close();
  19. }

4.4、delete

  1. //通过map删除用户
  2. int deleteUser_map(Map<String,Object> map);
  3. <!--通过map删除语句-->
  4. <delete id="deleteUser_map" parameterType="map">
  5. delete from mybatis.user where id = #{userid}
  6. </delete>
  7. //通过map删除
  8. @Test
  9. public void deleteUser_map(){
  10. SqlSession sqlSession = MybatisUtils.getsqlSession();
  11. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  12. Map<String, Object> map = new HashMap<String, Object>();
  13. map.put("userid",4);
  14. mapper.deleteUser_map(map);
  15. sqlSession.commit();
  16. sqlSession.close();
  17. }

5、模糊查询

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

    List userList = mapper.getUserLike(“%老%”);

  • 在SQL拼接中使用通配符

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

    //模糊查询

    List getUserLike(String value);

    //模糊查询
    @Test
    public void getUserLike(){

    1. SqlSession sqlSession = MybatisUtils.getsqlSession();
    2. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    3. List<User> userList = mapper.getUserLike("老");
    4. //List<User> userList = mapper.getUserLike("%老%");
    5. System.out.println(userList);
    6. sqlSession.close();

    }

注意:SQL注入

  1. <!--
  2. select * from mybatis.user where id = ?
  3. select * from mybatis.user where id = 1 or 1=1
  4. -->

6、配置解析

6.1、核心配置文件

  • mybatis-config.xml
  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。

    configuration(配置)
    properties(属性)
    settings(设置)
    typeAliases(类型别名)
    typeHandlers(类型处理器)
    objectFactory(对象工厂)
    plugins(插件)
    environments(环境配置)
    environment(环境变量)
    transactionManager(事务管理器)
    dataSource(数据源)
    databaseIdProvider(数据库厂商标识)
    mappers(映射器)

6.2、环境配置(environments)

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

注意:虽然可以配置多个环境,但每个SqlSesssionFactory实例只能选择一种环境

提升:学会配置多套运行环境

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

6.3、属性(properties)

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

这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。【db.properties】

注意易错事项:

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA56eD5aS055qE5omT5bel5LuU_size_20_color_FFFFFF_t_70_g_se_x_16 1

编写配置文件:db.properties

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

在在mybatis-config.xml 核心配置文件中引入

  1. <!--引入外部配置文件-->
  2. <properties resource="db.properties"/>
  3. <!--直接增加一些配置属性-->
  4. <!--
  5. <properties resource="db.properties">
  6. <property name="username" value="root"/>
  7. </properties>
  8. -->
  9. <environments default="development">
  10. <environment id="development">
  11. <transactionManager type="JDBC"/>
  12. <dataSource type="POOLED">
  13. <property name="driver" value="${driver}"/>
  14. <property name="url" value="${url}"/>
  15. <property name="username" value="${username}"/>
  16. <property name="password" value="${password}"/>
  17. </dataSource>
  18. </environment>
  19. </environments>

注意:

  • 可以直接引入外部文件
  • 可以直接增加一些配置属性
  • 如果两个文件有同一个字段,优先使用外部配置文件的内容

6.4、类型别名(typeAliases)

  • 类型别名可为 Java 类型设置一个缩写名字。它仅用于 XML 配置,意在降低冗余的全限定类名书写。
  • 存在的意义仅在于用来减少类完全限定名的冗余

在mybatis-config.xml中添加以下代码:

  1. <!--可以给实体类起别名-->
  2. <typeAliases>
  3. <typeAlias type="com.wen.pojo.User" alias="user"/>
  4. </typeAliases>

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

扫描实体类的包,它的默认别名就位这个类的【类名】,建议首字母小写!!

  1. <!--可以给实体类起别名-->
  2. <typeAliases>
  3. <package name="com.wen.pojo"/>
  4. </typeAliases>

注意:

  • 在实体类比较少的情况下,建议使用第一种方式【DIY别名】
  • 实体类很多的情况下,建议使用第二种方式【自动扫描】
  • 第一种可以DIY别名,第二种不行,但可以通过在实体类上增加注解

    //实体类

    @Alias(“hello”)
    public class User {…..}

【易错点】:在使用注解时,UserMapper.xml里的每个参数都要用注解里的参数,否则会出现注解没有生效的情况!!!详情看:mybatis框架Alias注解异常解决方法_weixin_45474989的博客-CSDN博客

例图:

正确的

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA56eD5aS055qE5omT5bel5LuU_size_20_color_FFFFFF_t_70_g_se_x_16 2

错误的

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA56eD5aS055qE5omT5bel5LuU_size_20_color_FFFFFF_t_70_g_se_x_16 3

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA56eD5aS055qE5omT5bel5LuU_size_20_color_FFFFFF_t_70_g_se_x_16 4

6.5、设置(Settings)

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。

  • logImpl(日志实现)
  • lazyLoadingEnavled(懒加载)
  • cacheEnabled(缓存开启关闭)

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA56eD5aS055qE5omT5bel5LuU_size_20_color_FFFFFF_t_70_g_se_x_16 5

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA56eD5aS055qE5omT5bel5LuU_size_20_color_FFFFFF_t_70_g_se_x_16 6

一个配置完整的Settings元素的实例:

  1. <settings>
  2. <setting name="cacheEnabled" value="true"/>
  3. <setting name="lazyLoadingEnabled" value="true"/>
  4. <setting name="multipleResultSetsEnabled" value="true"/>
  5. <setting name="useColumnLabel" value="true"/>
  6. <setting name="useGeneratedKeys" value="false"/>
  7. <setting name="autoMappingBehavior" value="PARTIAL"/>
  8. <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  9. <setting name="defaultExecutorType" value="SIMPLE"/>
  10. <setting name="defaultStatementTimeout" value="25"/>
  11. <setting name="defaultFetchSize" value="100"/>
  12. <setting name="safeRowBoundsEnabled" value="false"/>
  13. <setting name="mapUnderscoreToCamelCase" value="false"/>
  14. <setting name="localCacheScope" value="SESSION"/>
  15. <setting name="jdbcTypeForNull" value="OTHER"/>
  16. <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
  17. </settings>

6.6、其他配置

  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)

    • mybatis-generator-core
    • mybatis-plus
    • 通用mapper
  • environments(环境配置)

    • environment(环境变量)

      • transactionManager(事务管理器)
      • dataSource(数据源)

6.7、映射器(mappers)

MapperRegistry:注册绑定mapper文件

既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。

在mybatis-config.xml中添加以下代码:

方式一【推荐使用】:

  1. <!-- 使用相对于类路径的资源引用 -->
  2. <mappers>
  3. <mappers>
  4. <mapper resource="com/wen/Dao/UserMapper.xml"/>
  5. </mappers>
  6. </mappers>

方式二:

  1. <!-- 使用完全限定资源定位符(URL) -->
  2. <mappers>
  3. <mapper url="file:/E:/JavaEE/Demos/Mybatis/Mybatis-Study/Mybatis-02/src/main/java/com/wen/Dao/UserMapper.xml"/>
  4. </mappers>

方式三:

  1. <!-- 使用映射器接口实现类的完全限定类名 -->
  2. <mappers>
  3. <mapper class="com.wen.Dao.UserMapper"/>
  4. </mappers>

注意:

  • 接口和他的Mapper配置文件必须同名!
  • 接口和他的Mapper配置文件必须在同一个包下!

方式四:

  1. <!-- 将包内的映射器接口实现全部注册为映射器 -->
  2. <mappers>
  3. <package name="com.wen.Dao"/>
  4. </mappers>

注意:

  • 接口和他的Mapper配置文件必须同名!
  • 接口和他的Mapper配置文件必须在同一个包下!

发表评论

表情:
评论列表 (有 0 条评论,49人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Linux基础命令()

    编辑模式 i 当前字符的前一个字符 I 进入到首个字符进行编辑 a 当前字符的后一个字符进行编辑 A 进入当前的行尾进行编辑 末行模式 <

    相关 tensorflow_基础 (

    1.张量,计算图,会话 基于Tnesorflow的NN,用张量表示数据,用计算图搭建神经网络,用会话执行计算图,优化线上的权重(参数),得到模型。 张量(tensor) :