为什么使用框架
框架的作用:可以直接调用写好的API,提高开发效率,框架是一种经过校验,有一定功能的半成品软件
为什么选择mybatis框架
它几乎避免了所有的JDBC的代码和手动设置参数及获取结果集.作用于持久层,支持定制化sql,存储过程及高级映射
项目所需要的jar包:
lombok-xxx.jar
mysql.connector-java-xxx.jar
mybatis-xxx.jar
mybatis-config.xml配置文件
作用:配置mybatis
1.在resources包中创建mybatis-config.xml文件
2.添加xml文件的约束,能够快速进行代码书写,防止出错
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
mybatis-config.xml配置文件中各个标签的作用:
<properties resource="db.properties"/> //关联db.propertise配置文件
<environment id="dev"> //当前使用哪一个环境,(开发环境,测试环境,生产环境)
<!--type:指定用哪一种事务管理器
JDBC:是一种事务管理器的别名
-->
<transactionManager type="JDBC"/>
<!--
type:指定用哪一种连接池
POOLED;是一种连接池的别名
-->
<dataSource type="POOLED">
//获取连接对象
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
//指定包中类的别名
<typeAliases>
<package name="pmis.domain"/>
</typeAliases>
mybatis中必须关联mapper映射文件
配置xxxmapper.xml
mapper文件的作用:专门用于书写sql语句
在resources文件中新建目录格式为(使用/进行分割):resources/mybatis/mapper(与项目到路径相同),如果使用的’.'进行分割就会在mybat-config.xml文件中找不到该文件
1.添加mapper.xml文件的约束
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:命名空间:用于区分不同的mapper的sql语句
namespace+sqlid:sql语句的唯一表示,在impl类中进行使用
-->
<mapper namespace="mybatis/mapper/UserMapper">
2.添加用户的sql语句,所有的属性获取使用:**#{属性名}**进行代替
增删改的语法如下
<!--
使用id来进行标识,在impl中执行的时候就可以直接指定地址了
示例:session.insert("mybatis/mapper/UserMapper.insert",u);
#{name}:name是对象的属性名,底层使用的内省
-->
<insert id="insert">
insert into user (id,name,age,salary,hiredate) values(null,#{name},#{age},#{salary},#{hiredate})
</insert>
查询的语法如下(必须使用resultType指定查询的结果封装成什么对象,使用的是相对路径):
<!--
resultType:指定查询的每行数据封装成什么类型的对象
查询的时候需要给一个对象,底层使用内省进行封装
路径就是实体类的路径,使用"."进行连接
-->
<select id="selectById" resultType="mybatis.domain.User">
select * from user where id=#{id}
</select>
DAO层实现类的操作方法及注意事项:
(增删改)
**1.**加载mybatis主配置文件,这是mybatis特有的加载文件的方式,只有使用mybatis配置文件的时候使用
InputStream in =Resource.getResourceAsStream("mybatis-config.xml")
**2.**创建sqlsessionFactory对象(连接池)
SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(in);
**3.**获取sqlsession对象(连接),使用openSession方法
SqlSession session = fac.openSession();
**4.**执行指定的sql语句
statement:sql语句
u:执行sql所需要的参数所在的对象,后面的参数2容易忘记传,否则添加的全是空数据
session.insert("mybatis/mapper/UserMapper.insert",u);
增删改这三种语句都可以使用:update方法,对结果没有任何影响
**5.**手动提交事务
session.commit()
**6.**释放资源
session.close();
(查询,不需要提交事务,同时需要关闭资源)
前面 的获取连接的方式与增删改相同
public User selectByID(Long id) throws IOException {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = fac.openSession();
1.查询返回有多种结果,最常使用的查询结果只返回一个对象和返回一个集合
只返回一个对象(selectOne):
User u = sqlSession.selectOne("mybatis/mapper/UserMapper.selectById", id);
sqlSession.close();
return u;
返回一个集合(selectList)
List<User> list = sqlSession.selectList("mybatis/mapper/UserMapper.selectAll");
sqlSession.close();
return list;
如果statement中使用sql语句与查询使用的方法不能对应,就会报错:查询的结果大于想要的结果数量
Mybatis执行流程:
工具类的抽取
项目中的获取连接的代码相同,可以抽成一个工具类,将读取文件的操作放在静态代码块中,直接调用方法就先执行没减少代码量
抽取db.properties到resources包中
作用:让用户更改信息更加方便,不用在众多环境变量中进行麻烦的寻找
如图:
mybatis-config.xml的书写规范应修改为如下所示(使用${}进行代替):
设置查询语句中的别名
在mybatis.xml文件中添加别名,和enviroments同级,在properties后面
mapper文件进行的查询语句更改resoult中的路径,大小写都可以
获取生成的主键(只有个添加时才有用)
在sql的添加语句中加上 useGeneratedKeys,keyProperty, keyColumn
useGeneratedKeys:表示是否需要获取生成的主键
keyProperty:数据表中的主键列名,可省
keyColumn:主键列对应java中的属性名
<insert id="insert" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into user (id,name,age,salary,hiredate) values(null,#{name},#{age},#{salary},#{hiredate})
</insert>
日志管理
在resurces中添加名字为log4j.properties.里面的内容如下
# 全局日志配置
log4j.rootLogger=ERROR, stdout
# MyBatis 日志配置,只修改下方的配置,mapper文件
log4j.logger.mybatis=TRACE
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
注意:只修改log4j.logger.mybatis=TRACE的内容
pper文件
log4j.logger.mybatis=TRACE
控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
**注意**:只修改log4j.logger.mybatis=TRACE的内容
**所有 的路径都是用"."进行连接,只有映射mapper文件的使用"/"连接,否则不能读取日志文件**