MyBatis——xml的优化及动态代理的实现

目录

一,MyBatis框架常见类和接口

1,Resources类

2,SqlSessionFactory接口:创建工厂

3,SqlSession接口:获取sqlSession

二,为实体类注册别名(优化SqlMapConfig.xml)

使用 typeAliases 标签,进行对pojo实体类的注册别名

1,单个注册

2,批量注册

三,设置日志输出

四,动态代理存在意义:

MyBatis动态代理的7个行为规范 

五,动态代理的实现

1,创建数据库

2,完善maven工程目录,刷新可视化

3,修改pom.xml文件,添加依赖

4,添加jdbc.properties数据库配置文件到resources目录文件

5,新建并配置SqlMapConfig.xml文件

6,添加实体类pojo

7,添加mapper.xml的文件夹,新建与mapper.xml的namespace对应的接口,放在同一文件夹下

8,新建UserMapper.xml文件,完成增删改查功能

9,添加测试功能。

六,mapper注册优化

单个注册

批量注册:

七,#{} 和 ${}的区别

一),#{}:

二), ${}:


一,MyBatis框架常见类和接口

1,Resources类

解析SqlMapConfig.xml核心文件,将解析的文件保存在IO输入流中;

        //1,使用文件流,读取核心配置文件SqlMapConfig.xml
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");

2,SqlSessionFactory接口:创建工厂

        //2,创建sqlSessionFactory,bean工厂
        SqlSessionFactory factory = new  SqlSessionFactoryBuilder().build(in);

3,SqlSession接口:获取sqlSession

        //3,获取sqlSession
        SqlSession sqlSession = factory.openSession();

二,为实体类注册别名(优化SqlMapConfig.xml)

使用 typeAliases 标签,进行对pojo实体类的注册别名

1,单个注册

     <typeAliases>
        <!--   单个注册     -->
        <typeAlias type="com.pojo.Stu" alias="stu"></typeAlias>
    </typeAliases>

2,批量注册

    <typeAliases>
        <!--   批量注册别名:起的别名是类名的驼峰命名法     -->
        <package name="com.pojo"/>
    </typeAliases>

三,设置日志输出

    <!--  设置日志输出底层执行代码  -->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

设置完底层代码输出的后的打印的日志

四,动态代理存在意义:

在三层架构中,业务逻辑层要通过接口来实现数据库的访问,动态代理可以实现

MyBatis动态代理的7个行为规范 

1,UsersMapper.xml与UsersMapper.java的接口必须同一个目录下。

2,UsersMapper.xml与UsersMapper.java的文件名一致,后缀不管。

3,UsersMapper.xml文件中的标签的id值 与 UsersMapper.java的接口中的方法名称保持一致。(接口中的方法与id一致,就可以通过接口的名称找到对应的id)

4,UsersMapper.xml文件中的parameterType()标签中的参数类型 与 UserMapper.java接口中的参数类型完全一致

5,UsersMapper.xml文件中的resultType()标签中的值类型 与 UserMapper.java接口中的返回值的类型完全一致

6,UsersMapper.xml文件中的 nameSpace 标签中的值类型 与 UserMapper.java接口的完全限定名(即从当前java.main路劲触发的全路径名)。如:com.yyk.UserMapper.java

7,在SqlMapConfig.xml文件中注册mapper文件时,使用class= UserMapper.java接口的完全限定名。

五,动态代理的实现

1,创建数据库

use ssm;
create table if not EXISTS USER(
	id int(11) not null auto_increment,
	username VARCHAR(32) COMMENT '用户名',
	birthday date DEFAULT null COMMENT '生日',
	sex char(2) DEFAULT null COMMENT '性别',
	address VARCHAR(256) DEFAULT NULL COMMENT '地址',
	PRIMARY KEY (id)
);

INSERT into USER(username,birthday,sex,address) VALUES('张三','2000-01-08','1','陕西');
INSERT into USER(username,birthday,sex,address) VALUES('李飒','2001-02-02','2','北京');
INSERT into USER(username,birthday,sex,address) VALUES('王五','2000-4-06','1','南京');
INSERT into USER(username,birthday,sex,address) VALUES('老六','2000-08-09','1','上海');
INSERT into USER(username,birthday,sex,address) VALUES('钱七','1999-03-01','2','广州');
INSERT into USER(username,birthday,sex,address) VALUES('王三','1990-12-12','1','深圳');
INSERT into USER(username,birthday,sex,address) VALUES('李八','1999-12-02','1','深圳');
INSERT into USER(username,birthday,sex,address) VALUES('王七','1999-02-12','1','深圳');

SELECT * FROM User;

2,完善maven工程目录,刷新可视化

 

3,修改pom.xml文件,添加依赖

    <!--添加mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>
    <!--添加mysql依赖-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.32</version>
    </dependency>
<build>
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
          <include>**/*.properties</include>
        </includes>
      </resource>

      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.xml</include>
          <include>**/*.properties</include>
        </includes>
      </resource>
    </resources>
  </build>

4,添加jdbc.properties数据库配置文件到resources目录文件

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.username=root
jdbc.password=123456

5,新建并配置SqlMapConfig.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">
<configuration>
    <!--读取jdbc.properties文件-->
    <properties resource="jdbc.properties"></properties>
    <!--设置日志输出-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--注册实体类的别名-->
    <typeAliases>
        <package name="com.mybatis.pojo"/>
    </typeAliases>
    <!--配置环境变量-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <!--
                    private String driver;
                    private String url;
                    private String username;
                    private String password;
                -->
                <property name="driver" value="${jdbc.driverClassName}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--注册mapper.xml文件-->
    <mappers>
        <mapper class="com.mybatis.mapper.UserMapper"></mapper>
    </mappers>
</configuration>

6,添加实体类pojo

public class User {
    private Integer id;
    private String userName;
    private Date birthday;
    private String sex;
    private String address;

7,添加mapper.xml的文件夹,新建与mapper.xml的namespace对应的接口,放在同一文件夹下

<mapper namespace="com.mybatis.mapper.UserMapper">

 

遵循动态代理的规范

8,新建UserMapper.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">
<mapper namespace="com.mybatis.mapper.UserMapper">
    <!--
        //查询全部功能
        List<User> getAll();
        id与接口中的方法名一致
    -->
    <select id="getAll" resultType="user">
        select id,username,birthday,sex,address
        from user;
    </select>

    <!--
        //按ID查询
        User getID(int id);
    -->
    <select id="getID" parameterType="int" resultType="user">
        select id,username,birthday,sex,address
        from user
        where id = #{id};
    </select>

    <!--
        //按name模糊查询
        List<User> getByName(String name);
    -->
    <select id="getByName" parameterType="string" resultType="user">
        select id,username,birthday,sex,address
        from user
        where username like '%${name}%';
    </select>


    <!--
        //更新
        void update(User user);
    -->
    <update id="update" parameterType="user">
        update user set username = #{userName},birthday = #{birthday},
        sex = #{sex},address = #{address} where id = #{id};
    </update>

    <!--
        //添加
    void insert(User user);
    -->
    <insert id="insert" parameterType="user" >
        insert into user (username,birthday,sex,address) values (#{userName},#{birthday},#{sex},#{address});
    </insert>

    <!--
        //删除
        void delete(int id);
    -->
    <delete id="delete" parameterType="int">
        delete from user where id = #{id};
    </delete>

</mapper>

9,添加测试功能。

package com.mybatis;

import com.mybatis.mapper.UserMapper;
import com.mybatis.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

public class MyTest {
    //数据连接对象
    SqlSession sqlSession;
    //接口代理对象
    UserMapper userMapper;
    //设置日期转换
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    @Before
    public void before() throws IOException {
        //1,加载SQlMapConfig核心配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2,创建SQlSessionFactory()
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3,获取sqlSession
        sqlSession = factory.openSession();

        //4,取出动态代理的对象,
        // 完成接口中方法的调用,实则是调用xml文件中向对应的标签的功能
        //标签的id对应的是接口中的方法名,这是mybatis的动态代理规范。
        userMapper = sqlSession.getMapper(UserMapper.class);
        System.out.println("代理对象的类型"+userMapper.getClass());
    }
    @After
    public void close(){
        //5,释放资源
        sqlSession.close();
    }

    @Test
    public  void testGetAll(){
        //5,执行sql
        List<User> users = userMapper.getAll();
        users.forEach(user -> System.out.println(user));
    }

    @Test
    public void testGetID(){
        User user = userMapper.getID(2);
        System.out.println(user);
    }

    //有问题
    @Test
    public void testGetByName(){
        List<User> users = userMapper.getByName("j");
        users.forEach(user -> System.out.println(user));
    }

    @Test
    public void testInsert() throws ParseException {
        int insert = userMapper.insert(new User("jj", format.parse("2000-01-03"), "1", "安徽"));
        sqlSession.commit();
        System.out.println("************" + insert + "***********");
    }

    @Test
    public void testUpdate() throws ParseException {
        User user = new User(1,"一二",format.parse("2012-03-08"),"1","BJ");
        userMapper.update(user);
        sqlSession.commit();
    }

    @Test
    public void testDelete(){
        userMapper.delete(1);
        sqlSession.commit();
    }
}

六,mapper注册优化

单个注册

<!--注册mapper.xml文件-->
    <mappers>
        <!--单个注册-->
        <mapper class="com.mybatis.mapper.UserMapper"></mapper>
    </mappers>

批量注册:

<!--注册mapper.xml文件-->
    <mappers>
        <!--单个注册-->
<!--        <mapper class="com.mybatis.mapper.UserMapper"></mapper>-->
        <package name="com.mybatis.mapper"/>
    </mappers>

七,#{} 和 ${}的区别

一),#{}:

是对非字符串拼接的占位符,{}中可以任意写,但是如果占位符是对象类型,则{}内必须是对象的属性名称,使用#{}是安全的,可以防止sql注入

#{}底层使用的PrepareStatement,防止安全注入

1,#{}内的内容主要是看parameterType(...)的类型,如果是基本数据类型或String类,则#{}内随便写。

因为:

 

 

2,#{}如果传入的是对象类型,则需要传入成员变量的名称,而且区分大小写

 

二), ${}:

90%进行的字符串拼接或字符串替换。如果传入的基本数据类型,${}里面必须是value,如果是对象类型,则传入对象名称。${}可以替换列名或列表,存在sql注入问题

${}类型看  parameterType() 的内容

1,${}内的内容主要是看parameterType(...)的类型,如果是基本数据类型或String类,则${}内随便写。

2,${}如果传入的是对象类型,则需要传入成员变量的名称,而且区分大小写

优化模糊查询,以后都采用这种方式,解决sql注入

<select id="getByName" parameterType="string" resultType="user">
        select id,username,birthday,sex,address
        from user
--         where username like '%${name}%';
        where username like concat('%',#{name},'%');
    </select>

3,字串替换

使用${}来替换查询的列名

    //按指定参数模糊查询
    List<User> getByPara(@Param("columnName") String columnName, @Param("columnValue") String columnValue);

 如果方法在参数个数  大于1个  mapper.xml文件中的parameterType参数类型不写

    <select id="getByPara" resultType="user">
        select id,username,birthday,sex,address
        from user
        where ${columnName} like concat('%',#{columnValue},'%');
    </select>
   public void testGetByPara(){
        List<User> users = userMapper.getByPara("id", "2");
        users.forEach((user -> System.out.println(user)));
    }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值