mybatis基础知识(二)&开发的方法

mybatis开发dao的方法

1.1SqlSessionFactoryBuilder
通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory
将SqlSessionFactoryBuilder当成一个工具类使用,不需要使用单例模式管理SqlSessionFactory
在需要创建SqlSessionFactory时候。只需要new1一次SqlSessionFactoryBuilder即可
1.2SqlSessionFactory
通过SqlSessionFactory创建SqlSession,使用单例模式管理。(工厂一旦创建吗,,使用一个实例)
将来mybatis和spring整合后,使用单例模式管理SQLSessionFactory
1.3SqlSession
SqlSession 是一个面向用户(程序员)的接口
SqlSession中提供了很多操作数据库的方法,如“:selectOne返回单个对象。selectList(返回一个或多个对象)
SqlSession是线程不安全的。在SqlSession实现类中除了接口中的方法(操作数据库的方法)还有数据域属性
SqlSession最佳应用场景在方法体内,定义成员局部变量使用。

2.原始dao开发方法(程序员需要写dao接口和dao实现类)

2.1思路
程序员需要写dao接口和dao实现类
需要向dao实现类中注入SqlSessionFacttory在方法体内通过SqlSessionFactory创建SqlSession

2.2dao接口
import mybatis.po.Course;

    public interface CourseDao {
            //根据id查询信息
            public Course findById(int id) throws Exception;
            //添加用户信息
            public void findByUser(Course course) throws Exception;
            //删除用户信息
            public void deleteById(int id) throws Exception;
        }
2.3接口的实现类
import mybatis.po.Course;

            public class CourseDaoImp  implements CourseDao{
                //需要向dao实现类中注入SqlSessionFactoey
                private SqlSessionFactory sqlSessionFactoery;
                 public CourseDaoImp(SqlSessionFactory sqlSessionFactory) {

                     this.sqlSessionFactoery=sqlSessionFactory;
                }

                @Override
                public Course findById(int id) throws Exception {
                    // TODO Auto-generated method stub
                    SqlSession sqlSession = sqlSessionFactoery.openSession();
                    Course course = sqlSession.selectOne("test.findUserById", id);
                    sqlSession.close();
                    return course;
                }

                @Override
                public void findByUser(Course course) throws Exception {
                    SqlSession sqlSession = sqlSessionFactoery.openSession();
                    sqlSession.insert("test.insetUserById", course);
                    sqlSession.commit();
                    sqlSession.close();
                }

                @Override
                public void deleteById(int id) throws Exception {
                    SqlSession sqlSession = sqlSessionFactoery.openSession();
                    sqlSession.delete("test.deleteById", id);
                    sqlSession.commit();
                    sqlSession.close();


                }

            }
2.4程序的调试
    public class CourseDaoImpTest {
            //此方法在testFINDByID之前先执行
            private SqlSessionFactory sqlSessionFactory=null;
            @Before
            public void setUp() throws Exception{
                //创建SqlSessionFactory
                //mybatis配置文件
                String resource="SqlMapConfig.xml";
                InputStream inputStream = Resources.getResourceAsStream(resource);


                //创建会话工厂传入mybatis的配置文件信息
                sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
            }

            @Test
            public void testFindById() throws Exception {
                //创建Userdao对象
                CourseDaoImp courseDaoImp = new CourseDaoImp(sqlSessionFactory);
                //调用该方法
            Course course = courseDaoImp.findById(5);
            System.out.println(course);

            }
        }
2.5 总结原始dao开发的问题
    1.dao的接口实现类方法存在大量的摸版方法,设想能否将这些代码提取出,大大减轻程序员的工作量
    2.调用SQLSession方法时将statement的id硬编码l
    3.调用sqlsession方法是传入的变量,由于SQLSession方法使用泛型,既使用变量类型传入错误,在编译
        阶段也不报错。不利于程序员开发。

3.mapper代理方法(程序员只需要mapper接口(相当于dao接口))

3.1 思路
    程序员只需要mapper接口(相当于dao接口)
    程序员需要编写mapper.xml映射文件
    程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类对象

开发规范
1.在mapper.xml中namespace等于mapper接口的地址
<!--namespace命名空间,作用就是对sql语句进行分类话管理,理解sql隔离
注意:使用mapper代理方法开发,namespace有特殊重要的作用:namespace等于mapper接口地址
-->
<mapper namespace="mybatis.mapper.CourseMapper">
2.mapper.java接口中的方法和mapper.xml中的statement的id一致。
3.mapper接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型的一致
4.mapper.xml接口中的方法的返回值类型和mapper.xml中的statement的resultType指定的类型一致
//根据id查询指定的用户‘
public User findUserById(int id) throws Exception;

总结
以上开发的规范主要是对下边的代码进行统一的生成

2.2mapper.java
    public interface CourseMapper {
            public Course findUserById(int id) throws Exception;
            //根据用户名列查询用户
            public List<Course> findByName(String name)throws Exception;
        }

        public class CourseMapperTest {
    //此方法在testFINDByID之前先执行
        private SqlSessionFactory sqlSessionFactory=null;
        @Before
                public void setUp() throws Exception{
                    //创建SqlSessionFactory
                    //mybatis配置文件
                    String resource="SqlMapConfig.xml";
                    InputStream inputStream = Resources.getResourceAsStream(resource);


                    //创建会话工厂传入mybatis的配置文件信息
                    sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
                }

            @Test
            public void findById() throws Exception{
                SqlSession sqlSession = sqlSessionFactory.openSession();

                CourseMapper mapper = sqlSession.getMapper(CourseMapper.class);
                    Course course = mapper.findUserById(3);
                    System.out.println(course);

            }
        }
2.3mapper.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">

                 <!--namespace命名空间,作用是对sql进行分类化管理,理解sql隔离
                    注意:使用mapper代理方法,namespace有特殊的重要的作用
                    -->
                <mapper namespace="test"> 
                    <!--
                        在映射文件中配置很多sql语句
                        需求,通过id查询用户表的记录
                        通过select执行数据库查询
                        将sql语句封装到mappedStatementd对象中,所以将id
                        称为stattement的id
                        parameterType:输入参数的指定类型:这里是int类型
                        #{}表示一个占位符
                        #{id}:其中的id表示接收输入的参数,参数名就是id,如果输入
                                参数的类型是简单的类型,#{}中的参数可以往里任意可以value
                                可以是其他名称
                        resultType:指定sql输出的结果所映射的java对象,select指定resultType表示
                                将单条记录映射成java对象

                        -->

                 <select id="findUserById" parameterType="int" resultType="mybatis.po.Course">
                 select * from course where cno = #{id}
                 </select>

                 <select id="findUserByName" parameterType="java.lang.String" resultType="mybatis.po.Course">
                    select * from course where cname like '%${value}%'
                    </select>
                 <!--
                    根据用户的名称进行模糊查询
                    resultType:指定是单条记录所映射的java对象类型
                    ${}:表示拼接sql语句,将接收的到内容不加任何修饰的拼接到sql中
                    ${value}:接收输入内容,如果传入类型的简单类型 ${}里面只能是value
                    -->

                </mapper>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值