狂神说JavaMybatis笔记 二 入门

Mybatis:

  • namespace的包名要和Dao/Mapper接口的包名一致!
增删改查:
  • 在UserMapper接口中添加方法
  • 在UserMapper.xml中添加标签
  • 在测试类中写测试方法,注意sqlSession的提交事务

xml标签:

  • id:对应xml绑定的namespace的接口的方法名
  • resultType:sql语句执行的返回值
  • parameterType:参数类型

接口类:

public interface UserMapper {
    List<User> getUserList();
    //获得全部用户
    User getUserById(int id);
    //根据ID获取用户
    int addUser(User user);
    //添加用户
    int updateUser(User user);
    //更新用户
    int deleteUser(int id);
    //删除用户
}

xml标签:

<!--namespace绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.dai.dao.UserMapper">
<!--select查询语句-->
    <select id="getUserList" resultType="com.dai.pojo.User">
        select * from mybatis.user
    </select>
    <select id="getUserById" parameterType="int" resultType="com.dai.pojo.User">
        select * from mybatis.user where id=#{id}
    </select>
    <insert id="addUser" parameterType="com.dai.pojo.User">
        insert into mybatis.user (id,name,pwd) values(#{id},#{name},#{pwd})
    </insert>
    <update id="updateUser" parameterType="com.dai.pojo.User">
        update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id}
    </update>
    <delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id=#{id}
    </delete>
</mapper>

测试方法:

public class UserMapperTest {
    @Test
    public void getUserList(){
        //第一步:获得SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //方式一:getMapper
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList=mapper.getUserList();

        for (User user : userList) {
            System.out.println(user);
        }
        //关闭SqlSession
        sqlSession.close();
    }
    @Test
    public void getUserById(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User userById = mapper.getUserById(1);
        System.out.println(userById);
        sqlSession.close();
    }
    @Test
    public void addUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.addUser(new User(4,"DD","1234456"));
        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void updateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.updateUser(new User(4,"赫赫","123456"));
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void deleteUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.deleteUser(4);
        sqlSession.commit();
        sqlSession.close();
    }
}
Map:

若实体类或表中参数过多,应该考虑使用map,可以减少参数传递

    int addUser2(HashMap<String, Object> map);
    //使用map
    <insert id="addUser2" parameterType="map">
        insert into mybatis.user (id,pwd) values(#{userId},#{passWord})
    </insert>
    @Test
    public void addUser2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap<String, Object> map = new HashMap<>();
        map.put("userId",5);
        map.put("passWord","123456");
        mapper.addUser2(map);
        sqlSession.commit();
        sqlSession.close();
    }
  • Map传递参数,直接在sql取出key即可
  • 对象传递参数,直接在sql中取出对象属性即可
  • 只有一个基本类型参数的情况下,可以直接在sql中取到,不需要标签声明
  • 多个参数使用Map或者注解
模糊查询:
  • 在java代码执行,传递通配符%
  • 在sql拼接使用通配符%
 List<User> getUserList2(String string);
 //模糊查询       
select * from mybatis.user where name like #{value}
List<User> userList2 = mapper.getUserList2("%A%");
配置解析:
核心配置文件:
  • mybatis.config.xml
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
环境配置:
  • 可以配置多个环境,但是只能选择一种
属性:
  • 可在典型java属性文件配置也可以通过子元素配置

  • 可以直接引入外部文件

  • 可以在其中增加一些属性配置

  • 如果同一个配置文件,优先外部配置

别名:
  • 可以给实体类起别名
    <typeAliases>
        <typeAlias type="com.dai.pojo.User" alias="user"/>
    </typeAliases>
  • 可以给包取别名,默认别名为这个类的类名
    <typeAliases>
        <package name="com.dai.pojo"/>
    </typeAliases>

如果实体类较少使用方式一,否则使用方式二

第一种可以DIY别名,第二种不行,若要改则需要在实体上增加注释

@Alias("Hello")
public class User{}
设置:

改变MyBatis的运行时行为

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

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

映射器:

方式一:使用resource文件注册绑定

<mapper resource="com/dai/dao/UserMapper.xml"/>

方式二:使用class文件绑定注册

<mapper class="com.dai.dao.UserMapper"/>
  • 接口和他的Mapper配置文件必须同名
  • 接口和他的Mapper配置文件必须在同一个包下

方式三:使用扫描包进行注入绑定

<package name="com.dai.dao"/>
  • 同方式二的注意点
生命周期和作用域:

错误使用会导致严重的并发问题

SqlSessionFactoryBuilder:

  • 局部变量
  • 创建SqlSessionFactory便不需要

SqlSessionFactory:

  • 数据库连接池
  • *没有理由丢弃或创造另一个实例
  • 应用作用域

SqlSession

  • 连接到连接池的请求
  • 是线程不安全的,应为请求或方法作用域
  • 需要及时关闭
ResultMap:
  • 属性与字段不同

方式一:使用resultMap

<resultMap id="UserMap" type="User">
    <!--column为数据库的字段,property为实体类的属性-->
    <result column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="pwd" property="password"/>
</resultMap>
<select id="getUserById" resultMap="UserMap">
    select * from mybatis.user where id=#{id}
</select>

方式二:sql语句取别名

<select id="getUserById" parameterType="int" resultType="user">
    select pwd as password from mybatis.user where id=#{id}
</select>
  • resultMap元素是Mybatis中最重要最强大的元素
  • ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了
  • 如果这个世界总是这么简单就好了
日志:

日志工厂:如果一个数据库操作,出现了异常,我们需要排错,日志就是好助手,需要在核心配置文件中配置

  • 标准日志工厂实现
<!--设置-->
<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

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

  • Log4j

可以控制日志信息输送的目的地是控制台,文件,GUI组件,并可以控制格式,可以通过配置文件配置

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</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/kuang.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
  • 配置log4j
<settings>
    <setting name="logImpl" value="LOG4J"/>
</settings>

log4j的使用

  • 在要使用的类中导入包import org.apache.log4j.Logger;
  • 日志对象static Logger logger=Logger.getLogger(UserMapperTest.class);
分页:
  • 接口

使用map因为有多个参数传递

List<User> getUserByLimit(HashMap<String ,Integer> map);
  • 接口xml
<select id="getUserByLimit" parameterType="map" resultMap="UserMap">
    select * from mybatis.user limit #{startIndex},#{pageSize}
</select>
  • 测试·
public void getUserByLimit(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    HashMap<String,Integer> map=new HashMap<>();
    map.put("startIndex",0);
    map.put("pageSize",2);
    List<User> userByLimit = mapper.getUserByLimit(map);
    for (User user : userByLimit) {
        System.out.println(user);
    }
    sqlSession.close();
}
  • 也可以使用Row Bounds实现分页
注解开发:

本质是反射,底层是代理模式

  • 注解在接口上实现
@Select("select * from mybatis.user")
List<User> getUserList();
  • 使用mapper绑定接口
<!--绑定接口-->
<mappers>
    <mapper class="com.dai.dao.UserMapper"/>
</mappers>
  • 测试
使用注解实现简单CRUD:
  • 自动提交事务
public static SqlSession getSqlSession(){
   return sqlSessionFactory.openSession(true);
}
  • 编写接口,并写注释
public interface UserMapper {
    @Select("select * from mybatis.user")
    List<User> getUserList();
    @Select("select * from mybatis.user where id=#{_id}")
    User getUserById(@Param("_id") int id);
    @Insert("insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd})")
    int addUser(User user);
    @Update("update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id}")
    int updateUser(User user);
    @Delete("delete from mybatis.user where id=#{iid}")//#{}中的一定和类型注解的一致
    int deleteUser(@Param("iid") int id);
}
  • 测试
@Test
public void getUserList(){
   SqlSession sqlSession = MybatisUtils.getSqlSession();
   UserMapper mapper = sqlSession.getMapper(UserMapper.class);

   List<User> userList = mapper.getUserList();
   for (User user : userList) {
       System.out.println(user);
   }//遍历
   User userById = mapper.getUserById(2);
   System.out.println(userById);//查询
   mapper.addUser(new User(7,"^^^","1234100"));//添加
   mapper.updateUser(new User(7,"&&&^^^","10230414"));//更新
   mapper.deleteUser(7);//删除
   sqlSession.close();//已经设置自动提交事务
}

关于@Param注解

  • 基本类型的参数或者String类型需要加上
  • 引用类型不用加
  • 如果只有一个基本类型可以不加,但还是建议加
  • 在SQL语句引用的就是@Param()中的属性值
Lombok:

Java插件,可以通过注解消除业务中繁琐的代码

步骤:

  • 在idea中安装Lombok插件
  • 在项目中导入Lombok的jar包(maven)
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version>
</dependency>

通过注解实现自动化代码:

  • @Data:无参构造,get,set,tostring…
  • @AllArgsConstructor:有参全部字段构造
  • @NoArgsConstructor:无参构造
  • @Getter
  • @ToString

尽量少用

快捷键更新:
  • 实现代码左对齐—>tab+shift

-------------sql连接,日志over

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值