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的动态代理机制![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070615300317.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDUxODg0Mg==,size_16,color_FFFFFF,t_70)
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/