Mybatis学习[02]:【Mapper代理、CRUD、参数及配置文件的说明】

281 阅读4分钟

内容

1.Mybatis框架的Mapper代理模式
2.Mybatis完成CRUD操作
3.Mybatis中参数说明
4.Mybatis配置文件说明

Mybatis的Mapper代理模式

Mapper代理模式

 含义:

 开发人员在遵循Mybatis提供的一些规范的前提下,Mybatis帮助我门自动生成dao接口的实现类。

 规范:

 1.映射文件中命名空间等于dao层接口的全路径。
 2.映射文件中SQL语句的id是dao层接口的方法名。
 3.映射文件中输入参数和输出参数的类型和dao层接口里的方法的参数和返回结果保持一致。

 项目结构:

Mybatis完成CRUD操作

 1.全局配置文件mybatis-config.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>
    <properties resource="db.properties">
    </properties>
    <typeAliases>
        <package name="com.mybatis03.bean"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <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>
    <mappers>
        <mapper resource="com/mybatis03/bean/UserMapper.xml"/>
    </mappers>
</configuration>

 2.映射文件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.mybatis03.dao.UserDao">
    <!--    根据Id查询用户,返回值写User-->
    <select id="selectUser" parameterType="int" resultType="User">
        select *
        from user
        where id = #{id}
    </select>
    <!--查询所有用户,返回值类型写List的泛型User-->
    <select id="selectAll" resultType="User">
        select *
        from user
    </select>
    <!--根据姓名模糊查询-->
    <select id="selectUserByName" parameterType="User"
            resultType="User">
        select *
        from user
        where username like CONCAT('%', #{username}, '%');
    </select>
    <!--插入数据-->
    <insert id="addUser" parameterType="User">
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
            select 1548975
        </selectKey>
        insert into user values (null,#{username},#{birthday},#{sex},#{address})
    </insert>
    <!--修改数据-->
    <update id="changeUser" parameterType="User">
        update user
        set username=#{username},
            sex=#{sex}
        where id = #{id}
    </update>
    <!--删除数据-->
    <delete id="delUser" parameterType="int">
        delete
        from user
        where id = #{id};
    </delete>

 3.创建dao层接口UserDao

public interface UserDao {

   //根据Id查询用户,返回值写User
    User selectUser(int id);
    
   //查询所有用户,返回值类型写List的泛型User
    List<User> selectAll();
    
   //根据姓名模糊查询
    List<User> selectUserByName(User user);
    
   //插入数据
    int addUser(User user);
    
   //修改数据
    int changeUser(User user);
    
   //删除数据
    int delUser(int id);
   
}

 4.创建UserTest测试类

  1.创建加载配置文件和生成接口实现类的方法:

public class UserTest {
    SqlSession sqlSession;
    UserDao ud;
    //创建加载配置文件的和生成接口实现类的方法
    @Before
    public void setUp() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        sqlSession = sqlSessionFactory.openSession();
        ud = sqlSession.getMapper(UserDao.class);
    }
    
}

  2.创建提交事务和关闭SqlSession的方法:

@After
    public void finish() {
        sqlSession.commit();
        sqlSession.close();
    }

  3.开始编写接口测试方法:

   //查询一个
    @Test
    public void selectOne() {
        User user = ud.selectUser(1);
        System.out.println(user);
    }

    //查询所有
    @Test
    public void selectAll() {
        List<User> users = ud.selectAll();
        System.out.println(users);
    }

    //添加用户
    @Test
    public void addUser() {
        User user = new User();
        user.setUsername("王小明");
        user.setSex("男");
        user.setBirthday(new Date());
        user.setAddress("河南");
        System.out.println("插入前:" + user.getId());
        int i = ud.addUser(user);
        sqlSession.commit();//提交事务
        System.out.println("插入后:" + user.getId());
        System.out.println(i);
    }

    //修改用户
    @Test
    public void changeUser() {
        User user = new User();
        user.setId(21);
        user.setUsername("小樱");
        user.setSex("女");
        user.setBirthday(new Date());
        user.setAddress("河南");
        int i = ud.changeUser(user);
        sqlSession.commit();
        System.out.println(i);
    }

    //删除用户
    @Test
    public void delUser() {
        int i = ud.delUser(22);
        sqlSession.commit();
        System.out.println(i);
    }

    //模糊查询
    @Test
    public void selectUserByName() {
        User user = new User();
        user.setUsername("阿");
        List<User> users = ud.selectUserByName(user);
        sqlSession.commit();
        System.out.println(users);
    }

Mybatis中参数说明:

 1.两个参数详解:

  1.parameterType:输入参数类型(int,String,对象,List,Map等)

   注意:

1.#{}等价于占位符‘?’:
输入参数是非自定义类型:#{任意定义},
输入参数是自定义类型:#{自定义类型的属性名}。  
2.${}等价于拼接方式:
输入参数是非自定义类型(String除外):${任意定义},
输入参数是自定义类型:${自定义类型的属性名},
String类型作为输入参数:${value}

  2.resultType:返回结果类型(int,String,对象,List,map)

 2.输入多个参数

   首先准备好:创建UserDao接口和UserMapper.xml

  1.多个参数封装到一个对象里:

public List<User> getByNameAndSex(User user);
	<!-- 方法一:根据用户的姓名模糊查询并且根据用户的性别精确查询,${}是拼接字符串 -->
	<select id="getByNameAndSex" parameterType="com.mybatis03.bean.User" resultType="com.mybatis03.bean.User">
	   select * from user where username like "%"#{username}"%" and sex=#{sex}
	</select>

  2.多个参数封装到一个Map里:

public List<User> getByNameAndSexbak(Map map);
	<!-- 方法二:将用户的姓名和性别封装map里 -->
	<select id="getByNameAndSexbak" parameterType="map" resultType="com.mybatis03.bean.User">
	   select * from user where username like "%"#{uname}"%" and sex=#{usex}
	</select>

  3.将多个参数通过注解的方式传到xml中 @Param("变量a")----#{变量a}:

public List<User> getByNameAndSexbak1(@Param("username") String uname,@Param("usex")String sex);
	<!-- 方法三:接口中的方法里有多个参数,通过注解传递 -->
	<select id="getByNameAndSexbak1"  resultType="com.mybatis03.bean.User">
	   select * from user where username like "%"#{username}"%" and sex=#{usex}
	</select>

 3.查询最新插入数据的主键

  1.UserMapper.xml代码如下:

    <!--插入数据,查询最新插入数据的主键-->
    <insert id="addUser" parameterType="User">
        <!-- keyProperty:主键对应的属性名
             keyColumn:主键对应的列名
             resultType:主键的类型
             order="AFTER":主键在插入之后生成
             1548975:查询主键的函数
           -->
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
            select 1548975
        </selectKey>
        insert into user values (null,#{username},#{birthday},#{sex},#{address})
    </insert>

将查询到的主键赋值到输入参数对象User的主键属性(id)

  2.UserDao接口代码:

int addUser(User user);

  3.UserTest测试类:

 @Test
    public void addUser() {
        User user = new User();
        user.setUsername("王小明");
        user.setSex("男");
        user.setBirthday(new Date());
        user.setAddress("北京");
        System.out.println("插入前:" + user.getId());
        int i = ud.addUser(user);
        sqlSession.commit();//提交事务
        System.out.println("插入后:" + user.getId());
        System.out.println(i);
    }

Mybatis配置文件说明

1.配置文件中所有标签是有序的

2.数据源环境

<!--environments:数据库环境配置的详细配置-->
    <environments default="development">
<!--environment:数据库环境配置的详细配置-->
        <environment id="development">
<!--transactionManager:指定MyBatis的事务管理器-->
            <transactionManager type="JDBC"/>
<!-- dataSource:指连接源配置,POOLED是JDBC连接对象的数据源连接池的实现-->
            <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>

3.Mappers:管理映射文件(4种)

<!--映射文件  -->
	<mappers>
	    <!-- 单个管理映射文件 -->
		<!-- <mapper resource="com/mybatis03/bean/UserMapper.xml"/> -->
		<!-- 批量管理映射文件,name:映射文件所在的包名(保证映射文件和接口同包同名) -->
		<!-- <package name="com.mybatis03.dao"/> -->
		<!--(保证映射文件和接口同包同名) -->
		<!-- <mapper class="com.mybatis03.dao.UserDao"/> -->
		<mapper url="file:///D:\mybatis03\src\com\mybatis03\dao\UserDao.xml"/>
	</mappers>

4.properties:引入外部的properties文件

    <properties resource="db.properties">
    </properties>

5.typeAliases:为映射文件中输入输出类型指定别名

<typeAliases>
       <!-- 为映射文件中的输入输出类型,进行单个起别名 -->
       <!-- <typeAlias type="com.offcn.mybatis03.User" alias="u"/> -->
       <!-- 批量起别名,name:实体类所在的包名user/User  -->
       <package name="com.mybatis03.bean"/>
    </typeAliases>