1.Mybatis 的作用
完成基本的sql语句 和 存储过程 高级的对象关系映射(ORM) 框架
封装了几乎所有的 JDBC 代码 参数的手工设置 结果集的遍历
2.Mybatis 框架的主体构成
实体类 用来封装数据
SQL定义文件 定义sql语句的
主配置文件 配置连接数据库信息 和 加载SQL定义文件
框架API 通过SqlSession 来完成对应的功能。
3.Mapper 映射器的规则 (Mapper映射器的意思是 可以根据接口 自动生成实现类)
3.1 接口中的方法名 和 Mapper 文件中 id 保持一致
32 接口方法的参数 和 parameterType 保持一致 如果没有 parameterType
则参数可以根据实际情况自由设计。
3.3 方法的返回值 和 resultType 尽量一致
如果select 最多返回一个值 则 resultType 保持完全一致
如果select 可能返回 多个值 则返回 List<resultType>
DML(insert delete update) 可以设计成void 也可以返回 int
3.4 Mapper文件 中 namespace 必须是 包名.接口名
4.为了简化 类型的编写 可以给类型起别名
<configuration>
<typeAliases>
<typeAlias type="com.xdl.bean.XdlBankAccount" alias="account"/>
</typeAliases>
5. 当数据库中的字段名 和 bean 的属性名不一致时如何处理?
5.1 通过给数据库中的字段 起别名来解决
5.2 使用 resultMap 来 指定数据库字段 和 bean 中属性的对应关系
下面说一下Mybaties的变成步骤:
首先还是导入Mybaties.jar,和Ojdbc的包,
拷贝一个slqMapper配置文件到类路径下:
<?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> <!-- typeAliases开启别名标注 --> <typeAliases> <typeAlias type="cn.com.bean.BankAccount" /> </typeAliases> <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:@localhost:1521:XE" /> <property name="username" value="scott" /> <property name="password" value="tiger" /> </dataSource> </environment> </environments> <mappers> <mapper resource="cn/com/mapper/AccountMapper.xml" /> </mappers> </configuration>
创建一个映射包,cn.com.mapper,并创建一个账户的映射,用于存储sql语句
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="cn.com.Dao.BankAccountDAO"><!-- 命名空间必须和包名,类名相同 --> <!-- 定义SQL语句 --> <select id="findAccountById" parameterType="int" resultType="cn.com.bean.BankAccount"> select * from XDL_BANK_ACCOUNT where id=#{n} </select> <select id="findCount" resultType="int"> select count(*) from XDL_BANK_ACCOUNT </select> <select id="findAccountByNo" parameterType="java.lang.String" resultType="cn.com.bean.BankAccount"> select * from XDL_BANK_ACCOUNT where acc_no=#{n} </select> <select id="findAccountByName" parameterType="cn.com.bean.BankAccount" resultType="cn.com.bean.BankAccount"> select * from XDL_BANK_ACCOUNT where acc_no = #{acc_no} and acc_password = #{acc_password} </select> <select id="findAccountGtId" parameterType="int" resultType="cn.com.bean.BankAccount"> select * from XDL_BANK_ACCOUNT where id > #{id} </select> <select id="findAccountMinId" parameterType="int" resultType="cn.com.bean.BankAccount"> select * from XDL_BANK_ACCOUNT where id < #{id} </select> <select id="findAccountMinId2" parameterType="int" resultType="cn.com.bean.BankAccount"> select * from XDL_BANK_ACCOUNT where id <![CDATA[<]]> #{id} </select> <!-- 定义一个插入语句 --> <insert id="insertAccount" parameterType="cn.com.bean.BankAccount"> insert into XDL_BANK_ACCOUNT values (XDL_BANK_ACCOUNT_ID_SEQ.nextval,#{acc_no},#{acc_password},#{acc_money}) </insert> <delete id="deleteAccouontById" parameterType="int"> delete from XDL_BANK_ACCOUNT where id=#{id} </delete> <update id="updateAccountById" parameterType="cn.com.bean.BankAccount"> update XDL_BANK_ACCOUNT set acc_no=#{acc_no},acc_password=#{acc_password},acc_money=#{acc_money} where id=#{id} </update> <!-- 根据账号和密码查询银行账户 --> <select id="getAccountByAccNOAndPassword" resultType="cn.com.bean.BankAccount"> select * from XDL_BANK_ACCOUNT where acc_no=#{param1} and acc_password=#{param2} </select> <!-- <select id="getAccountByAccNOAndPassword2" resultType="cn.com.bean.BankAccount"> selsect * from XDL_BANK_ACCOUNT where acc_no=#{param1} and acc_password=#{param2} </select> --> <!-- 如果类型中的名字不相同 --> <resultMap type="cn.com.bean.BankAccount2" id="account2"> <result column="id" property="acc_id" /> </resultMap> <select id="getAccountByAccNOAndPassword2" resultMap="account2"> select * from XDL_BANK_ACCOUNT where acc_no=#{param1} and acc_password=#{param2} </select> </mapper>
这里面的特殊字符如大于号,小于号需要特殊处理:
< | < | 小于号 |
> | > | 大于号 |
& | & | 和 |
' | ’ | 单引号 |
" | " | 双引号 |
或者:
因为这个是xml格式的,所以不允许出现类似“>”这样的字符,但是都可以使用<![CDATA[ ]]>符号进行说明,将此类符号不进行解析
你的可以写成这个:
<![CDATA[ when min(starttime)<='12:00' and max(endtime)<='12:00' ]]>
接着上面的说,再写一个dao接口:
public interface BankAccountDAO { BankAccount findAccountById(int id); int updateAccountById(BankAccount acc); List<BankAccount> findAccountGtId(int id); BankAccount getAccountByAccNOAndPassword(String acc_no,String acc_password); BankAccount getAccountByAccNOAndPassword2(String acc_no,String acc_password); }
写一个工具类,以便后期我们创建SqlSession使用,
public class SqlSessionUtil { private static SqlSessionFactory ssf = null; static { SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder(); InputStream inputs = BankSessionTest.class.getClassLoader().getResourceAsStream("sqlmap-config.xml"); ssf = ssfb.build(inputs); } public static SqlSession getSqlSession() { return ssf.openSession(); } }
好了,开始测试:
public static void main(String[] args) { BankAccountDAO dao=new BankAccounDaoIMP(); /*BankAccount acc=dao.findAccountById(46); System.out.println(acc);*/ /* int updateAccountById = dao.updateAccountById(new BankAccount(9, "han", "21345", 88888)); System.out.println(""+updateAccountById);*/ /*BankAccount accountd = dao.getAccountByAccNOAndPassword("1111", "2222"); System.out.println(accountd.toString()); */ // BankAccount accountBy = dao.getAccountByAccNOAndPassword2("1111", "2222"); // System.out.println(accountBy.toString()); BankAccount account = dao.getAccountByAccNOAndPassword2("1111", "2222"); System.out.println(account.toString()); }