day09 MyBatis基础操作

为什么使用框架

框架的作用:可以直接调用写好的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文件中找不到该文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1dZtT8Rr-1684854079311)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230407200745128.png)]

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语句与查询使用的方法不能对应,就会报错:查询的结果大于想要的结果数量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4YuQ5PWL-1684854079313)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230407194732327.png)]

Mybatis执行流程:

img

工具类的抽取

项目中的获取连接的代码相同,可以抽成一个工具类,将读取文件的操作放在静态代码块中,直接调用方法就先执行没减少代码量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N62c0DrW-1684854079314)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230407200347033.png)]

抽取db.properties到resources包中

作用:让用户更改信息更加方便,不用在众多环境变量中进行麻烦的寻找

如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d7zD5ywK-1684854079314)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230407200817543.png)]

mybatis-config.xml的书写规范应修改为如下所示(使用${}进行代替):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2c567o8i-1684854079315)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230407200937952.png)]

设置查询语句中的别名

在mybatis.xml文件中添加别名,和enviroments同级,在properties后面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BfsauK1k-1684854079316)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230408190936964.png)]

mapper文件进行的查询语句更改resoult中的路径,大小写都可以

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pATBTPH2-1684854079317)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230408191112139.png)]

获取生成的主键(只有个添加时才有用)

在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文件的使用"/"连接,否则不能读取日志文件**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值