1. CRUD
1.1 select
UserMapper
public interface UserMapper {
List<User> getUserList();
// 根据Id查询用户
User getUserById(int id);
}
在UserMapper.xml 有这样:
<mapper namespace="com.dao.UserMapper">
<!--id 对应着方法名-->
<select id="getUserList" resultType="com.pojo.User" parameterType="">
select * from mybatis.user;
</select>
</mapper>
其中
- select 对应着sql中的sql
- id 对应着 UserMapper类中的函数(namespace所指向的类)
- resultType: sql语言执行的返回值;
- parameterType:参数类型
若使用parameterType,在UserMapper对应getUserById.在UserMapper.xml 可以这样写:
<mapper namespace="com.dao.UserMapper">
<!--id 对应着方法名-->
<select id="getUserList" resultType="com.pojo.User">
select * from mybatis.user;
</select>
<select id="getUserById" parameterType="int" resultType="com.pojo.User">
select * from user where id = #{id}
</select>
</mapper>
1.2. Create
增加对应着:insert标签,
UserMapper
public interface UserMapper {
// 查找用户
//增加用户
int addUser(User user);
//删除用户
//修改用户
}
在UserMapper.xml 对应着:
<!-- 这里插入一个User对象, #{id}, #{name}, #{pwd} 可以直接从改对象中取值-->
<insert id="addUser" parameterType="com.pojo.User" >
insert into mybatis.user(id, name, pwd) values (#{id}, #{name}, #{pwd})
</insert>
Test:
@Test
public void testAddUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int result = userMapper.addUser(new User(4,"李西","7895"));
if( result >1 ){
System.out.println("insert successful");
}
// 提交事务
sqlSession.commit();
sqlSession.close();
}
值得注意的是:在执行完增加操作后,需要提交事务,才能将值写入到数据库中去:sqlSession.commit();
1.3. Update
增加对应着:update标签,
UserMapper
public interface UserMapper {
// 查找用户
//增加用户
//删除用户
//修改用户
int updateUser(User user);
}
在UserMapper.xml 对应着:
<!-- 这里插入一个User对象, #{id}, #{name}, #{pwd} 可以直接从改对象中取值-->
<update id="updateUser" parameterType="com.pojo.User">
update user set name = #{name},pwd = #{pwd} where id = #{id}
</update>
Test:
@Test
public void testUpdateUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int res = userMapper.updateUser(new User(4,"Po张三","123asd"));
if( res > 0){
System.out.println("update successful");
}
sqlSession.commit();
sqlSession.close();
}
值得注意的是:在执行完增加操作后,需要提交事务,才能将值写入到数据库中去:sqlSession.commit();
1.4. Delete
删除对应着:delete标签,
UserMapper
public interface UserMapper {
// 查找用户
//增加用户
int deleteUser(int id);
//删除用户
//修改用户
}
在UserMapper.xml 对应着:
<!-- 这里插入一个User对象, #{id}, #{name}, #{pwd} 可以直接从改对象中取值-->
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
Test:
@Test
public void testDelteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int res = userMapper.deleteUser(4);
if( res > 0){
System.out.println("delete sucessful");
}
sqlSession.commit();
sqlSession.close();
}
值得注意的是:在执行完增加操作后,需要提交事务,才能将值写入到数据库中去:sqlSession.commit();
1.5. 注意
- 增删改需要提交事务
sqlSession.commit();
- 不忘忘记关闭操作
sqlSession.close();
- 在mybatis-config.xml 中有:
<mappers>
<mapper resource="com/dao/UserMapper.xml"/>
</mappers>
注意:这个是将配置的接口xml导入进去,还要resource里面的分割是"/",注意区分。
1.6 使用Map插入
若是一个实体自动过多,一般使用Map操作。下面听过Map来实现插入:
public interface UserMapper {
List<User> getUserList();
// 插入用户
int addUser(Map<String, Object> map);
}
在UserMapper.xml:
<insert id="addUser" parameterType="map">
insert into user(id,name ) values (#{userId}, #{username})
</insert>
Test:
@Test
public void testAdduser2(){
//1. 获得 sqlsession
SqlSession sqlSession = MybatisUtils.getSqlSession();
//2. 执行Sql
// 方式1:getMapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> map = new HashMap<String, Object>();
map.put("userId","5");
map.put("username","Pousi");
userMapper.addUser(map);
sqlSession.commit();
// 关闭SqlSession
sqlSession.close();
}
在其它操作中,同样可以使用 Map来实现
1.7 模糊查询
1.7.1 添加sql通配符
UserMapper
// 模糊查询List<User> selectLike(String value);
Test:
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userDao = sqlSession.getMapper(UserMapper.class);
List<User> userList = userDao.selectLike("%李%");
<select id="selectLike" parameterType="com.pojo.User" resultType="com.pojo.User">
select * from user where name like #{value}
</select>
1.7.2 在sql语句中拼接通配符,会引起sql注入
<select id="selectLike" parameterType="com.pojo.User" resultType="com.pojo.User">
select * from user where name like "%"#{value}"%"
</select>
2. 配置解析
2.1 核心配置文件
mybatis-config.xml (官网推荐的,不一定这个名字)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
2.1.1 environments(环境配置)
- MyBatis 可以配置成适应多种环境, 但但每个 SqlSessionFactory 实例只能选择一种环境。
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
...
</dataSource>
</environment>
</environments>
上述中,environments 有两个环境,一个development,一个test。通过environments 中的default属性来确定选择哪个环境。
其中,Mybatis的默认配置:
- 默认的事务是 JDBC : <transactionManager type="JDBC"/>
- 默认的连接类类型是POOLED : <dataSource type="POOLED"> (type="[UNPOOLED|POOLED|JNDI]")
2.1.2 properties(属性)
数据库这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。
编写配置文件 db.properties:
dirver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8;
username=root
password=1234
在核心配置文件中引用:<properties resource="db.properties" />
最后,mybatis-config.xml文件为:
<configuration>
<properties resource="db.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>
<mappers>
<mapper resource="com/dao/UserMapper.xml"/>
</mappers>
</configuration>
值得注意的是:properties 和 environments的标签位置不能交换,在其中有各自的顺序。
properties还可以通过以下的方式来定义(增加)属性:
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
- 如果自定义的属性和外部文件中的属性名冲突,优先使用外部配置文件
2.1.3 typeAliases(类型别名)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如:
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
当这样配置时,Blog 可以用在任何使用 domain.blog.Blog 的地方。
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
- 在实体类比较少的时候,建议使用第一种方式;在实体类较多的时候,建议使用第二种方式;
- 第一种可以自定义,第二种不行
除此之外,还可以使用注解来实现的别名。比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。见下面的例子:
@Alias("author")
public class Author {
...
}
2.1.4 settings(设置)
官网地址:
https://mybatis.net.cn/configuration.html#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.1.4 映射器(mappers)
方式一:
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
方式二:
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
注意事项:
- 接口和它的配置文件必须同名
- 接口和它的Mapper的配置文件必须在同一个包下面
方式三:
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
注意事项:
- 接口和它的配置文件必须同名
- 接口和它的Mapper的配置文件必须在同一个包下面
- 方式二和方式三的注意事项相同
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。