Mybatis是什么?
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
准备: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输入参数的名称。
#{}可以接受HashMap、简单类型、POJO类型的参数。
当接受简单类型的参数时,#{}里面可以是value,也可以是其他。
#{}可以防止SQL注入。
${}:相当于拼接SQL串,对传入的值不做任何解释的原样输出。
${}会引起SQL注入,所以要谨慎使用。
${}可以接受HashMap、简单类型、POJO类型的参数。
当接受简单类型的参数时,${}里面只能是value。
selectOne和selectList
selectOne:只能查询0或1条记录,大于1条记录的话,会报错。
selectList:可以查询0或N条记录。
Mapper代理开发方式
Mapper代理的开发方式,程序员只需要编写mapper接口(相当于dao接口)即可。Mybatis会自动的为mapper接口生成动态代理实现类。
不过要实现mapper代理的开发方式,需要遵循一些开发规范。
开发规范
1、 mapper接口的全限定名要和mapper映射文件的namespace的值相同。
2、 mapper接口的方法名称要和mapper映射文件中的statement的id相同。
3、 mapper接口的方法参数只能有一个,且类型要和mapper映射文件中statement的parameterType的值保持一致。
4、 mapper接口的返回值类型要和mapper映射文件中statement的resultType值或resultMap中的type值保持一致。
长路漫漫,键盘作伴~