MyBatis从零开始(二)

6、CRUD

1、namespace

namespace中的包名与接口名一致

2、select

  • id:就是对应的namespace中的对应的方法
  • resultType:sql语句的返回值
  • parameterType:参数类型

增删改必须提交事务!!!!!

a、接口

//查询全部用户
 List<User> getUserList();
 //根据id查询用户
 List<User> getUserById(int id);
//insert一个用户
 int addUser(User user);
 //修改用户
 int Update(User user);
 //删除用户
 int delete(int id);
}

b、在mapper里面写好sql

<select id="getUserList" resultType="com.hls.pojo.User">
     select * from name.info;
 </select>
 
 <select id="getUserById" parameterType="int" resultType="com.hls.pojo.User">
     select * from name.info where id = #{id};
 </select>
<insert id="addUser" parameterType="com.hls.pojo.User">
     insert into name.info (name,address,ago,birthday) values(#{name},#{address},#{ago},#{birthday});
 </insert>
 <update id="Update" parameterType="com.hls.pojo.User">
     update name.info set birthday = #{birthday} where id = #{id};
 </update>
 <delete id="delete" parameterType="int">
     delete from name.info where id = #{id};
 </delete>

c、测试

@Test
 public void test(){
     //第一步,获得SqlSession对象
     SqlSession sqlSession = MybatisUtil.getSqlSession();
     try{
         //执行SQl   方式一:getMapper
         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
         List<User> userList = mapper.getUserList();
         for (User user :
                 userList) {
             System.out.println(user);
         }

     }finally {
         //关闭SqlSession对象
         sqlSession.close();
     }
 }

 @Test
 public void test1(){
     SqlSession sqlSession = MybatisUtil.getSqlSession();

     UserMapper mapper = sqlSession.getMapper(UserMapper.class);

     List<User> userById = mapper.getUserById(1);

     System.out.println(userById);

     sqlSession.close();
 }


@Test
 public void AddUser(){
     SqlSession sqlSession = MybatisUtil.getSqlSession();
     UserMapper mapper = sqlSession.getMapper(UserMapper.class);
     Date date = new Date();
     User user = new User("hls123","13","gds",date.toString());
     mapper.addUser(user);
     //提交事物
     sqlSession.commit();
     //关闭连接
     sqlSession.close();
 }

 @Test
 public void Update(){
     SqlSession sqlSession = MybatisUtil.getSqlSession();
     UserMapper mapper = sqlSession.getMapper(UserMapper.class);
     Date date = new Date();
     User user = new User(1,"kakejekjrl","12222","\zonghsnashi",date.toString());
     mapper.Update(user);
     sqlSession.commit();
     sqlSession.close();
 }

 @Test
 public void delete(){
     SqlSession sqlSession = MybatisUtil.getSqlSession();
     UserMapper mapper = sqlSession.getMapper(UserMapper.class);
     mapper.delete(2);
     sqlSession.commit();
     sqlSession.close();
 }

3、update

提交事务 3 4 5 !!!!

4、insert

5、delete


6、Map

  • 接口:
User getUserByIdAndname(Map<String,Object> map);
  • xml
<select id="getUserByIdAndname" resultType="com.hls.pojo.User">
  select *from name.info where id =#{id} and name = #{name}
</select>
  • 测试类
@Test
public void selectMember(){
  SqlSession sqlSession = MybatisUtil.getSqlSession();
  UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  HashMap<String, Object> objectObjectHashMap = new HashMap<>();
  //通过mapper找到map的key然后匹配value
  objectObjectHashMap.put("id",1);
  objectObjectHashMap.put("name","huangl");
  User userByIdAndname = mapper.getUserByIdAndname(objectObjectHashMap);
  System.out.println(userByIdAndname);
  sqlSession.close();
}

  • Map传参在sql中传参即可

​ 在mapper中,会根据sql里面的字段选取对应的key来获取值,来进行判断

  • 多参数用Map或者注解连接

7、别名

在MyBatis-config.xml里面配置

 <!--别名-->
    <typeAliases >
        <!--单独设置某个别名-->
     
<!--        <typeAlias type="com.hls.pojo.User" alias="User"/>-->
        
        <!--对包进行扫描,批量设置,规则:首字母变为小写-->
        <package name="com.hls.pojo"/>
    </typeAliases>

但是好像有点乱,后来在mapper.xml使用的时候混乱了,清空了缓存后重启编译器解决问题

  • 注意:在mapper.xml里面使用的时候要注意,第二种定义别名的方法,扫描后,默认首字母小写
@Alias("user")  //注解别名
public void test(){
    ...
}

8、resultMap(属性名和字段名不一样的问题)

<!--
        resultMap 结果集
            左边是实体类的属性名称
            右边是表里面的列名称
    -->

    <resultMap id="huang" type="com.hls.pojo.User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="ago" column="ago"/>
        <result property="address" column="address"/>
        <result property="birthday" column="birthday"/>
    </resultMap>



<!--    不使用resultMap
        <select id="getUserList" resultType="com.hls.pojo.User">-->
<!--        select * from name.info;-->
<!--    </select>-->

    <select id="getUserList" resultMap="huang">
        select * from name.info;
    </select>

结果集:字段较多的时候可以使用结果集,方便管理无需与pojo对应属性名


9、模糊查询

  • sql
 <select id="getUserLike" resultType="com.hls.pojo.User">
        select * from info where name like "%"#{value}"%";
     user_name like concat('%',#{str},'%')
    </select>
  • 接口
  List<User> getUserLike(String value);
  • 测试类
  @Test
    public void testLike(){
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userLike = mapper.getUserLike("黄");//("%黄%") 也可以
        for (User temp :
                userLike) {
            System.out.println(temp.toString());
        }
    }

**防止sql注入,直接在xml里面加上通配符,虽然在测试类里面也可以,但是会有sql注入的风险 or 1=1 **


10、配置解析


1、核心配置文件

  • MyBatis-config.xml

    标签有顺序,不能够随意乱放,报错之后可以去看看是不是顺序问题


2、环境配置(environments)

+ MyBatis可以配置成适应多种环境

<!--核心配置-->
<configuration>
    
    <environments default="development">                <!--defalu-->
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/name?useSSL=false&amp;serverTimezone=UTC&amp;characterEncoding=UTF-8&amp;useUnicode=true"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
        
        <environment id="test">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/name?useSSL=false&amp;serverTimezone=UTC&amp;characterEncoding=UTF-8&amp;useUnicode=true"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!--每一个Mapper.xml文件都需要在MyBatis核心配置文件中注册-->
    <mappers>
        <mapper resource="com/hls/dao/UserMapper.xml"/>
    </mappers>
</configuration>
  • defalut:默认环境

    ​ 当环境里面有多个环境时,默认处填写哪一个环境配置,就使用该环境

    尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

  • transactionManager:事务管理器

    ​ 有两个,一个是JDBC(常用),另一个是MANAGED**(若是Spring+MyBatis就没有必要配置事务管理器)**

  • dataSource:数据源

    ​ 有三个,一个是UNPOOLED,第二个是POOLED(默认),第三个是JNDI


3、属性(properties)

  • 这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递{db.properties}


  • 优化配置环境时候的配置

    <!--引入外部配置文件-->
    <properties resource="db.properties">
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </properties>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <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>
  • db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/name?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8&useUnicode=true
username=root
password=123456
  • 外部文件优先级更高

11、映射器(mappers)

  • MapperRegistry:注册绑定我们的Mapper文件

resource、url、class

1、使用resource注册绑定

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

2、使用class注册绑定

<mappers>
        <mapper class="com.hls.dao.UserMapper"/>
    </mappers>
  • 使用class的注意点:
    • 接口和他的Mapper必须同名
    • 接口和他的Mapper必须在同一包下

3、使用package注册绑定

扫描包进行注入绑定

<mappers>
		<package name="com.hls.dao.UserMapper"/>
</mappers>
  • 和2的注意点相同

12、生命周期和作用域

1、执行过程:

在这里插入图片描述

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

2、SqlSessionFactoryBuilder:

  • 一旦创建了SQLSessionFactory对象,就不再需要它了
  • 局部变量

3、SqlSessionFactory:

  • 可以想象为:数据库连接池
  • 需要一直存在,没有理由丢弃或者重建,多次重建会被视为代码的坏味道(bad smell)
  • 全局变量
  • 最简单的就是使用单例模式或者静态单例模式

4、SqlSession:

  • 连接连接池的请求
  • 关闭请求
  • 最佳作用域是放在方法中
  • 用完之后赶紧关闭,否则资源被占用

5、连接模式

在这里插入图片描述

  • 一个Mapper代表一个业务

13、日志

1、日志工厂

出现错误,排错,可用日志

  • log4j
  • Stdout_logging
    • 标准日志输出
<!--    <settings>-->
<!--        <setting name="logImpl" value="STDOUT_LOGGING"/>-->
<!--    </settings>-->

MyBatis-config核心配置文件里面配置

2、log4j

1、导包(maven)

2、控制日志的输出格式、输出位置、等级

3、可以根据配置文件修改,不需要修改代码

4、写log4j.properties

  • 可以在主配置文件中设置(setting)在测试类里面导包,就可以用logger对象来记录日志

14、分页

1、Limit

select *
from info
limit 0,14;

limit startIndex , 每页显示的行数

limit 每页显示的行数 —> limit 0 , 每页显示的行数

2、MyBatis分页(SQL)

  • 接口

        List<User> getUserByLimit(Map<String,Integer> map);
    
  • Mapper.xml

    <select id="getUserByLimit" resultType="com.hls.pojo.User" parameterType="map">
            select * from info limit #{startIndex},#{pageSize};
        </select>
    
  • 测试

    @Test
        public void testLimit(){
            SqlSession sqlSession = MybatisUtil.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            HashMap<String,Integer> objectObjectHashMap = new HashMap<>();
            objectObjectHashMap.put("startIndex",0);
            objectObjectHashMap.put("pageSize",3);
            List<User> userByLimit = mapper.getUserByLimit(objectObjectHashMap);
            System.out.println(userByLimit);
            sqlSession.close();
        }
    

3、RowBound分页

new RowBound().var

在测试类里面sqlsession.selectList(“com.hls.dao.UserMapper.get…”,null,rowbound);

再用for循环增强型遍历输出

4、分页插件

MyBatis PageHelper

google

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值