Mybatis相关配置及其简单使用二(基于maven下)

Mybatis相关配置及其简单使用二(基于maven下)

1.mybatis-config.xml 系统核心配置文件

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。

configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
<!-- 注意元素节点的顺序!顺序不对会报错 -->
1.子元素节点:environment

1.dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。

2.数据源是必须配置的。

3.有三种内建的数据源类型

type="[UNPOOLED|POOLED|JNDI]")

unpooled:这个数据源的实现只是每次被请求时打开和关闭连接。

pooled:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式。

jndi:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。

4.数据源也有很多第三方的实现,比如dbcp,c3p0,druid等等…

2.子元素节点:transactionManager - [ 事务管理器 ]
<!-- 语法 -->
<transactionManager type="[ JDBC | MANAGED ]"/>
3.子元素节点:数据源(dataSource)
4.元素节点:mappers元素

映射器 : 定义映射SQL语句文件。

引入资源方式
<!-- 使用相对于类路径的资源引用 -->
<mappers>
 <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!--使用映射器接口实现类的完全限定类名
需要配置文件名称和接口名称一致,并且位于同一目录下-->
<mappers>
 <mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>
<!--将包内的映射器接口实现全部注册为映射器
但是需要配置文件名称和接口名称一致,并且位于同一目录下-->
<mappers>
 <package name="org.mybatis.builder"/>
</mappers>
5.settings设置

设置(settings)相关 => 查看帮助文档

	懒加载

	日志实现

	缓存开启关闭

一个配置完整的 settings 元素的示例如下:

<settings>
 <setting name="cacheEnabled" value="true"/>
 <setting name="lazyLoadingEnabled" value="true"/>
 <setting name="multipleResultSetsEnabled" value="true"/>
 <setting name="useColumnLabel" value="true"/>
 <setting name="useGeneratedKeys" value="false"/>
 <setting name="autoMappingBehavior" value="PARTIAL"/>
 <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
 <setting name="defaultExecutorType" value="SIMPLE"/>
 <setting name="defaultStatementTimeout" value="25"/>
 <setting name="defaultFetchSize" value="100"/>
 <setting name="safeRowBoundsEnabled" value="false"/>
 <setting name="mapUnderscoreToCamelCase" value="false"/>
 <setting name="localCacheScope" value="SESSION"/>
 <setting name="jdbcTypeForNull" value="OTHER"/>
 <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

2.Mapper映射文件中配置SQL

(1)基础模板

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shuailiu.dao.BookMapper">

</mapper>

namespace(命名空间):根据命名解析规则,必须指定命名空间,最好使用全限定名来绑定接口,例如:上述代码中绑定了BookMapper接口。只要将命名空间置于合适的 Java 包命名空间之中,你的代码会变得更加整洁,也有利于你更方便地使用 MyBatis。
mapper标签:用来编写相关sql语句。

(2)mapper标签内的CRUD操作(xml文件开发)

1.select标签(映射查询语句)

案例:根据名字和密码查询用户(直接在方法中传递参数)

 //根据id查询User用户
    User selectUserById(@param("id")int id);
   <select id="selectUserById" parameterType="int" resultType="com.bookmall.pojo.User">
        select * from user where id=#{id}
    </select>

id属性:即为对应namespace中的方法名。
parameterType属性:将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。
resultType属性:结果的类型。通常 MyBatis 可以推断出来,但是为了更加准确,写上也不会有什么问题。MyBatis 允许将任何简单类型用作主键的类型,包括字符串。如果生成列不止一个,则可以使用包含期望属性的 Object 或 Map。
(1)指定 resultType 返回值类型时 String 类型的,string 在这里是一个别名,代表的是 java.lang.String 。
(2)对于引用数据类型,都是将大写字母转小写,比如 HashMap 对应的别名是 ‘hashmap’。
(3)基本数据类型考虑到重复的问题,会在其前面加上 ‘_’,比如 byte 对应的别名是 ‘_byte’。
(4)返回类型如果是对象类型,可以使用对象类型的全限定名(即包名+类名),或者在mybatis-config.xml中配置typeAliases(类型别名)。

  <!--类型别名-->
    <typeAliases>
        <typeAlias type="com.bookmall.pojo.User" alias="user"/>
        <!--也可以指定包名(在没有注解的情况下,会使用bean的首字母小写的非限定类名作为别名)-->
        <!--<package name="com.bookmall.pojo"/>-->
    </typeAliases>
   <select id="selectUserById" parameterType="int" resultType="user">
        select * from user where id=#{id}
    </select>

总结:如果参数过多,我们可以考虑直接使用Map实现,如果参数比较少,直接传递参数即可。

 	//查询user信息(根据name和pwd)(使用map)
    User selectUserByMap(Map<String,Object> map);
<select id="selectUserByMap" parameterType="map" resultType="com.bookmall.pojo.User">
        select * from user where name=#{username} and pwd=#{pwd}
    </select>

测试:

Map<String, Object> map = new HashMap<String, Object>();
map.put("username","小明");
map.put("pwd","123456");
User user = mapper.selectUserByMap(map);
2.update标签(映射更新语句)
//修改操作
    void updateUser(User user);
   <update id="updateUser" parameterType="user">
   		<!--对象User中的属性可以直接使用,不需要get方法-->
        update user set name=#{name},pwd=#{pwd} where id=#{id}
    </update>

注意:对象user中的属性可以直接取出来使用(User中的id,name,pwd)。

小结

1.所有的增删改操作都需要提交事务!

2.接口所有的普通参数,尽量都写上@Param参数,尤其是多个参数时,必须写上!

3.有时候根据业务的需求,可以考虑使用map传递参数!

4.为了规范操作,在SQL的配置文件中,我们尽量将ParameterType和resultType都写上!

(3)CRUD操作(注解开发)

sql 类型主要分成 :

@select ()

@update ()

@Insert ()

@delete ()

注意:利用注解开发就不需要mapper.xml映射文件了 .

步骤
1、我们在我们的接口中添加注解

(4)ResultMap及分页查询

//查询全部用户
@Select("select id,name,pwd password from user")
public List<User> getAllUser();
2、在mybatis的核心配置文件中注入
<!--使用class绑定接口-->
<mappers>
   <mapper class="com.kuang.mapper.UserMapper"/>
</mappers>
3、我们去进行测试
@Test
public void testGetAllUser() {
   SqlSession session = MybatisUtils.getSession();
   //本质上利用了jvm的动态代理机制
   UserMapper mapper = session.getMapper(UserMapper.class);

   List<User> users = mapper.getAllUser();
   for (User user : users){
       System.out.println(user);
  }
   session.close();
}

使用注解和配置文件协同开发,才是MyBatis的最佳实践!

4、本质上利用了jvm的动态代理机制在这里插入图片描述
1. 当实体类属性名与数据库字段名不一致时

mybatis会根据这些查询的列名(会将列名转化为小写,数据库不区分大小写) , 去对应的实体类中查找相应列名的set方法设值 , 例如:数据库字段为pwd,而对应的实体类属性为password,由于找不到setPwd() , 所以password返回null 。【自动映射】
解决方案:

方案一:为列名指定别名 , 别名和java实体类的属性名一致
<select id="selectUserById" resultType="User">
  select id , name , pwd as password from user where id = #{id}
</select>
方案二:使用结果集映射->ResultMap 手动映射【推荐】
<resultMap id="UserMap" type="User">
   <!-- id为主键 -->
   <id column="id" property="id"/>
   <!-- column是数据库表的列名 , property是对应实体类的属性名 -->
   <result column="name" property="name"/>
   <result column="pwd" property="password"/>
</resultMap>

<select id="selectUserById" resultMap="UserMap">
  select id , name , pwd from user where id = #{id}
</select>
2.分页查询
(1)使用Limit实现分页
#语法
SELECT * FROM table LIMIT stratIndex,pageSize

SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15  

#为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:   
SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.  

#如果只给定一个参数,它表示返回最大的记录行数目:   
SELECT * FROM table LIMIT 5; //检索前 5 个记录行  

#换句话说,LIMIT n 等价于 LIMIT 0,n。 
步骤

1、修改Mapper文件

<select id="selectUser" parameterType="map" resultType="user">
  select * from user limit #{startIndex},#{pageSize}
</select>

2、Mapper接口,参数为map

//选择全部用户实现分页
List<User> selectUser(Map<String,Integer> map);

3、在测试类中传入参数测试
推断:起始位置 = (当前页面 - 1 ) * 页面大小

@Test
public void testSelectUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);
   int currentPage = 1;  //第几页
   int pageSize = 2;  //每页显示几个
   Map<String,Integer> map = new HashMap<String,Integer>();
   map.put("startIndex",(currentPage-1)*pageSize);
   map.put("pageSize",pageSize);
   List<User> users = mapper.selectUser(map);
   for (User user: users){
       System.out.println(user);
  }
   session.close();
}
(2)使用mybatis分页插件PageHelper实现分页

了解即可,可以自己尝试使用

官方文档:https://pagehelper.github.io/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值