您的位置:首页 > 其它

Mybatis配置及详细说明

2018-01-20 16:31 169 查看
1. Mybatis的介绍

1.1 什么是Mybatis?

    Mybatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache
software foundation 迁移到了google code,并且改名为MyBatis
。2013年11月迁移到Github。

1.2 特点:     

 Mybatis是支持普通SQL查询,存储过程和高级映射的持久层框架。对JDBC的操作数据库过程进行封装,可使用简单的xml或注解用于配置和原始映射,将接口和Java的pojo映射成数据库中的记录。

2.Mybatis入门

2.1 mybatis的架构图



2.2 mybatis配置并实现对数据库的CRUD步骤 

前提:

mybatis下载  网址: https://github.com/mybatis/mybatis-3/releases

mybatis-3.2.7.jar mybatis的核心包

lib文件夹 mybatis的依赖包所在
mybatis-3.2.7.pdf mybatis使用手册
下载数据库驱动包:  mysql-connector-java-5.1.40-bin.jar    

加入mybatis核心包、依赖包、数据驱动包。

(1). config.xml文件: 

作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。

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

     <!-- 和spring整合后 environments配置将废除 -->

     <environments default="development">    default: development:开发模式 / work:工作模式
  <environment id="development">      id:数据源标志
<!-- 使用jdbc事务管理 -->
 <transactionManager type = "JDBC" />    JDBC:JDBC事务 ;Manage:容器方式管理事务;自定义 
 <!-- 数据库连接池 -->
 <dataSource type="POOLED">        JNDI:JNDI数据源 ;UNPOOLED:非数据库连接池
;自定义 
     <property name="driver" value="com.mysql.jdbc.Driver" />
     <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8" />
     <property name="username" value="root" />
     <property name="password" value="root" />
 </dataSource>
 </environment>
</environments>  
<!-- 加载映射文件 -->
<mappers>
    <mapper resource="mapper/mapper.xml"/>     完整路径:包名.类名
</mappers>

</configuration>

(2). mapper.xml:

sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在config.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 -->

<mapper namespace="mapper.mapper">

    <!-- id:statement的id 或者叫做sql的id-->
<!-- parameterType:声明输入参数的类型 -->
<!-- resultType:声明输出结果的类型,应该填写pojo的全路径 -->
<!-- #{}:输入参数的占位符,相当于jdbc的? -->

    <!-- 查询用户 -->

     <select id="selectAllUser" parameterType="int" resultType="user.User">

        Select * from mybatis

    </select>

    <select id="selectUserById" parameterType="int" resultType="user.User">

        Select * from mybatis  where id=#{id}

    </select>

     <select id="selectUserBylike" parameterType="int" resultType="user.User">

        Select * from mybatis  where username like #{username}

    </select>  

    <!-- 修改用户 -->

     <update id="UpdateAllUser" parameterType="user.User" >

        Update mybatis set username = #{username}, age = #{age}

    </update>

    <update id="UpdateUserById" parameterType="user.User" >

        Update mybatis set username = #{username} where id = #{id}

    </update>

   <!-- 增加用户 -->

    <insert id="insertUser" parameterType="user.User" >

        insert into mybatis(id,username,age) values(#{id}, #{username}, #{age});

    </insert> 

 

   <!-- 删除用户 -->

    <delete id="deleteUser" parameterType="user.User" >

        delete from mybatis where id = #{id};

    </delete>

</mapper>

(3).configMJBC.java

通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂;

   由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

public class MJdbc {

/**
* 获取SqlSessionFactory
*/
public static SqlSessionFactory getssFactory(){

String resource ="config.xml";
InputStream is = MJdbc.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);

return ssf;
}

/**
* 获取SqlSession
*/
public static SqlSession getSqlSession(){
return getssFactory().openSession() ;
}

/**
* 获取SqlSession
* @param isAutoCommit
*            true 表示创建的SqlSession对象在执行完SQL之后会自动提交事务 
*            false表示创建的SqlSession对象在执行完SQL之后不会自动提交事务,
*                 这时就需要我们手动调用sqlSession.commit()提交事务
* @return SqlSession
*/
public static SqlSession getSqlss(boolean isAutoCommit){
return getssFactory().openSession(false) ;
}

}

(4).配置接口 IUser.java

/**
* 使用@Select注解指明SelectUserById方法要执行的SQL
* 根据Id查询用户
* @param id
*/
@Select("Select * from mybatis  where id=#{id}")
public User SelectUserById();

/**
* 查询所有用户
* @return
*/
@Select("Select * from mybatis")
public void SelectAllUser();

/**
* 根据用户名模糊查询用户
*/
@Select("Select * from mybatis  where username like %b%")
public void SelectUserBylike();

/**
* 根据Id修改用户
*/
@Update("Update mybatis set name = bao where id=#{id}")
public void UpdateUserById();

/**
* 修改全部用户
*/
@Update("Update mybatis set username = #{username} ")
public void UpdateAllUser();

/**
* 添加用户
*/
@Insert("insert into mybatis(id,username,age) values(#{id}, #{username}, #{age})")
public void InsertUser();

/**
* 删除用户
*/
@Delete("delete from mybatis where id = #{id}")
public void DeleteUser();

  }

(5).配置IUser接口的实现类 M_test.java
 public class M_test implements IUser{
public static void main(String[] args) {
M_test mt = new M_test();
mt.SelectUserById();

// mt.SelectAllUser();

// mt.UpdateUserById();

// mt.UpdateAllUser();

// mt.SelectUserBylike();

// mt.InsertUser();  

// mt.DeleteUser();  

}

@Override
public User SelectUserById() {
SqlSession sqlSession = MJdbc.getSqlSession();
Object object = sqlSession.selectOne("mapper.mapper.selectUserById",2);
System.out.println(object);
return (User) object;
}

@Override
public void SelectAllUser() {
SqlSession sqlSession = MJdbc.getSqlSession();
List<Object> list = sqlSession.selectList("mapper.mapper.selectAllUser");
System.out.println(list);
sqlSession.close();
}

@Override
public void SelectUserBylike() {
SqlSession sqlSession = MJdbc.getSqlSession();
List<Object> list= sqlSession.selectList("mapper.mapper.selectUserBylike", "%b%");
System.out.println(list);
}

@Override
public void UpdateUserById() {

User user = new User();
user.setId(1);
user.setUsername("bao");
user.setAge(16);

SqlSession sqlSession = MJdbc.getSqlSession();
sqlSession.update("mapper.mapper.UpdateUserById",user);
sqlSession.commit();
sqlSession.close();
}

@Override
public void UpdateAllUser() {

User user = new User();
user.setUsername("ba");
user.setAge(1);

SqlSession sqlSession = MJdbc.getSqlSession();
sqlSession.update("mapper.mapper.UpdateAllUser",user);
sqlSession.commit();
sqlSession.close();

}

@Override
public void InsertUser() {

User user = new User();
user.setId(7);
user.setUsername("11");
user.setAge(18);

SqlSession sqlSession = MJdbc.getSqlSession();
int adduser = sqlSession.insert("mapper.mapper.insertUser",user);
System.out.println(adduser);
sqlSession.commit();
sqlSession.close();
}

@Override
public void DeleteUser() {

SqlSession sqlSession = MJdbc.getSqlSession();
int uid = sqlSession.delete("mapper.mapper.deleteUser", 7);
System.out.println(uid);

}

(6).小结:

6.1 测试程序步骤:

 a. 创建SqlSessionFactoryBuilder对象

 b. 加载SqlMapConfig.xml配置文件

 c. 创建SqlSessionFactory对象

 d. 创建SqlSession对象

 e. 执行SqlSession对象执行查询,获取结果User

 f. 打印结果

 g. 释放资源

6.2  #{}和${}区别:

#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

6.3 parameterType和resultType:

parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。

resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据,则分别进行映射,并把对象放到容器List中

6.4 selectOne和selectList:

selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70)

selectList可以查询一条或多条记录。


  
  
  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Mybatis配置及CRUD