Mybatis连接操作数据库的四种方式

第一种:

配置sqlMapConfig.xml(mybatis核心配置文件)

<!-- 配置数据源,事务 -->
<environment id="test">
            <!-- 事务:JDBC/MANAGED-自己管理去 -->
            <transactionManager type="JDBC"/>
            <!-- 数据源:POOLED/UNPOOLED/JNDI -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatisdb?charsetEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>

<!-- 映射文件mapper -->
    <mappers>
        <mapper resource="cn/itcast/mapper/PersonMapper.xml"/>
    </mappers>

创建mapper.xml

<!-- 自定义命名空间-->
<mapper namespace="cn.itcast.mapper.PersonMapper">
     <!-- 查询一个,按id查询 -->
    <select id="get" parameterType="int" resultType="cn.itcast.domain.Person">
        select * from person
        where id = #{pid}
    </select>
</mapper>

在测试类中使用:

private SqlSessionFactory factory;
@Before //最先执行,初始化SessionFactory
    public void init() throws IOException{
        String resource = "sqlMapConfig.xml";
        InputStream is = Resources.getResourceAsStream(resource);
        factory = new SqlSessionFactoryBuilder().build(is);
    }

@Test   //查询一条
    public void testGet(){
        SqlSession session = factory.openSession();
        Person p = session.selectOne("cn.itcast.mapper.PersonMapper.get", 1);
        //cn.itcast.mapper.PersonMapper:mapper.xml中定义的命名空间
        // get:各种操作定义的id
        System.out.println(p);
    }

后面是三种都是结合spring,且动态生成mapper代理。
程序员只需要编写mapper接口(相当于dao接口),不需要编写 mapper接口的实现类,mybatis提供根据mapper接口和mapper.xml(映射文件)生成mapper接口动态代理对象(mapper接口的实现)。
具备什么规则生成mapper代理对象:
Mapper.xml中的namespace等于mapper接口的地址。
Mapper.xml中定义的sql的id(mapped statement的id)等于mapper.java中方法名
Mapper.xml中定义的statement的parametertype等于mapper.java中方法的形参类型。
Mapper.xml中定义的statement的resultType等于mapper.java中方法的返回值类型。

第二种 :

sqlMapConfig.xml核心配置文件不需要再配置xxxmapper.xml

applicationContext.xml:spring核心配置文件

<!-- 1.jdbc.properties属性配置文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    
    <!-- 2.数据源 DataSource -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverclass}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    
    <!-- 3.SqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- spring和mybatis整合 -->
        <!-- 1)引入mybatis核心配置文件 -->
        <property name="configLocation" value="classpath:sqlMapConfig.xml"/>
        
        <!-- 2)扫描指定目录下的所有Mapper.xml -->
        <property name="mapperLocations" value="classpath:cn/itcast/ssm/mapper/*.xml"/>
    </bean>

创建mapper.xml:personMapper.xml

<!-- 自定义命名空间-->
<mapper namespace="cn.itcast.mapper.PersonMapper">
     <!-- 带条件查询 -->
    <select id="find" parameterType="map" resultMap="personRM">
        select * from person
        where 1=1
        <if test="name!=null"> and user_name like #{name}</if>
        <if test="ageStart!=null"> and age>#{ageStart}</if>
        <if test="ageEnd!=null"><![CDATA[ and age<=#{ageEnd}]]></if>
    </select>
    
    <!-- 查询某人的书籍 -->
    <select id="findPersonBook" parameterType="int" resultMap="personBookRM">
SELECT
    p.id,p.user_name,p.age,p.remark,
    b.id AS book_id,b.name,b.money
FROM
    (SELECT * FROM person
        WHERE id = #{id}
    ) p
LEFT JOIN
    (SELECT * FROM book
        WHERE person_id = #{id}
    ) b
ON p.id=b.person_id
    </select>
    
    <!-- 新增 -->
    <insert id="insert" parameterType="cn.itcast.ssm.domain.Person">
        insert into person
        (user_name,age,remark)
        values
        (   
            #{name, jdbcType=VARCHAR},
            #{age, jdbcType=INTEGER},
            #{remark, jdbcType=VARCHAR}
        )
    </insert>
</mapper>

创建PersonMapper接口文件,接口文件路径一定要和xxxmapper.xml文件namespace名称一致。

public interface PersonMapper {
    public List<Person> find(Map map);
    public void insert(Person person);
    public Person findPersonBook(Integer id);
        // 需要注意的是方法中的参数要和mapper.xml中定义的参数类型一致
}

编写dao层

@Repository
public class PersonDaoImpl extends SqlSessionDaoSupport implements PersonDao {
    
    /*
     * mybatis3.0.0+mybatis-psring1.0.0无需,整合包自己注入
     * mybatis3.2.2+mybatis-spring1.2.0 必须自己注入sqlSessionFactory;
     */
    @Resource
    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        super.setSqlSessionFactory(sqlSessionFactory);
    }
    
    public List<Person> find(Map map){
        PersonMapper mapper = this.getSqlSession().getMapper(PersonMapper.class);
        return mapper.find(map);
    }
    
    public void insert(Person person){
        PersonMapper mapper = this.getSqlSession().getMapper(PersonMapper.class);
        mapper.insert(person);
    }
    
    public Person findPersonBook(Integer id){
        PersonMapper mapper = this.getSqlSession().getMapper(PersonMapper.class);
        return mapper.findPersonBook(id);
    }
    
}

第三种 :

sqlMapConfig.xml核心配置文件不需要再配置xxxmapper.xml
注意:mapper.xml和mapper.java同名且在一个目录 ,不需要在SqlMapConfig.xml中加载mapper文件。
applicationContext.xml:spring核心配置文件

<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties"/>

<!-- 数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
       <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <!-- 开发阶段建议最大连接数据尽量少,够用即可 -->
        <property name="maxActive" value="${jdbc.maxActive}"/>
        <property name="maxIdle" value="${jdbc.maxIdle}"/>
</bean>

<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!-- 数据源 -->
    <property name="dataSource" ref="dataSource"/>
</bean>

<!-- 配置SqlSessionFactory
从spring和mybatis的整合包中获取
 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 加载数据源 -->
    <property name="dataSource" ref="dataSource"/>
    <!-- 配置SqlMapConfig.xml -->
    <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"/>
</bean>

<!-- 使用MapperFactoryBean 生成mapper的代理对象
在mybatis和spring的整合包中
-->

<bean id="sysuserCustomMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  配置mapper接口
  <property name="mapperInterface" value="yycg.base.dao.mapper.SysuserCustomMapper"/>
  配置sqlSessionFactory
  <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

编写xxxmapper.xml文件

 <!-- 带条件查询 -->
    <select id="findSysuserById" parameterType="int" resultType="Sysuser ">
        select * from Sysuser 
        where 1=1
        <if test="name!=null"> and user_name like #{name}</if>
        <if test="ageStart!=null"> and age>#{ageStart}</if>
        <if test="ageEnd!=null"><![CDATA[ and age<=#{ageEnd}]]></if>
    </select>

编写接口文件

public interface SysuserCustomMapper {
    
    public Sysuser findSysuserById(String id) throws Exception;
}

编写test类

public void testFindSysuserById() throws Exception {
        // 获取spring容器
                applicationContext = new ClassPathXmlApplicationContext(new String[] {
                        "spring/applicationContext.xml", "spring/applicationContext-dao.xml"

                });
        SysuserCustomMapper sysuserCustomMapper = (SysuserCustomMapper) applicationContext
                .getBean("sysuserCustomMapper");
        Sysuser sysuser =  sysuserCustomMapper.findSysuserById("286");
        System.out.println(sysuser);
    }

使用MapperFactoryBean需要在spring容器对每个mapper进行配置,麻烦。

第四种 :

利用代码生成工具(就是一个java工程)


4444444.png

1、将接口文件、mapper.xml、实体类文件拷贝到项目的相应包下即可。
2、在spring中配置mapper自动扫描器

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
   <!-- 配置扫描包路径 ,如果扫描多个包路径,中间使用半角逗号分隔-->
   <property name="basePackage" value="yycg.base.dao.mapper"/>
    <!-- 配置SqlSessionFactory -->
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>

3、编写测试类

private ApplicationContext applicationContext;

    protected void setUp() throws Exception {
        // 获取spring容器
        applicationContext = new ClassPathXmlApplicationContext(new String[] {
                "spring/applicationContext.xml", "spring/applicationContext-dao.xml"

        });
    }

    protected void tearDown() throws Exception {

    }
    
    public void testFindSysuserById() throws Exception {
        // 获取spring容器
                applicationContext = new ClassPathXmlApplicationContext(new String[] {
                        "spring/applicationContext.xml", "spring/applicationContext-dao.xml"

                });
        SysuserCustomMapper sysuserCustomMapper = (SysuserCustomMapper) applicationContext
                .getBean("sysuserCustomMapper");
        Sysuser sysuser =  sysuserCustomMapper.findSysuserById("286");
        System.out.println(sysuser);
    }

注意:mapper.xml和mapper.java同名且在一个目录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,087评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,293评论 6 344
  • Spring 技术笔记Day 1 预热知识一、 基本术语Blob类型,二进制对象Object Graph:对象图...
    OchardBird阅读 929评论 0 2
  • 本文Demo的完整工程代码, 参考这里的GCDDemo 目录 引言 回顾 barrier-GCD 例子 应用 参考...
    诺之林阅读 8,441评论 2 9
  • 我自卑,因为我胆小 我生气,也是因为我胆小 我缺乏安全感,更是因为我胆小 你不需要轻视自己,你很exception...
    忙着变强来不及沮丧阅读 128评论 0 0