一别名优化第一种方法
在核心配置文件中使用<typeAliases>标签,为实体类起别名代码如下
<typeAliases>
<typeAlias type="sqt.pojo.User" alias="User"></typeAlias>
</typeAliases>
然后在mapper文件中引用
<select id="getUserList" resultType="User">
select * from mybatis.user
</select>
这就是别名优化
二,别名优化第二种方法
也可以指定一个包名,MyBatis会在包名下面搜索需要的JavaBean,比如:
扫描实体类的包,它的默认别名就为这个类的类名,首字母小写!
<typeAliases>
<package name="sqt.pojo"/>
</typeAliases>
mapper引用
<select id="getUserList" resultType="user">
select * from mybatis.user
</select>
在实体类比较少的时候使用第一种方法,在实体类比较多的时候使用第二种方法。
第一种可以DIY别名,第二种则不行,如果非要改,需要在实体上增加注解
@Alias("user")
//实体类
public class User {}
三 设置
这是MyBatis中极为重要的调整设置,它们会改变MyBatis的运行时行为。
四其他配置
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- mybatis-generator-core
- mybatis-plus
- 通用mapper
五映射器
mapperRegister:注册绑定我们的mapper文件
方式一,使用resources来绑定mapper.xml文件(推荐使用)
<mappers>
<mapper resource="sqt/dao/UserMapper.xml"/>
</mappers>
方式二.通过class来值赋予接口,然后来绑定mapper文件
<mappers>
<mapper class="sqt.dao.UserMapper"></mapper>
</mappers>
注意点:
接口名和mapper文件必须同名
接口和mapper必须在一个包下
方式三.使用扫描包进行注入绑定
<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册!-->
<mappers>
<package name="com.kuang.dao"/>
</mappers>
- 接口和它的Mapper配置文件必须同名!
- 接口和它的Mapper配置文件必须在同一个包下!
- 将数据库配置文件外部引入
- 实体类别名
- 保证UserMapper接口和UserMapper.xml改为一致!并且放在同一个包下!
六.生命周期和作用域
生命周期和作用域是至关重要的,因为错误的使用会引发严重的并发关系
SQLSessionFactoryBuild
一但创建完成后就不再需要了
局部变量
SQLSessionFactory:
说白了就是一个数据库链接池
SqlSessionFactory
一但创建一直运行在应用期间,没有任何理由去丢弃和去创建另一个实例化对象
- SqlSessionFactory 的最佳作用域是应用作用域。
- 最简单的就是使用单例模式或者静态单例模式。
SQLSession
链接到链接池的一个请求。
SQLSession的线程实例不是线程安全的,因此是不能被共享的,所以的他的最佳作业域是请求作用域或者方法作用域。
用完之后需要赶紧关闭,否则资源被占用。
每一个mapper就代表着一个具体的业务。
七,数据库表名字段名与属性名和java代码中名字不一样问题(这个错误恶心我俩天)
代码
dao接口
User getUserById(int id);
mapper.xml
<select id="getUserById" resultType="com.sqt.pojo.User">
select * from mybatis.user where id=#{id}
</select>
测试代码
public void getUserLike(){
//第一步:获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//方式一:getMapper
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = (User) mapper.getUserById(1);
System.out.println(user);
//关闭SqlSession
sqlSession.close();
}
数据库表字段和java代码中的字段不一致
导致结果找不到password的值
解决方法一修改sql语句给骗我的起一个别名
select id,name,pwd as password from mybatis.user where id=#{id}
第二种方式resultmap结果集映射
- resultMap 元素是 MyBatis 中最重要最强大的元素。
- ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
- ResultMap 的优秀之处——你完全可以不用显式地配置它们。
- 如果这个世界总是这么简单就好了。
id name pwd
id name password
如上图所示,如果不把resultMap标签放在namespace下面,将会报错
<mapper namespace="com.sqt.dao.UserMapper">
<resultMap id="UserMap" type="User">
<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>
然后就可以成功运行