如何使用MyBatic操做數據庫?

Mybatis是什麼?

MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,而且更名爲MyBatis,實質上Mybatis對ibatis進行一些改進。MyBatis是一個優秀的持久層框架,它對jdbc的操做數據庫的過程進行封裝,使開發者只須要關注 SQL 自己,而不須要花費精力去處理例如註冊驅動、建立connection、建立statement、手動設置參數、結果集檢索等jdbc繁雜的過程代碼。java

Mybatis經過xml或註解的方式將要執行的各類statement(statement、preparedStatemnt、CallableStatement)配置起來,並經過java對象和statement中的sql進行映射生成最終執行的sql語句,最後由mybatis框架執行sql並將結果映射成java對象並返回。mysql

準備:Mybatis所須要的jar包

首先創建一個classpath存放配置文件

 

database.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/easybuy
user=root
password=bdqn

log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

mybatis-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>
    <properties resource="database.properties"></properties>
    <settings>
        <setting name="logImpl" value="LOG4J" />
    </settings>
    <typeAliases>
        <package name="cn.bdqn.bean"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${user}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 引入映射文件 -->
    <mappers>
        <mapper resource="cn/bdqn/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

UserDao

package cn.bdqn.dao;

import java.util.List;

import org.apache.ibatis.annotations.Param;
import cn.bdqn.bean.User;

public interface UserDao {
    User findUser(@Param("loginName")String name,@Param("password")String pwd);  //查詢
    int    findAdd(User user);  //添加
    int findDelUser(@Param("id")int id);  //刪除
    int findUpate(User user); //修改
}

映射文件UserMapper.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">
<mapper namespace="cn.bdqn.dao.UserDao">
    <select id="findUser" resultType="User">
        select * from easybuy_user where loginName=#{loginName} and password=#{password}
    </select>
    <insert id="findAdd" parameterType="User" > insert into easybuy_user(loginName,userName,password,sex,email,mobile) values(#{loginName},#{userName},#{password},#{sex},#{email},#{mobile}) </insert> <delete id="findDelUser"> delete from easybuy_user where id=#{id} </delete> <update id="findUpate" parameterType="User"> update easybuy_user set loginName=#{loginName},userName=#{userName},password=#{password},identityCode=#{identityCode},email=#{email},mobile=#{mobile},type=#{type} where id=#{id} </update> </mapper>

MybatisUtil.java

package cn.bdqn.util;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybatisUtil {
    
    private static SqlSessionFactory ssf = null;

    private MybatisUtil(){}
    static{
        try {
            InputStream ins = Resources.getResourceAsStream("mybatis-config.xml");
            //建立SqlSessionFactory
            ssf = new  SqlSessionFactoryBuilder().build(ins);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static SqlSessionFactory getSqlSessionFactory(){
        return ssf;
    }
}

UserServiceImpl.java

package cn.bdqn.service.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import cn.bdqn.bean.User;
import cn.bdqn.dao.UserDao;
import cn.bdqn.dao.impl.UserDaoImpl;
import cn.bdqn.service.UserService;
import cn.bdqn.util.MybatisUtil;


public class UserServiceImpl implements UserService{
    SqlSessionFactory sqlSessionFactory = MybatisUtil.getSqlSessionFactory();
    private UserDao udao = new UserDaoImpl();
    @Override
    public User findUser(String name, String pwd) {
        SqlSession session = sqlSessionFactory.openSession();
        return session.getMapper(UserDao.class).findUser(name, pwd);
    }
    @Override
    public boolean Add(User user) {
        SqlSession session = sqlSessionFactory.openSession();
        int add = session.getMapper(UserDao.class).findAdd(user);
        if (add>0) {
            session.commit();
            return true;
        }
        return false;
    }
    @Override
    public boolean findDelUser(int id) {
        SqlSession session = sqlSessionFactory.openSession();
        int uid = session.getMapper(UserDao.class).findDelUser(id);
        if(uid>0){
            session.commit();
            return true;
        }
        return false;
    }
    @Override
    public boolean findUpate(User user) {
        SqlSession session = sqlSessionFactory.openSession();
        int uid = session.getMapper(UserDao.class).findUpate(user);
        if(uid>0){
            session.commit();
            return true;
        }
        return false;
    }
}

#{}和${}

#{}:至關於預處理中的佔位符?。程序員

#{}裏面的參數表示接收java輸入參數的名稱。sql

#{}能夠接受HashMap、簡單類型、POJO類型的參數。數據庫

當接受簡單類型的參數時,#{}裏面能夠是value,也能夠是其餘。apache

#{}能夠防止SQL注入。session

${}:至關於拼接SQL串,對傳入的值不作任何解釋的原樣輸出。mybatis

${}會引發SQL注入,因此要謹慎使用。app

${}能夠接受HashMap、簡單類型、POJO類型的參數。框架

當接受簡單類型的參數時,${}裏面只能是value。

selectOne和selectList

selectOne:只能查詢0或1條記錄,大於1條記錄的話,會報錯。

selectList:能夠查詢0或N條記錄。

Mapper代理開發方式

Mapper代理的開發方式,程序員只須要編寫mapper接口(至關於dao接口)便可。Mybatis會自動的爲mapper接口生成動態代理實現類。

不過要實現mapper代理的開發方式,須要遵循一些開發規範。

開發規範

一、 mapper接口的全限定名要和mapper映射文件的namespace的值相同。

二、 mapper接口的方法名稱要和mapper映射文件中的statement的id相同。

三、 mapper接口的方法參數只能有一個,且類型要和mapper映射文件中statement的parameterType的值保持一致。

四、 mapper接口的返回值類型要和mapper映射文件中statement的resultType值或resultMap中的type值保持一致。

相關文章
相關標籤/搜索