1.Mybatis 简介
Apache Google (2010) GitHub
IBatis Mybatis Mybatis
2.Mybatis 的作用 ***
完成普通的sql操作 存储过程
以及是一个高级的ORM(Object Relation Mapping) 框架
封装了结果集的操作 以面向对象的思想操作数据库
3.Mybatis 的核心构成
主配置文件 (xml文件) 连接数据库的设置 和 加载sql定义文件
sql定义文件(xml 文件) 定义sql语句的
javaBean 的实体类
Mybatis中的API SqlSession 对象来体现
4.使用id 查询银行账户
4.1 建立一个项目 导入jar包(mybatis.jar ojdbc6.jar)
4.2 建立一个银行账户的实体类 要求 成员变量 和 表中的字段一致
4.3 拷贝主配置文件sqlmap-config.xml到src下 填写连接数据库的信息 加载sql定义文件
一般只用修改url的值,jdbc:oracle:thin:@127.0.0.1:1521:MLDN
数据库账号和密码,system 123456
然后是加载的sql文件的名字 com/xdl/mapper/XdlBankAccountMapper.xml 一般将文件改为有一定业务含义的.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<environments default="environment">
<environment id="environment">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver"
value="oracle.jdbc.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@127.0.0.1:1521:MLDN"/>
<property name="username" value="system" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/xdl/mapper/XdlBankAccountMapper.xml" />
</mappers>
</configuration>
4.4 拷贝sql定义文件 到对应的包中 定义sql
<mapper namespace="abc">
<!-- 定义SQL语句 -->
<select id="getBankAccountById" parameterType="int"
resultType="com.xdl.bean.XdlBankAccount">
select * from xdl_bank_account where id = #{id}
</select>
</mapper>
4.5 使用mybatisAPI 获取SqlSession 使用SqlSession 完成查询
public static void main(String[] args) {
// 构建一个SqlSession 工厂的构建器
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
// 获取SqlSession 工厂对象
InputStream inputStream = SqlSessionTest.class.getClassLoader()
.getResourceAsStream("sqlmap-config.xml");
SqlSessionFactory ssf = ssfb.build(inputStream);
// 获取sqlSession 对象
SqlSession sqlSession = ssf.openSession();
// 进行查询
XdlBankAccount account = sqlSession.selectOne("getBankAccountById",1);
System.out.println(account);
}
5.多个查询条件的查询
sql定义文件在参数传递的时候必须和数据库一致不能随意
<select id="getBankAccountByNoAndPassword"
parameterType="com.xdl.bean.XdlBankAccount"
resultType="com.xdl.bean.XdlBankAccount">
select * from xdl_bank_account where acc_no = #{acc_no}
and acc_password = #{acc_password}
</select>
测试的时候传递参数可以通过一个对象传递
public static void main(String[] args) {
XdlBankAccount acc = new XdlBankAccount();
acc.setAcc_no("123");
acc.setAcc_password("456");
Object selectOne =
sqlSession.selectOne("getBankAccountByNoAndPassword",acc);
System.out.println(selectOne);
}
6.不跟据任何字段,直接查表中所有信息,注意因为没有参数字段所以parameterType参数可以不写
<select id="getBankAccountByList"
resultType="com.xdl.bean.XdlBankAccount">
select * from xdl_bank_account
</select>
测试
List<Object> selectList = sqlSession.selectList("getBankAccountByList");
System.out.println(selectList);
7.Mybatis实现增删改!
sql定义文件中 定义对应的sql语句 --- insert delete update
使用SqlSession 完成增删改 --- insert delete update
7.1增加
<!-- 增加银行账户 -->
<insert id="insertBankAccount"
parameterType="com.xdl.bean.XdlBankAccount">
insert into xdl_bank_account values(#{id},#{acc_no},#{acc_password},#{acc_money})
</insert>
需要手动commit
XdlBankAccount acc2 = new XdlBankAccount(145,"asddfgfg","123",123.2);
int insert = sqlSession.insert("insertBankAccount", acc2);
System.out.println(insert);
sqlSession.commit();
7.2删除
<!-- 删除银行账户 -->
<delete id="deleteBankAccount" parameterType="int">
delete from xdl_bank_account where id = #{id}
</delete>
需要手动提交
int delete = sqlSession.delete("deleteBankAccount", 43);
sqlSession.commit();
System.out.println(delete);
7.3修改
8 不使用Mapper映射器
8.1封装SqlSession的获取。SqlSessionUtil.java
public class SqlSessionUtil {
private static SqlSessionFactory ssf;
static{
// 构建一个SqlSession 工厂的构建器
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
// 获取SqlSession 工厂对象
InputStream inputStream = SqlSessionUtil.class.getClassLoader()
.getResourceAsStream("sqlmap-config.xml");
ssf = ssfb.build(inputStream);
}
public static SqlSession getSqlSession() {
return ssf.openSession();
}
}
8.2 DAO接口 需要注意的是方法返回值类型应和sql定义文件中的resultType相同该变list就要变list,参数与parameterType相同,方法名字与id相同。
public interface XdlBanlAccountDAO {
//可以根据id查银行账户
XdlBankAccount getBankAccountById(int id);
//根据id查询账号名称
String getACCNOById(int id);
//根据账号和密码查询账户
XdlBankAccount getBankAccountByNoAndPassword(String acc_no,String acc_password);
//查询所有的账户信息
List<XdlBankAccount> getBankAccountByList();
//根据id删除账户信息,返回值写int
int deleteBankAccount(int id);
}
8.3实现DAO接口
public class XdlBankAccountDAOImpl implements XdlBanlAccountDAO {
@Override
public XdlBankAccount getBankAccountById(int id) {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
return sqlSession.selectOne("getBankAccountById", id);
}
@Override
public String getACCNOById(int id) {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
return sqlSession.selectOne("getACCNOById", id);
}
@Override
public XdlBankAccount getBankAccountByNoAndPassword(String acc_no, String acc_password) {
XdlBankAccount account = new XdlBankAccount(0,acc_no,acc_password,0);
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
return sqlSession.selectOne("getBankAccountByNoAndPassword", account);
}
@Override
public List<XdlBankAccount> getBankAccountByList() {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
return sqlSession.selectList("getBankAccountByList");
}
@Override
public int deleteBankAccount(int id) {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
int delete = sqlSession.delete("deleteBankAccount", id);
sqlSession.commit();
return delete;
}
}
8.4测试类
public static void main(String[] args) {
XdlBanlAccountDAO xAccountDAO = new XdlBankAccountDAOImpl();
//根据id查账户
XdlBankAccount bankAccountById = xAccountDAO.getBankAccountById(1);
System.out.println(bankAccountById);
//根据id查账户的accno
String accountById = xAccountDAO.getACCNOById(1);
System.out.println(accountById);
//测试通过accno和accpassword查找账户信息
XdlBankAccount byNoAndPassword = xAccountDAO.getBankAccountByNoAndPassword("abc", "123456");
System.out.println(byNoAndPassword);
//测试查询列表
List<XdlBankAccount> bankAccountByList = xAccountDAO.getBankAccountByList();
for (XdlBankAccount xdlBankAccount : bankAccountByList) {
System.out.println(xdlBankAccount);
}
//测试删除
int deleteBankAccount = xAccountDAO.deleteBankAccount(145);
System.out.println(deleteBankAccount);
}
9.Mybatis中的Mapper映射器规范
Mybatis 可以帮你实现接口的实现类,但是接口得遵守如下规范
9.1接口中方法名 要和sql定义文件中的id保持一致
9.2接口中方法的参数和parameterType保持一致
如果没有parameterType 参数 接口方法参数可以自由设计 但是sql需要特殊语法
<select id="getBankAccountByNoAndPassword2"
resultType="account">
<!-- 或者将 0 和 1 改为 param1 param2 数字从0开始,param从1开始 -->
select * from xdl_bank_account where acc_no = #{0}
and acc_password = #{1}
</select>
where多个参数条件的时候可以使用#{0} #{1} 或者 #{param1} #{param2} 数字从0开始,param从1开始,代表参数的顺序。
9.3接口方法的返回值一般和resultType保持一致
查询多条时 使用List
增 删 改对应的方法可以是void 也可以是int
9.4 sql定义文件中的namespace 也和接口的包名.接口名保持一致
接口二代
public interface XdlBankAccountDAO2 {
XdlBankAccount getBankAccountById(int id);
String getACCNOById(int id);
XdlBankAccount getBankAccountByNoAndPassword2(String acc_no,String acc_password);
int deleteBankAccount(int id);
}
测试二代
public static void main(String[] args) {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
//通过Mapper映射规则生成了接口的实现类
XdlBankAccountDAO2 xAccountDAO2 = sqlSession.getMapper(XdlBankAccountDAO2.class);
//根据id查账户
XdlBankAccount bankAccountById = xAccountDAO2.getBankAccountById(1);
System.out.println(bankAccountById);
//根据id查账户名
String accnoById = xAccountDAO2.getACCNOById(1);
System.out.println(accnoById);
//根据账户名和密码查账户信息(多个参数)
XdlBankAccount bankAccountByNoAndPassword2 = xAccountDAO2.getBankAccountByNoAndPassword2("abc", "123456");
System.out.println(bankAccountByNoAndPassword2);
//根据id删除账户
int deleteBankAccount = xAccountDAO2.deleteBankAccount(45);
sqlSession.commit();
System.out.println(deleteBankAccount);
}
10 使用别名来简化SQL定义文件的编写
主配置文件中添加,之后sql定义文件中resultType返回com.xdl.bean.XdlBankAccount这个类型
的都可以简写为account
<typeAliases>
<typeAlias type="com.xdl.bean.XdlBankAccount" alias="account"/>
</typeAliases>
11 当数据库中的字段名 和 实体类中的成员变量不一致时 如何处理?
11.1 使用别名 来修改sql语句 给表中的字段起别名
11.2 使用ResultMap处理,type为select标签中真正返回的resultType
<!-- 假设实体类字段为accNo则需要ResultMap处理 -->
<select id="getBankAccountById2" parameterType="int"
resultMap="accountMap">
select * from xdl_bank_account where id = #{id}
</select>
<!-- 定义一个ResultMap 来说明表中的特殊字段-->
<resultMap type="com.xdl.bean.XdlBankAccount" id="accountMap">
<result column="acc_no" property="accNo"/>
</resultMap>
12.如何处理插入时候不能出现空值的情况(Oracl数据库 小坑)
sql定义文件中,通过jdbcType的方式允许一个字段可以出现空值
<!-- 增加银行账户 -->
<insert id="insertBankAccount"
parameterType="com.xdl.bean.XdlBankAccount">
insert into xdl_bank_account values(#{id},#{acc_no,jdbcType=VARCHAR},#{acc_password,jdbcType=VARCHAR},#{acc_money})
</insert>