MyBatis框架

Posted lw97-1014

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis框架相关的知识,希望对你有一定的参考价值。

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框架的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis

Mybatis

Mybatis框架

SSM框架专题-MyBatis框架从零入门老杜版笔记(上)

mybatis框架的主要作用

Mybatis框架入门