mybatis学习(1)

使用maven导入mybatis的依赖

<dependency>  
    <groupId>org.mybatis</groupId>  
    <artifactId>mybatis</artifactId>  
    <version>3.5.4</version>
</dependency>

 

在src/main/resource下创建 mybatis 的配置文件

<?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="jdbc.properties"></properties>
    <settings>
        <!-- 开启日志 -->
        <setting name="logImpl" value="LOG4J"></setting>
<!--         <setting name="logImpl" value="STDOUT_LOGGING"></setting> -->
    </settings>   
    <!-- 配置mybatis的环境 -->
    <environments default="mysql">
        <!-- 针对mysql环境的具体的配置 -->
        <environment id="mysql">
            <!-- 使用jdbc事务管理方式 -->
            <transactionManager type="JDBC"/>
            <!-- 使用连接池的方式配置数据源 -->
            <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>
        </environment>
    </environments>
    <!-- 引入接口映射文件 -->
    <mappers>
        <mapper resource="accountMapper.xml"/>
    </mappers>
</configuration>

创建一个用于测试的接口类

public interface IMybatis {
    List<Account> findAll();
    Account selectById(Integer uid);
    int update(Account acc);
    int addAccount(Account acc);
    int delById(Integer uid);
    List<Account> findByName(String uname);
    List<Account> findByName2(String uname);
    int findTotal();
    List<ResultUA> selectUa();
}

 

然后创建 mapper 文件,在namespace里面写上对应的接口类

<?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">
<!-- namespace的值为接口的全路径名 -->
<mapper namespace="pers.lyh.mybatis.IMybatis">
    <!-- 查询的话使用select标签,
        id表示接口中对应的方法名,
        resultType表示结果的类型,
        parameterType表示参数的类型 -->
    <select id="findAll" resultType="pers.lyh.pojo.Account">
        SELECT * FROM s 
    </select>
    <select id="selectById" resultType="pers.lyh.pojo.Account" parameterType="int">
        SELECT * FROM s WHERE UID=#{uid}
    </select>
    <!-- 添加使用insert标签 -->
     <insert id="addAccount" parameterType="pers.lyh.pojo.Account">
        <!--
             配置保存时获取插入的 id,
            新增用户后,同时还要返回当前新增用户的 id 值,
            因为 id 是由数据库的自动增长来实现的,
            所以就相当于我们要在新增后将自动增长 auto_increment 的值返回。
         -->
        <selectKey keyColumn="uid" keyProperty="uid" resultType="int">
            select last_insert_id();
        </selectKey>
        INSERT INTO s values(#{uid},#{uname},#{money}) 
     </insert>
     <!-- 更新使用update标签 -->
     <update id="update" parameterType="pers.lyh.pojo.Account">
         update s set uname=#{uname},money=#{money} where uid=#{uid}
     </update>
     <!-- 删除 使用delete标签-->
     <delete id="delById" parameterType="int">
         delete from s where uid=#{uid}         
     </delete>
     <!-- 模糊查询 -->
     <!--  #{} 和 ${} 的区别:
     *  #{} 表示一个占位符号 通过#{}可以实现 preparedStatement 向占位符中设置值,
     *  自动进行 java 类型和 jdbc类型转换,#{}可以有效防止 sql 注入。 #{}可以接收简
     *  单类型值或 pojo 属性值。 如果 parameterType传输单个简单类型值,#{}括号中可
     *  以是 value 或其它名称。 ${} 表示拼接 sql 串通过${}可以将 parameterType传
     *  入的内容拼接在 sql中且不进行 jdbc 类型转换, ${}可以接收简 单类型值或 pojo 属
     *  性值,如果 parameterType传输单个简单类型值,${}括号中只能是 value。
     *  -->
     <select id="findByName" resultType="pers.lyh.pojo.Account" parameterType="String">
         select * from s where uname like #{uname}
     </select>
     <select id="findByName2" resultType="pers.lyh.pojo.Account" parameterType="String">
         select * from s where uname like '%${value}%'
     </select>
     <!-- 查询总记录数 -->
    <select id="findTotal" resultType="int">
        select count(0) from s;
    </select>
     <!-- 使用resultMap来封装数据 -->
     <resultMap type="pers.lyh.vo.ResultUA" id="ua">
     <!-- <id column="" property="" /> 对应主键 ,<result>对应其他的列(属性) -->
        <result column="uname" property="uname" />
        <result column="upwd" property="upwd" />
        <result column="money" property="money" />
     </resultMap>
     <!-- 多表联查 -->
     <select id="selectUa" resultMap="ua">
     SELECT s.uname, upwd ,money FROM s, s_user WHERE s.uid=s_user.`uid`
     </select>
</mapper>

 

创建测试类进行测试

 

public class MybatisTest {

    IMybatis mapper;
    InputStream stream;
    SqlSession openSession;

    @Before
    public void befor() throws IOException {
        // 1.读取SQLMapper.xml文件资源内容
        stream = Resources.getResourceAsStream("mybatis-config.xml");
        // 2.创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        // 3.创建SQLSessionFactory
        SqlSessionFactory sessionFactory = builder.build(stream);
        // 4.打开sessionFactory, openSession(true)中的参数是是否打开自动提交,如果没有设置自动提交,就需要手动提交
        openSession = sessionFactory.openSession(true);
        // openSession.commit(); //手动提交方法commit
        // 5.通过动态代理的方式直接获取接口
        mapper = openSession.getMapper(IMybatis.class);
    }

    // 6.执行方法
    /**
     * 测试查找所有方法
     */
    @Test
    public void findAllTest() {
        List<Account> list = mapper.findAll();
        for (Account account : list)
            System.out.println(account.toString());
    }

    /**
     * 测试添加方法
     */
    @Test
    public void addTest() {
        Account acc = new Account(3, "Peter", 1000.0);
        int result = mapper.addAccount(acc);
        System.out.println(result + " --- " + acc.getUid());
    }

    /**
     * 测试单一查找方法
     */
    @Test
    public void selectTest() {
        Account account = mapper.selectById(3);
        System.out.println(account.toString());
    }

    /**
     * 测试修改方法
     */
    @Test
    public void updateTest() {
        Account account = mapper.selectById(1);
        System.out.println(account.toString());
        account.setUname("Lemon");
        account.setMoney(2000.0);
        mapper.update(account);
        System.out.println(account.toString());
    }

    /**
     * 删除测试
     */
    @Test
    public void delTest() {
        mapper.addAccount(new Account(5, "test", 1.0));
        Account acc = mapper.selectById(5);
        System.out.println(acc == null ? "添加失败" : "添加成功");
        mapper.delById(5);
        System.out.println(mapper.selectById(5) == null ? "删除成功" : "删除失败");
    }

    /**
     * 模糊查询测试
     */
    @Test
    public void findTest() {
        List<Account> list = mapper.findByName("%t%");
        for (Account account : list) {
            System.out.println(account.toString());
        }
    }

    @Test
    public void findTest2() {
        List<Account> list = mapper.findByName2("t");
        for (Account account : list) {
            System.out.println(account.toString());
        }
    }
    
    @Test
    public void countTest() {
        System.out.println(mapper.findTotal());
    }
    
    @Test
    public void selectUaTest() {
        List<ResultUA> list = mapper.selectUa();
        for (ResultUA resultUA : list) {
            System.out.println(resultUA.toString());
        }
        
    }

    // 7.释放资源
    @After
    public void after() throws IOException {
        openSession.close();
        stream.close();
    }

}

 

posted @ 2020-03-03 17:55  寒江夜钓人  阅读(133)  评论(0)    收藏  举报