MyBatis 简介、单条件查询、多条件查询、无条件查询、增删改操作-day09

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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值