mybatis学习记录2
三.CRUD
3.1 namespace
namespace中的包名要和Dao/mapper接口的包名一致.
3.2 select
选择,查询语句:
- id:就是对应的namespace中的方法名
- resultType:Sql语句执行的返回值类型
- parameterType 参数类型(int String...)
- 编写接口
List<User> getUserList2();
- 编写对应的mapper中的sql语句
<select id="getUserList2" resultType="user">
select * from user
</select>
- 测试
@Test
public void UserList(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList2();
for (User user:userList) {
System.out.println(user);
}
sqlSession.close();
}
3.3 insert
<!-- 添加语句-->
<insert id="addUser" parameterType="cn.demo.pojo.User">
insert into user(userName,pwd) values(#{param1},#{param2})
</insert>
3.4 update
<update id="modifyUser" parameterType="cn.demo.pojo.User">
update user set pwd = #{pwd} where id =#{id}
</update>
3.5 delete
<delete id="deleteUser" parameterType="int">
delete from user where id =#{id}
</delete>
注意点:
- 增删改需要提交事务
3.6 万能的Map
假设我们的实体类,或者数据库中的表,字段过多,我们应当考虑使用map来做。
<select id="getLikeUser" parameterType="map" resultType="pojo.User">
select * from user where userName LIKE #{name};
</select>
SqlSession sqlSession = MybatisUitl.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("userName","小林");
map.put("userpassword","12312");
mapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
map传递参数,直接在sql中取出key即可![parameterType = "map"]
对象传递参数,直接在sql取出对象的属性即可![parameterType = "Object"]
只有一个基本类型参数的情况,可以直接在sql中提取到
多个参数用Map或注解
3.7 思考题
模糊查询怎么写?
-
java代码执行的时候传递通配符% %
List<User> user = mapper.getLikeUser("%李%"); -
在sql拼接中使用通配符
select * from user where userName LIKE "%"#{name}"%"
四.配置解析
1.核心配置文件
-
mybatis-config.xml
-
MyBatis的配置文件包含了会深深影响MyBatis行为的设置和属性信息
configuration(配置) properties(属性) settings(设置) typeAliases(类型别名) typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) environments(环境配置) environment(环境变量) transactionManager(事务管理器) dataSource(数据源) databaseIdProvider(数据库厂商标识) mappers(映射器)
2.环境配置
MyBatis 可以配置成适应多种环境
<environments default="development">//default可以选择对应的环境
<environment id="development">
<transactionManager type="JDBC"/>//可以更换c3p0等
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT&allowMultiQueries=true&relaxAutoCommit=true&zeroDateTimeBehavior=convertToNull"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT&allowMultiQueries=true&relaxAutoCommit=true&zeroDateTimeBehavior=convertToNull"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
注意:尽管可以配置多个环境,但每一个SqlSessionFactory实例只能选择一种环境
Mybatis默认的事务管理系统就是JDBC,连接池:POOLED
3.属性(properties)
我们可以使用properties配置属性
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置
配置properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT&allowMultiQueries=true&relaxAutoCommit=true&zeroDateTimeBehavior=convertToNull
username=root
password=123456
在核心文件中映入
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>
- 可以直接引入外部文件
- 可以在其中增加一些属性配置
- 如果两个文件有同一个字段,优先使用外部文件的
4 别名(typeAliases)
-
类型别名可为 Java 类型设置一个缩写名字。
-
它仅用于 XML 配置,意在降低冗余的全限定类名书写。
<typeAliases> <typeAlias type="cn.demo.pojo.User" alias="User"/> </typeAliases>
也可以指定包名,Mybatis会在包名下面搜索需要的Java Bean,比如:
扫描实体类的包,他的默认别名就为本类的类名小写
<typeAliases>
<package name="cn.demo.pojo.User"/>
</typeAliases>
在实体类比较少的时候使用第一种,
如果实体类十分多,建议使用第二种。
第一种可以DIY别名,第二种则不行,如果实体类有注解则使用注解名@alias()
@Alias("user")
public class User {
private int id;
private String userName;
private String pwd;
}
5. 设置
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。


比较重要。
6. 其他配置
7.映射器(pappers)
MapperRegister 映射访问
方式一:
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
方式二:使用class文件绑定注册
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
使用方式二的注意点:
- 接口和他的Mapper配置文件必须同名
- 接口和他的Mapper配置文件必须在同一个包下!
方式三:使用扫描包进行注入绑定
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
使用方式三的注意点:
- 接口和他的Mapper配置文件必须同名
- 接口和他的Mapper配置文件必须在同一个包下!
8. 生命周期和作用域
生命周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder:
- 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。
- 局部变量
SqlSessionFactory
- 就是数据库的连接池
- SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例
- 因此 SqlSessionFactory 的最佳作用域是应用作用域
- 最简单的就是使用单例模式或者静态单例模式
SqlSession
- 链接到连接池的一个请求。
- 用完需要被关闭,否则资源被占用
- SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域

这里面的mapper就代表一个具体的业务。
五. 解决属性名和字段名不一致的问题

1. 问题
//类型处理
// select id username,password from user where id = #{id}
解决方法:
-
起别名
<select id="getUserList2" resultType="user"> select id username,password from user where id = #{id} </select>
2.resultMap
结果集映射
id name pwd
id name password
<resultMap id="UserMap" type="user">
<result column="id" property="id"/>
<result column="userName" property="userName"/>
<result column="pwd" property="pwd"/>
</resultMap>
<select id="getUserList2" resultType="user">
select * from user
</select>
- resultMap元素是Mybatis中最重要强大的袁术
- resultMap的设计思想是对于简单的语句不需要配置显式的用到他们
- resultmap 最优秀的地方在于,虽然你已经对他相当的了解,但是根本就不需要显式的用到他们。
3. 一对多,多对一的关系

六. 日志
6.1 日志工厂
如果数据库操作,出现了异常,我们需要排错。日志就是最好的助手!
曾经:sout. debug
现在:日志工厂

- SLF4J
- LOG4J [重点]
- LOG4J2
- JDK_LOGGING
- COMMONS_LOGGING
- STDOUT_LOGGING[重点]
- NO_LOGGING
6.2 STDOUT_LOGGING
在配置文件中配置
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
输出效果

6.3 log4j
什么是log4j?
- Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件
- 我们也可以控制每一条日志的输出格式
- 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
- 这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
- 先导入log4j的包
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
- 配置Log4j的properties文件
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/shun.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
- 在mybatis的properties文件中修改日志配置
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
- Log4j的使用,直接测试运行程序

简单使用
- 在要使用lig4j的类中导入包 import org.apache.log4j.Logger;
- 日志对象,参数为当前类的class
static Logger logger = Logger.getLogger(UserTest.class);
- 日志级别
logger.info("进入了testLog4j方法");
logger.debug("进入了debug模式");
logger.error("出现了错误");
七. 分页
为什么要分页?
- 减少数据的处理量
Limit分页
select * from user limit 0,5
Mybatis分页
- 分页配置
<select id="getPageUser" resultMap="UserMap">
select * from user limit #{pageIndex},#{pageLength}
</select>
- 编写测试类
@Test
public void getPageList(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String,Integer> map = new HashMap<>();
map.put("pageIndex",0);
map.put("pageLength",2);
List<User> list = mapper.getPageUser(map);
for (User user : list) {
System.out.println(user);
}
sqlSession.close();
}
浙公网安备 33010602011771号