1. CRUD
查询
//根据id查询用户
User getUserById(int id);
<!--namespace绑定一个对应的mapper接口-->
<mapper namespace="com.hou.dao.UserMapper">
<select id="getUserById" resultType="com.hou.pogo.User"
parameterType="int"> //参数可以去掉
select * from mybatis.user where id = #{id}
</select>
</mapper>
模糊查询
List<User> getUserLike(String value);
List<User> list = mapper.getUserLike("%o%");
<select id="getUserLike" resultType="com.hou.pogo.User">
select * from mybatis.user where name like #{value}
</select>
where name like "%"#{value}"%" 说存在SQL注入,测试并不存在。//第二种方式
新增
//插入用户
void addUser(User user);
<!--对象中的属性可以直接取出来-->
<insert id="addUser" parameterType="com.hou.pogo.User">
insert into mybatis.user (id, name, pwd) values (#{id}, #{name}, #{pwd});
</insert>
//测试的时候,记得提交事务
seqSession.commit();
修改
//修改用户
int updateUser(User user);
<update id="updateUser" parameterType="com.hou.pogo.User">
update mybatis.user set name=#{name}, pwd=#{pwd} where id =#{id};
</update>
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUser(new User(4,"hou","123"));
//提交事务
sqlSession.commit();
删除
//删除用户
int deleteUser(int id);
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id=#{id};
</delete>
- 记得提交事务
Map作为参数
- 参数过多,考虑使用Map
int addUser2(Map<String, Object> map);
<insert id="addUser2" parameterType="map">
insert into mybatis.user (id, name, pwd) values (#{id1}, #{name1}, #{pwd1});
</insert>
Map<String, Object> map = new HashMap<String, Object>();
map.put("id1",5);
map.put("name1","dong");
map.put("pwd1","12345");
mapper.addUser2(map);
//提交事务
sqlSession.commit();
User getUserById2(Map<String, Object> map);
Map<String, Object> map = new HashMap<String, Object>();
map.put("helloid",5);
map.put("name","dong");
User user = mapper.getUserById2(map);
<select id="getUserById2" parameterType="map"
resultType="com.hou.pogo.User">
select * from mybatis.user where id = #{helloid} and name = #{name};
</select>
-
Map传递参数,直接在sql中取出key即可! 【parameter=“map”】
- 多个参数用Map , 或者注解!
-
对象传递参数,直接在sql中取出对象的属性即可! 【parameter=“Object”】
-
只有一个基本类型参数的情况下,可以直接在sql中取到 【不需要写 parameterType】
2. 配置解析
mybatis-config.xml
configuration(配置)
-
**properties(属性) ***
-
**settings(设置) ***
-
**typeAliases(类型别名) ***
-
typeHandlers(类型处理器)
-
objectFactory(对象工厂)
-
plugins(插件)
-
**environments(环境配置) ***
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
-
databaseIdProvider(数据库厂商标识)
-
mappers(映射器)*
环境配置
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
</dataSource>
</environment>
</environments>
事务管理器
- JDBC 使用JDBC的提交 和 回滚设置
- MANAGED managed
- 从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期
manage
v.
管理,处理;操纵,控制;设法做到,勉力完成;腾出时间参加;凑合着活下去,支撑;调教(人或动物);竟搞得,竟做出
连接池 和 数据源类型
数据库连接池:dbcp,c3p0,druid 德鲁伊(阿里),hikari 默认集成
- 连接数据库
内建的数据源类型
- UNPOOLED unpooled 没有连接池
- POOLED pooled
- 有连接池,可以自动回收。
- 应用快速 响应请求。
- JNDI jndi EJB用的
properties
- mybatis-config.xml
<configuration>
<!--引入外部配置文件-->
<!--<properties resource="db.properties"/>-->
<properties resource="db.properties">
<property name="username" value="root"></property>
<property name="password" value="hdk123"></property> 优先使用外部配置,而不是本地
</properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
</configuration>
- db.properties
- 注意:在 此文件里,不需要转义了
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://111.230.212.103:3306/mybatis?userSSL=true&userUnicode=true&characterEncoding=UTF-8
#username=root
#password=hdk123
1.可以直接引入外部文件
2.可以在其中增加一些属性配置
3.如果两个文件有同一个字段,优先使用外部配置文件的
类型别名
第一种方式
-
mybatis-config.xml 下 configuration
- properties 下面
- 别名配置
<!--可以给实体类起别名--> <typeAliases> <typeAlias type="com.hou.pogo.User" alias="User"></typeAlias> </typeAliases>
- 使用
<select id="getUserLike" resultType="User">
第二种方式
<typeAliases>
<package name="com.hou.pogo"></package> //下面的User类,别名为 user,当然 用User也行。
</typeAliases>
也可以指定一个包,每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,
- 会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author,;
第一种可以DIY别名,第二种不行,如果非要改,需要在实体上增加注解。
@Alias("author")
public class Author {
}
下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。
别名 | 映射的类型 |
---|---|
_byte | byte |
_char (since 3.5.10) | char |
_character (since 3.5.10) | char |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
char (since 3.5.10) | Character |
character (since 3.5.10) | Character |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
biginteger | BigInteger |
object | Object |
date[] | Date[] |
decimal[] | BigDecimal[] |
bigdecimal[] | BigDecimal[] |
biginteger[] | BigInteger[] |
object[] | Object[] |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
设置
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
- lastName在mysql挺好。oracle会全部转为大写。所以 都习惯:last_name
- jdk7 新增 _ 。如:1_0000 。1万
设置名 | 描述 | 有效值 | 默认值 |
---|---|---|---|
cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 | true | false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 | true | false | false |
useColumnLabel | 使用列标签代替列名。实际表现依赖于数据库驱动,具体可参考数据库驱动的相关文档,或通过对比测试来观察。 | true | false | true |
useGeneratedKeys | 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。 | true | false | False |
mapUnderscoreToCamelCase | 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 | true | false | False |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J(3.5.9 起废弃) | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 未设置 |
<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"/>
</settings>
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins 插件
- mybatis-generator-core
- mybatis-plus
- 通用mapper
映射器 Mapper扫描包配置
MapperRegistry:注册绑定我们的Mapper文件;
- 就是配置 .xml文件,那配置 接口 和 扫描 也行,因为太强大了。
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/> // 不支持 模糊扫描
</mappers>
<!-- 使用完全限定资源定位符(URL) --> 别用
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器,这才是扫描包,模糊扫描 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
使用映射器接口实现类,将包内的映射器接口(上面 倒数2个) 注意点:
- 接口和他的Mapper配置文件必须同名。UserMapp 接口,必须对应 UserMapp.xml
- 接口和他的Mapper配置文件必须在同一个包下
registry
n.
注册;登记处;挂号处;船舶的国籍
作用域和生命周期
声明周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder:
- 一旦创建了SqlSessionFactory,就不再需要它了
- 所以放在:局部变量
SqlSessionFactory:
- 说白了就可以想象为:数据库连接池
- SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建一个实例。
- 因此SqlSessionFactory的最佳作用域是应用作用域(ApplocationContext)。
- 最简单的就是使用单例模式或静态单例模式。
SqlSession:
- 连接到连接池的一个请求
- 相当于 每次一个 http请求,就打开,响应后:就关闭。
- SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
- 用完之后需要赶紧关闭,否则资源被占用!
3. ResultMap 结果集映射
数据库字段名 和 model不一致
1. 起别名
- 起别名,把返回 和 model属性 一致。
<select id="getUserById" resultType="com.kuang.pojo.User">
select id,name,pwd as password from USER where id = #{id}
</select>
2. ResultMap
<!--结果集映射-->
<resultMap id="UserMap" type="User">
<!--column数据库中的字段,property实体类中的属性-->
<result column="id" property="id"></result>
<result column="name" property="name"></result> id 和 name 一样,无需映射
<result column="pwd" property="password"></result>
</resultMap>
<select id="getUserList" resultMap="UserMap">
select * from USER
</select>
- resultMap 元素是 MyBatis 中最重要最强大的元素。
- ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
- ResultMap 的优秀之处——你完全可以不用显式地配置它们。
- 如果这个世界总是这么简单就好了。
association
n.
协会,社团,联盟;交往,联合;联系,因果关系;联想
初中 | 高中 | CET4 | CET6 | 考研 | IELTS | GMAT
复数 associations