码迷,mamicode.com
首页 > 其他好文 > 详细

MyBatis框架

时间:2019-08-31 17:28:10      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:pattern   结合   ack   space   coding   bug   pojo   日志   ram   

MyBatis简介

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。

MyBatis 使用简单的 XML 或注解来配置和映射基本体,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

用MyBatis写一个简单的例子

1.建一个项目工程  2.在工程下新建一个叫lib的文件夹,里面存放一些jra包,然后把jra包生成路径到本工程下。  3.然后在src文件夹下创建实体类的包来存放放实体类、

创建映射文件的包来存放映射文件。  4.在工程下创建配置文件。  5.在工程下创建单元测试的包里面存放单元测试。

技术图片1.生成日志的jar包,能够在控制台观察到Sql语句的,也好找错。2.是mybatis的jar包,想用mybatis的框架就必须添加这个jar包

 

 

3.java与数据库连接的驱动jar包。不管在jdbc中还是mybatis中都需要此jar包。

实体类如下:

package com.zhiyou100.lw.bean;

public class Users {
    private int id;
    private String name;
    private int age;

    public Users() {
        super();
    }

    public Users(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public Users(int id) {
        super();
        this.id = id;
    }

    @Override
    public String toString() {
        return "Users [id=" + id + ", name=" + name + ", age=" + age + "]";
    }

    public Users(int id, String name, int age) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

映射文件需要插入代码如下:

<?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标签,标签里面写下自己要运行的代码,例如我要写增删改查的功能:

<mapper namespace="com.zhiyou100.lw.mybatis.Mybatis">
    <select id="getUser" parameterType="int" resultType="Users">
        select * from users where id=#{id}
    </select>
    <update id="updateU" parameterType="Users">
        update users set name=#{name},age=#{age} where id=#{id}
    </update>
    <insert id="insertU">
        insert into users(id,name,age) values(#{id},#{name},#{age})
    </insert>
    <delete id="deleteU" parameterType="int">
        delete from users where id=#{id}
    </delete>
    <select id="selectAll" resultType="Users">
        select * from users
    </select>
    <select id="selectD" parameterType="java.util.Map"
        resultType="Users">
    <![CDATA[select * from users where age between #{min} and #{max}]]>

    </select>
</mapper>

mapper标签里的namespace属性是此映射文件在工程下的路径,相当于分配一个空间给这个文件。里面的就是我写的一些功能。其中id就是为了给标签设置了一个名字,

在单元测试里面好查找到此标签。parameterType是参数的类型,在#{a}-a就是引入过来的参数,resultType是结果类型,就是运行结束后程序要返回的类型,

然后就是sql语句了。

配置文件:

<?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" />

    <typeAliases>
        <typeAlias type="com.zhiyou100.lw.bean.Users" alias="Users" />
    </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>
    
</configuration>

这是配置文件中要插入的代码,其中 <properties resource="db.properties" />是我引入的属性文件标签,属性文件叫db.properties,之所以引入是因为,在我们以后的开发中

配置文件不会这么少,那么当有很多代码的时候就不好找到需要修改的地方了,特此才引入这个属性文件的,可以将属性文件放在工程下。

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/mybatis

username=root

 

password=root

这就是要修改的文件,与配置文件中的

 技术图片一一对应,这些与jdbc中的一样是,driver是驱动类,url是驱动链接的地址,username是数据库的用户名,password是密码

 

 

在配置文件中用${}来获得这个属性的值。

想要生成日志,不仅要添加日志的jar包还有添加一个日志的属性文件,直接在工程下添加就完事。里面的内容如下:

log4j.properties,
log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

日志名要与jar包的名称要一致。

在测试类里面写:

   static SqlSession session=null;
    private String str="com.zhiyou100.lw.mybatis.Mybatis";
    @BeforeAll
    static void setUpBeforeClass() throws Exception {
        Reader reafer=Resources.getResourceAsReader("conf.xml");
        SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reafer);
        session = sessionFactory.openSession();
    }

    @AfterAll
    static void tearDownAfterClass() throws Exception {
    session.commit();
    }
   @Test void Testselect() { Users users = session.selectOne(str+".getUser", 1); System.out.println(users); }

在测试类之前会运行 @BeforeAll 里面的内容,之后会运行 @AfterAll里面的内容,在mybatis中程序是从配置文件中开始运行的所以要引入配置文件

Reader reafer=Resources.getResourceAsReader("conf.xml");括号里面是配置文件的路径,我是直接放在工程下的所以直接写配置文件名,获得要读取的对象
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reafer);是得到SqlSessionFactory的一个对象,从这个对象里面得到session
括号里面的是要读取的一个对象,在测试类中用session调用映射文件中的程序,来实现所需要的功能。

mybatis的优化

接口与映射文件的结合
在src中在创建一个包,来存放接口的。
例如:
package com.zhiyou100.lw.dao;

import com.zhiyou100.lw.bean.Users;

public interface UserDao {
    public Users getUser(int id);
}

接口中的每个方法名要和映射文件中的每个查询标签的id名一样,必须一样才有效。

技术图片就是getUser要一样 

 

我们可以把配置文件、连接数据库的文件、日志文件放在新创建的resources文件夹下,比较整洁。

解决列名与属性名不一致的情况

如下:

<mapper namespace="com.zhiyou100.lw.dao.ClazzDao">
    <select id="selectById1" resultMap="ID">
        select * from teacher,class where teacher_id=t_id and c_id=#{cid}
    </select>
    <resultMap type="com.zhiyou100.lw.bean.Clazz" id="ID">
        <id column="c_id" property="cId"/>
        <result column="c_name" property="cName"/>
        <result column="teacher_id" property="teacherId"/>
        <association property="teacher" javaType="com.zhiyou100.lw.bean.Teacher">
            <id column="t_id" property="tId"/>
            <result column="t_name" property="tName"/>
        </association>
    </resultMap>
</mapper>

 

在映射文件中的mapper标签下加入resultMap标签,其中 type是与数据库中的该表所对应的实体类的路径,id是为这个标签起一个名字,让查询标签查找到这个标签,在查询标签中用resultmap

属性来调用这个来改变列名要与属性名一致的问题,改变从数据库中得到的字段名与实体类中的属性名一致。

关联查询

 

 

 

 

 

 

 

 

 

 

 

 

 

package com.zhiyou100.lw.bean;
public class Users {private int id;private String name;private int age;
public Users() {super();}
public Users(String name, int age) {super();this.name = name;this.age = age;}
public Users(int id) {super();this.id = id;}
@Overridepublic String toString() {return "Users [id=" + id + ", name=" + name + ", age=" + age + "]";}
public Users(int id, String name, int age) {super();this.id = id;this.name = name;this.age = age;}
public int getId() {return id;}
public void setId(int id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
}

 

MyBatis框架

标签:pattern   结合   ack   space   coding   bug   pojo   日志   ram   

原文地址:https://www.cnblogs.com/lw97-1014/p/11439449.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!