mybatis -- 3、映射配置、详解

小灰灰 2023-03-06 05:22 70阅读 0赞

目录

(8)配置映射的三种方式:

①直接输入类的完全限定名:

  1. 方式一:如果是maven的项目的话,需要添加如下配置,因为maven默认只会编译java文件,需要把xml文件也添加到指定目录中
  2. 方式二:在resource(资源)目录下,创建跟dao层一样的同级目录即可,将配置文件放到指定的目录

③直接定义包的名称方式映射:

(9)Mybatis SQL映射文件详解:

1、insert插入、update更新、delete删除

useGeneratedKeys使用生成的主键:

keyProperty主键属性:

id:

resultType结果类型:

resultMap结果映射:


(8)配置映射的三种方式:

①直接输入类的完全限定名:

UserDaoAnnotation.**java**(用户注解接口)

  1. public interface UserDaoAnnotation {
  2. @Select("select * from user where id = #{id}")
  3. public User selectUserById(Integer id);
  4. }

mybatis-config.**xml**(mybatis配置)

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. //在填写标签的时候一定要注意相关配置的顺序
  6. <configuration配置>
  7. 当需要引入外部的配置文件的时候,可以使用这样的方式:
  8. 类似于<context:property-placeholder location>
  9. resource资源:表示从当前项目的类路径中进行加载,如果用的是idea指的是
  10. resource资源目录下的配置文件
  11. url:可以从当前文件系统的磁盘目录查找配置,也可以从网络上的资源进行引入
  12. <properties属性 resource资源="db.properties"></properties>
  13. //可以影响mybatis运行时的行为,包含N多个属性,需要什么引入什么
  14. <settings>
  15. //开启驼峰标识验证
  16. <setting name="mapUnderscoreToCamelCase" value="true"/>
  17. </settings>
  18. typeAliases类型命名:表示在引入实体类的名称时候,可以使用别名,而不需要写完全限定名
  19. <typeAliases类型命名>
  20. <typeAlias type="com.mashibing.bean.Emp" alias="Emp"></typeAlias>
  21. //当每一个具体的类都需要单独来写,如果有100个类呢?使用下面方式:
  22. //可以指定具体的包来保证实体类不需要写完全限定名
  23. <package name="com.mashibing.bean"/>
  24. </typeAliases>
  25. //设置定义自己的类型处理器,mybatis中默认内置了很多类型处理器,一般不需要自己来实现
  26. <typeHandlers>
  27. <typeHandler handler="" ></typeHandler>
  28. <package name=""/>
  29. </typeHandlers>
  30. //当需要自定义对象工厂的时候实现此标签,完成结果集到java对象实例化的过程
  31. <objectFactory type=""></objectFactory>
  32. <environments环境s default默认值="development开发">
  33. 配置具体的环境属性:
  34. id:表示当前环境的名称
  35. <environment环境 id="development开发">
  36. 事务管理器,每一种数据源都需要配置具体的事务管理器:JDBC、MANAGED
  37. JDBC:使用jdbc原生的事务控制
  38. MANAGED管理:什么都没做
  39. <transactionManager事务管理器 type="JDBC"/>
  40. 配置具体的数据源的类型:pooled、unpooled 、jndi(不用)
  41. pooled合并:使用数据库连接池
  42. unpooled:每次都打开和关闭一个链接
  43. <dataSource数据源 type="POOLED">
  44. //链接数据的时候需要添加的必备的参数,一般是四个,如果是连接池
  45. 的话,可以设置连接最大个数等
  46. <property name="driver" value="${driver}"/>
  47. <property name="url" value="${url}"/>
  48. <property name="username" value="${username}"/>
  49. <property name="password" value="${password}"/>
  50. </dataSource>
  51. </environment>
  52. </environments>
  53. //提供了不同的数据库厂商的标识,当有数据库移植的需求的时候,可以根据不同的数据库来执行不同的sql语句
  54. 用来扩展数据库的移植性
  55. <databaseIdProvider数据库厂商标识 type="DB_VENDOR">
  56. <property name="MySQL" value="mysql"/>
  57. <property name="SQL Server" value="sqlserver"/>
  58. <property name="Oracle" value="oracle"/>
  59. </databaseIdProvider>
  60. ============================== 添加 =================================
  61. //是来将mapper映射文件引入到配置文件中,方便程序启动的时候进行加载
  62. //每次在进行填写的时候需要注意,写完xml映射之后一定要添加到mybatis-config文件中
  63. resource资源:从项目的类路径下加载对应的映射文件
  64. url:从本地磁盘目录或者网络中引入映射文件
  65. class:可以直接引入类的完全限定名,可以使用注解(接口类)的方式进行使用
  66. <mappers>
  67. //<mapper resource="EmpDao.xml" />
  68. //<mapper resource="UserDao.xml"/>
  69. 添加: <mapper class="com.mashibing.dao.UserDaoAnnotation"></mapper>
  70. </mappers>
  71. ===============================================================================
  72. </configuration>

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTA0MjU2OQ_size_16_color_FFFFFF_t_70

右击**test05()**,点运行:

20200805141849708.png

mybatis-config.**xml**(mybatis配置)

  1. //是来将mapper映射文件引入到配置文件中,方便程序启动的时候进行加载
  2. //每次在进行填写的时候需要注意,写完xml映射之后一定要添加到mybatis-config文件中
  3. resource:从项目的类路径下加载对应的映射文件
  4. url:从本地磁盘目录或者网络中引入映射文件
  5. class:可以直接引入类的完全限定名,可以使用注解(接口类)的方式进行使用
  6. ============================== 添加 =================================
  7. //如果不想以注解(接口类)的方式引入呢?
  8. //如果想要class的方式引入配置文件,可以将xml文件添加到具体的类的同级目录下
  9. <mappers>
  10. //<mapper resource="EmpDao.xml" />
  11. //<mapper resource="UserDao.xml"/>
  12. //<mapper class="com.mashibing.dao.UserDaoAnnotation"></mapper>
  13. 添加: <mapper class="com.mashibing.dao.UserDao"></mapper>
  14. </mappers>
  15. ===============================================================================
  16. </configuration>

20200805141912779.png

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTA0MjU2OQ_size_16_color_FFFFFF_t_70 1

右击**test05()**,点运行:

20200805141935491.png //报错

方式一:如果是maven的项目的话,需要添加如下配置,因为maven默认只会编译java文件,需要把xml文件也添加到指定目录中

加入依赖:

  1. <builds建立>
  2. <resources资源s>
  3. <resource资源>
  4. <directory目录>src/main/java</directory>
  5. <includes包含s>
  6. <include包含>**/*.xml</include>
  7. </includes>
  8. </resource>
  9. </resources>
  10. </build>

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTA0MjU2OQ_size_16_color_FFFFFF_t_70 2 //自动配置成功

20200805142008300.png

方式二:在resource(资源)目录下,创建跟dao层一样的同级目录即可,将配置文件放到指定的目录

20200805142046537.png20200805142049362.png

20200805142054904.pngwatermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTA0MjU2OQ_size_16_color_FFFFFF_t_70 3

20200805142101456.png

③直接定义包的名称方式映射:

mybatis-config.**xml**(mybatis配置)

  1. //是来将mapper映射文件引入到配置文件中,方便程序启动的时候进行加载
  2. //每次在进行填写的时候需要注意,写完xml映射之后一定要添加到mybatis-config文件中
  3. resource:从项目的类路径下加载对应的映射文件
  4. url:从本地磁盘目录或者网络中引入映射文件
  5. class:可以直接引入类的完全限定名,可以使用注解(接口类)的方式进行使用
  6. //如果不想以注解(接口类)的方式引入呢?
  7. //如果想要class的方式引入配置文件,可以将xml文件添加到具体的类的同级目录下
  8. <mappers>
  9. //<mapper resource="EmpDao.xml" />
  10. //<mapper resource="UserDao.xml"/>
  11. //<mapper class="com.mashibing.dao.UserDaoAnnotation"></mapper>
  12. //<mapper class="com.mashibing.dao.UserDao"></mapper>
  13. ============================== 添加 =================================
  14. //如果需要引入多个配置文件,可以直接定义包的名称
  15. resource目录下配置的映射文件必须要具体相同的目录
  16. <package name="com.mashibing.dao"/>
  17. ===============================================================================
  18. </mappers>
  19. </configuration>

20200805142146258.png

(9)Mybatis SQL映射文件详解:


















































属性

描述

id

在命名空间中唯一的标识符,可以被用来引用这条语句。

parameterType

输入类型

将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过TypeHandler类型处理器推断出具体传入语句的参数,

默认值为unset未设置

parameterMap

输入映射

用于引用外部 parameterMap输入映射 的属性,目前已被废弃。请使用行内参数映射和 parameterType输入类型 属性。

flushCache

冲洗缓存

将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,

默认值:true(对 insertupdate delete 语句)。

timeout

超时

这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。

默认值为unset未设置(依赖数据库驱动)。

statementType

声明类型

可选 STATEMENT声明PREPARED准备CALLABLE可调用。这会让 MyBatis 分别使用 Statement陈述PreparedStatement准备声明 CallableStatement可调用语句

默认值:PREPARED准备

useGeneratedKeys

使用生成的主键

(仅适用于 insert update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys()获取生成的主键 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),

默认值:false。

keyProperty

主键属性

(仅适用于 insert update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys()获取生成的键 的返回值或 insert 语句的 selectKey选择键 子元素设置它的值,

默认值:unset未设置。如果生成列不止一个,可以用逗号分隔多个属性名称。

keyColumn

键列

(仅适用于 insert update)设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。如果生成列不止一个,可以用逗号分隔多个属性名称。

databaseId

数据库标识符

如果配置了databaseIdProvider数据库厂商标识,MyBatis 会加载所有不带 databaseId数据库标识符 或匹配当前databaseId数据库标识符 的语句;如果带和不带的语句都有,则不带的会被忽略。

  1. 在之前我们学习了mybatis的全局配置文件,下面我们开始学习mybatis的映射文件,在映射文件中,可以编写以下的顶级元素标签:
  2. cache缓存 该命名空间的缓存配置。
  3. cache-ref缓存参数 引用其它命名空间的缓存配置。
  4. resultMap结果映射 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
  5. parameterMap参数映射 老式风格的参数映射。此元素已被废弃,并可能在将来被移除!请使用行内参数映射。文档中不会介绍此元素。
  6. sql 可被其它语句引用的可重用语句块。
  7. insert 映射插入语句。
  8. update 映射更新语句。
  9. delete 映射删除语句。
  10. select 映射查询语句。

在每个顶级元素标签中可以添加很多个属性,下面我们开始详细了解下具体的配置。

id:用来标识跟dao接口中匹配的方法,必须与方法的名字一一对应上
flushCache冲洗缓存:用来标识当前sql语句的结果是否进入二级缓存
statementType声明类型:用来选择执行sql语句的方式
(1)statement声明:最基本的jdbc的操作,用来表示一个sql语句,不能防止sql注入
(2)PREPARED准备preareStatement准备声明:采用预编译的方式,能够防止sql注入,设置参数的时候需要该对象来进行设置
(3)CALLABLE可调用:调用存储过程

useGeneratedKeys使用生成的主键:完成插入操作的时候,可以将自增生成的主键值返回到具体的对象
keyProperty主键属性:指定返回的主键要赋值到哪个属性中

1、insert插入、update更新、delete删除

EmpDao.**xml**

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.mashibing.dao.EmpDao">
  6. <select id="selectEmpByEmpno" resultType="Emp" databaseId="mysql">
  7. select * from emp where empno = #{empno}
  8. </select>
  9. //insert delete update分别用来标识不同类型的sql语句
  10. <insert id="save" >
  11. insert into emp(empno,ename) values(#{empno},#{ename})
  12. </insert>
  13. <update id="update">
  14. update emp set sal=#{sal} where empno = #{empno}
  15. </update>
  16. <delete id="delete">
  17. delete from emp where empno = #{empno}
  18. </delete>
  19. </mapper>

20200806133406387.png

MyTest.**java**

  1. @Test
  2. public void test02(){
  3. SqlSession sqlSession线程 = sqlSessionFactory.openSession();
  4. EmpDao mapper = sqlSession.getMapper(EmpDao.class);
  5. Emp emp = new Emp();
  6. emp.setEmpno(3333);
  7. emp.setEname("zhangsan");
  8. Integer save = mapper.save(emp);
  9. System.out.println(save保存);
  10. sqlSession.commit();
  11. sqlSession.close();
  12. }

20200806133442504.png

UserDao**.**java

  1. public interface UserDao {
  2. public User selectUserById(Integer id);
  3. =================================== 添加 ======================================
  4. public Integer saveUser(User user);
  5. ===============================================================================
  6. }

UserDao**.**xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.mashibing.dao.UserDao">
  6. <select id="selectUserById" resultType="com.mashibing.bean.User">
  7. select * from user where id = #{id}
  8. </select>
  9. =================================== 添加 ======================================
  10. <insert id="saveUser">
  11. insert into user(user_name) values(#{userName})
  12. </insert>
  13. ===============================================================================
  14. </mapper>

MyTest.**java**

  1. @Test
  2. public void test06(){
  3. SqlSession sqlSession线程 = sqlSessionFactory.openSession();
  4. UserDao mapper = sqlSession.getMapper(UserDao.class);
  5. User user = new User();
  6. user.setUserName("lisi");
  7. Integer save = mapper.saveUser(user用户);
  8. System.out.println(save);
  9. sqlSession.commit();
  10. sqlSession.close();
  11. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTA0MjU2OQ_size_16_color_FFFFFF_t_70 4watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTA0MjU2OQ_size_16_color_FFFFFF_t_70 5

20200806133554772.png

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTA0MjU2OQ_size_16_color_FFFFFF_t_70 6 //报错

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTA0MjU2OQ_size_16_color_FFFFFF_t_70 7

2020080613361278.png

20200806133628834.png

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTA0MjU2OQ_size_16_color_FFFFFF_t_70 8

20200806133644346.png //id是null

useGeneratedKeys使用生成的主键:

完成插入操作的时候,可以将自增生成的主键值返回到具体的对象

#

keyProperty主键属性:

指定返回的主键要赋值到哪个属性中

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTA0MjU2OQ_size_16_color_FFFFFF_t_70 9

202008061337050.png

在编写sql语句的过程中,无论你是否配置了驼峰标识的识别settting点取设置,都需要在sql语句中写具体的表的属性名,不能写对象名称

  1. =======================================================================
  2. <!--如果数据库支持自增可以使用这样的方式-->
  3. <insert id="insertUser" useGeneratedKeys使用生成的主键="true" keyProperty主键属性="id">
  4. insert into user(user_name) values(#{userName})
  5. </insert>
  6. =======================================================================
  7. <!--如果数据库不支持自增的话,那么可以使用如下的方式进行赋值查询-->
  8. <insert id="insertUser2" >
  9. <selectKey order命令="BEFORE之前" keyProperty主键属性="id" resultType结果类型="integer整数">
  10. select max(id)+1 from user
  11. </selectKey>
  12. insert into user(id,user_name) values(#{id},#{userName})
  13. </insert>
  14. =======================================================================

















































属性

描述

id

在命名空间中唯一的标识符,可以被用来引用这条语句。

parameterType

输入类型

将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过TypeHandler类型处理器推断出具体传入语句的参数,

默认值为unset未设置

parameterMap

输入映射

用于引用外部 parameterMap输入映射 的属性,目前已被废弃。请使用行内参数映射和 parameterType输入类型 属性。

flushCache

冲洗缓存

将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,

默认值:true(对 insertupdate delete 语句)。

timeout

超时

这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。

默认值为unset未设置(依赖数据库驱动)。

statementType

声明类型

可选 STATEMENT声明PREPARED准备CALLABLE可调用。这会让 MyBatis 分别使用 Statement陈述PreparedStatement准备声明 CallableStatement可调用语句

默认值:PREPARED准备

useGeneratedKeys

使用生成的主键

(仅适用于 insert update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys()获取生成的主键 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),

默认值:false。

keyProperty

主键属性

(仅适用于 insert update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys()获取生成的键 的返回值或 insert 语句的 selectKey选择键 子元素设置它的值,

默认值:unset未设置。如果生成列不止一个,可以用逗号分隔多个属性名称。

keyColumn

键列

(仅适用于 insert update)设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。如果生成列不止一个,可以用逗号分隔多个属性名称。

databaseId

数据库标识符

如果配置了databaseIdProvider数据库厂商标识,MyBatis 会加载所有不带 databaseId数据库标识符 或匹配当前databaseId数据库标识符 的语句;如果带和不带的语句都有,则不带的会被忽略。

  1. cache缓存 该命名空间的缓存配置。
  2. cache-ref缓存参数 引用其它命名空间的缓存配置。
  3. resultMap结果映射 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
  4. parameterMap参数映射 老式风格的参数映射。此元素已被废弃,并可能在将来被移除!请使用行内参数映射。文档中不会介绍此元素。
  5. sql 可被其它语句引用的可重用语句块。
  6. insert 映射插入语句。
  7. update 映射更新语句。
  8. delete 映射删除语句。
  9. select 映射查询语句。

id:

用来设置当前sql语句匹配的dao接口的方法,必须要跟方法的名字统一

resultType结果类型:

表示返回的结果的类型,一般使用的并不多,此类型只能返回单一的对象,而我们在查询的时候特别是关联查询的时候,需要自定义结果集

当返回的结果是一个集合的时候,并不需要resultMap返回值映射,只需要使用resultType结果类型 指定集合中的元素类型即可

EmpDao.**xml**

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace命名空间="com.mashibing.dao.EmpDao">
  6. ============================== 添加 =================================
  7. <select id="selectAll" resultType结果类型="Emp">
  8. select * from emp
  9. </select>
  10. =====================================================================
  11. <select id="selectEmpByEmpno" resultType结果类型="com.mashibing.bean.Emp" databaseId="mysql">
  12. select * from emp where empno = #{empno}
  13. </select>
  14. //insert delete update分别用来标识不同类型的sql语句
  15. <insert id="save">
  16. insert into emp(empno,ename) values(#{empno},#{ename})
  17. </insert>
  18. <update id="update">
  19. update emp set sal=#{sal} where empno = #{empno}
  20. </update>
  21. <delete id="delete">
  22. delete from emp where empno = #{empno}
  23. </delete>
  24. </mapper>

EmpDao.**java**接口

  1. public interface EmpDao {
  2. public Integer save(Emp emp);
  3. public Integer update(Emp emp);
  4. public Integer delete(Integer empno);
  5. public Emp selectEmpByEmpno(Integer empno);
  6. ============================== 添加 =================================
  7. public List<Emp> selectAll();
  8. =====================================================================
  9. }

MyTest.**java**

  1. @Test
  2. public void test07(){
  3. SqlSession sqlSession线程 = sqlSessionFactory.openSession();
  4. EmpDao mapper = sqlSession.getMapper(EmpDao.class);
  5. List<Emp> list = mapper.selectAll();
  6. for (Emp emp : list) {
  7. System.out.println(emp);
  8. }
  9. sqlSession.commit();
  10. sqlSession.close();
  11. }

20200806133951554.png

resultMap结果映射:(下一章最后一节讲)

当进行关联查询的时候,在返回结果的对象中还包含另一个对象的引用时,此时需要自定义结果集合,才使用resultMap

发表评论

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

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

相关阅读

    相关 Mybatis映射详解

    Mybatis映射详解 在最近的工作中,碰到一个比较复杂的返回结果,发现简单映射已经解决不了这个问题了,只好去求助百度,学习mybatis复杂映射应该怎么写,将学习笔记结