Mybatis的环境搭建和使用

Mybatis的环境搭建和使用

Mybatis的简介

    Mybatis本事apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了googlecode,

并且改名为MyBatis。2013年11月迁移到Github。

    MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置

参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs

(Plain Old java Objects,普通的Java对象)映射成数据库中的记录。

1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。
(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。

MyBatis环境的配置(这里是单独配置MyBatis):

一般都需要加入日志log4j.properties(名字一定要用这个)

导入日志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

 

第一:MyBatis jar包的下载和导入

1.在github.com官网上下载:https://github.com/mybatis/mybatis-3

2.配置文件的书写

在自己的项目中创建一个source folder,存放自己的配置文档创建sqlMappersConfig.xml(就是配置文件名字自定义config.xml)

并将下面的配置(官方提供的配置,改成自己的)

复制以下代码:

<?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>
  <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>
  <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>

需要优化Mybatis配置将以下共有的放入以下配置中去(根据自己的数据库位置):sqlConnect.properties中

sqlDriver:com.mysql.jbdc.Driver
sqlUrl:mysql:jdbc:mysql://localhost:3306/mybatis
sqlUserName:root
sqlUserPwd:root

目前为止config基本配置完成,以下是测试代码:请复制

    final String str="com.zhiyou100.zjj.mapper.UsersMapper";
    static SqlSession session=null;
     static Usersdao usersdao;
     //第一个执行
    @BeforeAll 
    static void setUpBeforeClass() throws Exception {          
         
         Reader reader=Resources.getResourceAsReader("conf.xml");
//创建工厂 SqlSessionFactory sessionFactory
=new SqlSessionFactoryBuilder().build(reader); //打开工厂
session
=sessionFactory.openSession(); } @Test void test() { Usersdao usersdao=session.getMapper(Usersdao.class); // conn.setAutoCommit(false); usersdao.getUser("五"); } //最后一个执行 @AfterAll static void tearDownAfterClass() throws Exception { session.commit();//事务提交 }

setAutoCommit(false):sql语句不自动执行

注意:一般如果两条sql语句对数值修改:一条增加一条减少如果增加语句执行了 但是到减法语句出错导致没有执行,

第一条写入数据库,第二条没有写入数据库。因为sql语句默认自动执行

session.commit():事务提交,让sql语句全部最后执行

第二:mapper的创建和使用

在实体类bean中创建:User.java

在dao包中创建接口(用于实现方法):UserMapper.java

在mapper中创建xml文件:UserMapper.xml(User.xml)

并且在config,xml中如下配置:

<!--下面是对com.spectergk.mybatis.pojo.User的包名起别名--!>
<typeAliases>
<typeAlias type="com.zjj.dao.UserMapper" alias="User"/>
</typeAliases>
<!--加载映射资源--!>
<mappers>
<mapper resource="User.xml"/>
</mappers>

UserMapper.xml(User.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  指向的包为UserMapper接口  这是实现动态代理的条件之一  -->
<mapper namespace="com.spectergk.mybatis.mappers.UserMapper">
<!-- 这里配置的返回值是User  这是因为在sqlMappersConfig.xml  已经配置了其重命名 -->
<!-- 根据用的id来查询用户  返回值是User 传的值为parameterType -->
  <select id="selectUserById" resultType="User" parameterType="String">
        select * from user where uid = #{v}
  </select>
 <!-- 根据用户的用户名进行模糊查询 -->
  <select id="selectUsersbyUserName" resultType="User" parameterType="String">
      select * from user where realname like "%"#{v}"%";
  </select>
  <!-- 向数据库里面插入数据 -->
  <insert id="insertOneUser" parameterType="User">
      INSERT into user(uid,username,realname,mobile,mainpid,sex) values(#{uid},#{username},#{realname},#{mobile},#{mainpid},#{sex});
  </insert>
  <!-- 插入数据并且返回的自动生成的uid -->
   
  <insert id="insertOneUserGetid" parameterType="User">
      <selectKey keyProperty="uid" keyColumn="uid" resultType="String" order="AFTER">
          SELECT LAST_INSERT_ID()
      </selectKey>
      INSERT into user(username,realname,mobile,mainpid,sex) values(#{username},#{realname},#{mobile},#{mainpid},#{sex});
  </insert>
   
  <!-- 以list的形式插入 -->
  <insert id="insetUsers" >
          INSERT into user(uid,username,realname,mobile,mainpid,sex) values
          <foreach collection="list" item="item" separator=",">
               (#{item.uid},#{item.username},#{item.realname},#{item.mobile},#{item.mainpid},#{item.sex})
           </foreach>
  </insert>
  <!-- 以数组的形式插入 -->
  <insert id="insetUsersArray" >
          INSERT into user(uid,username,realname,mobile,mainpid,sex) values
          <foreach collection="array" item="item" separator=",">
               (#{item.uid},#{item.username},#{item.realname},#{item.mobile},#{item.mainpid},#{item.sex})
           </foreach>
  </insert>
  <!-- 更新用户 -->
  <update id="updateUser" parameterType="User">
           UPDATE user set username = #{username} where uid = #{uid}
  </update>
  <!-- 删除用户 -->
  <delete id="deleteOneUser" parameterType="String">
     delete from user where uid = #{v}
  </delete>
  <delete id="deleteMoreUsers">
      delete from user where uid in (
      <foreach collection="list" item="item" separator=",">
            #{item}
      </foreach>
      )
  </delete>
</mapper>

因为是动态加载所以在接口中Usermapper.java中写入以下代码:

public interface UserMapper {
    /*
     * 根据用户的id查询
     */
    public User selectUserById(String id);
    /*
     * 根据用户的姓名 模糊查询
     */
    public List<User> selectUsersbyUserName(String username);
    /*
     * 插入一个用户
     */
    public void insertOneUser(User user);
    /*
     * 插入一个用户  并且返回插入的user的id
     */
    public void insertOneUserGetid(User user);
    /*
     * 插入多个用户
     */
    public void insetUsers(List<User> users);
    /*
     * 插入多个用户 这里传输array 
     */
    public void insetUsersArray(User[] users);
    /*
     * updateUser  更新
     */
    public void updateUser(User user);
    /*
     * 删除一个
     */
    public void deleteOneUser(String uid);
    /*
     * deleteMoreUsers删除多个
     */
    public void deleteMoreUsers(List<String> uids);
}

测试已在上述演示。

注意:mapper中的namespace的值要写接口的包名+类名

            select中的id必须和接口中的方法名一致,参数类型和类型也必须一致。

提一句:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(一般软件服务商考虑的比较多)。

以下为dao 包中接口的工作原理

 

(别想着没有接口也能实现啊,这是规定,别去多想)

具体https://www.cnblogs.com/zengsiqi/p/7991731.html(某博主,参考)

 

posted @ 2019-08-31 15:57  勇攀少年  阅读(163)  评论(0)    收藏  举报