欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mybatis传统DAO层开发和SqlMapConfig.xml配制文件

程序员文章站 2022-06-17 15:34:10
...

Mybatis传统DAO层开发

	使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方式和Mapper接口代理开发方式。而现在
	主流的开发方式是接口代理开发方式,这种方式总体上更加简便。

Mybatis实现DAO的传统开发方式

分析编写dao实现类Mybatis的执行过程:
Mybatis传统DAO层开发和SqlMapConfig.xml配制文件

(1)持久层Dao接口

public interface IUserDao {
    //查询所有的用户
    List<User> findAll();
    //保存方法
    void saveUser(User user);
    //更新方法
    void updateUser(User user);
    //删除方法,根据id删除用户
    void deleteUser(Integer userId);
    //查询方法,根据id进行查询用户信息
    User findById(Integer userId);
    //根据名称模糊查询用户信息
    List<User> findByName(String username);
    //查询总用户数
    int findTotal();
}

(2)持久层Dao实现类

public class UserDaoImpl implements IUserDao {
    private SqlSessionFactory factory;
    public UserDaoImpl(SqlSessionFactory factory){
        this.factory=factory;
    }
    //查询多条数据
    @Override
    public List<User> findAll() {
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用SqlSession中的方法,实现查询列表
        List<User> users = session.selectList("com.itheima.dao.IUserDao.findAll");
        //3.事务提交并释放资源
        session.commit();
        session.close();
        return users;
    }
    @Override
    public void saveUser(User user) {
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用SqlSession中的方法,实现查询列表
        session.insert("com.itheima.dao.IUserDao.saveUser",user);
        //3.提交事务并释放资源
        session.commit();
        session.close();
    }
    @Override
    public void updateUser(User user) {
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用SqlSession中的方法,实现更新操作
        session.update("com.itheima.dao.IUserDao.updateUser",user);
        //3.提交事务并释放资源
        session.commit();
        session.close();
    }
    @Override
    public void deleteUser(Integer userId) {
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用SqlSession中的方法,实现更新操作
        session.delete("com.itheima.dao.IUserDao.deleteUser",userId);
        //3.提交事务并释放资源
        session.commit();
        session.close();
    }
    //查询单条数据
    @Override
    public User findById(Integer userId) {
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用SqlSession中的方法,实现更新操作
        User user = session.selectOne("com.itheima.dao.IUserDao.findById", userId);
        //3.释放资源
        session.close();
        return user;
    }
    @Override
    public List<User> findByName(String username) {
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用SqlSession中的方法,实现更新操作
        List<User> user = session.selectList("com.itheima.dao.IUserDao.findByName",username);
        //3.释放资源
        session.close();
        return user;
    }
    @Override
    public int findTotal() {
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用SqlSession中的方法,实现更新操作
        Integer count = session.selectOne("com.itheima.dao.IUserDao.findTotal");
        //3.释放资源
        session.close();
        return count ;
    }
}

(3)持久层映射配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.itheima.dao.IUserDao">
    <!--查询所有-->
    <select id="findAll" resultType="com.itheima.domain.User">
        select * from user;
    </select>

    <!--保存用户-->
    <insert id="saveUser" parameterType="com.itheima.domain.User">

        insert into user(username,address,sex,birthday)values (#{username},#{address},#{sex},#{birthday});
    </insert>

    <!--更新用户-->
    <update id="updateUser" parameterType="com.itheima.domain.User">
        update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};
    </update>

    <!--删除用户-->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{uid}
    </delete>

    <!--查询用户-->
    <!--这里需要一个返回值类型,因此得写上resultType-->
    <select id="findById" parameterType="java.lang.Integer" resultType="com.itheima.domain.User">
        select * from user where id=#{uid}
    </select>

    <!--根据名称模糊查询-->
    <select id="findByName" parameterType="java.lang.String" resultType="com.itheima.domain.User">
        <!--select * from user where username like #{name}-->
        select * from user where username like '%${value}%'
    </select>

    <!--获取用户的总记录条数-->
    <select id="findTotal" resultType="int">
        select count(id) from user;
    </select>
</mapper>

(4)测试类

public class MybatisTest {
    private InputStream resourceAsStream;
    private SqlSession sqlSession;
    private IUserDao userDao;
    @Before
    public void init() throws IOException {
        //读取配制文件,生成字节输入流
        resourceAsStream = Resources.getResourceAsStream("SqlMapperConfig.xml");
        //获取SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //使用工厂对象,创建dao对象
        userDao = new UserDaoImpl(factory);
    }
    @After
    public void destory() throws IOException {
        //释放资源
        resourceAsStream.close();
    }

    //测试查询所有
    @Test
    public void testFindAll() throws IOException {
        //执行查询所有方法
        List<User> users = userDao.findAll();
        for (User user : users) {
            System.out.println(user);
        }
    }

    //测试保存操作
    @Test
    public void testSave(){
        User user = new User();
        user.setUsername("dao impl user");
        user.setAddress("西安");
        user.setSex("男");
        user.setBirthday(new Date());
        System.out.println("保存之前:"+user);
        //执行保存方法
        userDao.saveUser(user);
        System.out.println("保存之后:"+user);
    }

    //测试更新操作
    @Test
    public void testUpdate(){
        User user = new User();
        user.setId(41);
        user.setUsername("dao impl 更新 ");
        user.setAddress("渭南");
        user.setSex("男");
        user.setBirthday(new Date());
        //执行更新操作
        userDao.updateUser(user);
        System.out.println(user);
    }

    //测试删除操作
    @Test
    public void testDelete(){
        //执行删除方法
        userDao.deleteUser(53);
    }

    //测试查询方法
    @Test
    public void testFindOne(){
        //执行查询方法
        User user = userDao.findById(41);
        System.out.println(user);
    }

    //测试模糊查询操作
    @Test
    public void testFindByName(){
        //执行查询方法
        List<User> users = userDao.findByName("%杨%");
        for (User user : users) {
            System.out.println(user);
        }
    }

    //测试查询总记录条数
    @Test
    public void testFindTotal(){
        //执行查询总记录条数的方法
        int count = userDao.findTotal();
        System.out.println(count);
    }
}

SqlMapConfig.xml配制文件

(1)配置内容

SqlMapConfig.xml中配置的内容和顺序

properties(属性)
	property
settings(全局配置参数)
	setting
typeAliases(类型别名)
	typeAliase
	package
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
	environment(环境子属性对象)
		transactionManager(事务管理)
		dataSource(数据源)
mappers(映射器)
	mapper
	package

(2)properties属性

在使用properties标签配置时,我们可以采用两种方式指定属性配置。

第一种

<properties>
     <property name="driver" value="com.mysql.jdbc.Driver"></property>
     <property name="url" value="jdbc:mysql://localhost:3306/database1"></property>
     <property name="username" value="root"></property>
     <property name="password" value="1234"></property>
</properties>

第二种

在classpath下定义jdbcConfig.properties文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/database1
jdbc.username=root
jdbc.password=1234

properties标签配置

<!--配置properties标签
    可以在标签内部配置连接数据库的信息。也可以通过属性引用外部配置文件信息
    resource属性:常用的一个属性
        用于指定配制文件的位置,是按照类路径的写法来写的,并且必须存在于类路径下。
    url属性:
        是要求按照url的写法来写地址
        URL:Uniform Resource Locator 统一资源定位符。它是可以唯一标识一个资源的位置。
        它的写法:
            http://localhost:8080/mybatisserver/demo1Servlet
            协议       主机    端口        URI
        URI:Uniform Resource Identifier 统一资源标识符,它是在应用中可以唯一定位一个资源的标识符
-->
<properties url="file:///C:/Users/ASUS/Desktop/jdbcConfig.properties">
    <!--<property name="driver" value="com.mysql.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql://localhost:3306/database1"></property>
    <property name="username" value="root"></property>
    <property name="password" value="1234"></property>-->
</properties>

此时我们的dataSource标签就变成了引用上面的配置

<dataSource type="POOLED">
     <property name="driver" value="${jdbc.driver}"></property>
     <property name="url" value="${jdbc.url}"></property>
     <property name="username" value="${jdbc.username}"></property>
     <property name="password" value="${jdbc.password}"></property>
</dataSource>

(3)typeAliases(类型别名)

之前我们说Mybatis支持的默认别名,我们也可以采用自定义别名方式来开发。

自定义别名

<typeAliases>
    <!--typeAlias用于配置别名,type属性指定的是实体类全限定类名,alias属性指定别名,当指定了别名再区分大小写-->
    <typeAlias type="com.itheima.domain.User" alias="user"></typeAlias>
    <!--用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写。-->
    <package name="com.itheima.domain"></package>
</typeAliases>

mappers(映射器)

mapper resource=" "/

<mapper resource="com/itheima/dao/IUserDao.xml"></mapper>

mapper class=" "/

使用 mapper 接口类路径
如:<mapper class="com.itheima.dao.UserDao"/>
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。

package name=" "/

注册指定包下的所有mapper接口
<package name="com.itheima.dao"></package>la
package标签是用于指定dao接口所在的包,当指定了之后就不需要再写mapper以及resource或者class了。
注意:这种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。