优于jdbc的mybatis框架入门
1.什么是mybatis?
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。 MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO( Plain Old Java Objects,普通的Java 对象)映射成数据库中的记录.
1)MyBATIS 目前提供了三种语言实现的版本,包括:Java、.NET以及Ruby。(我主要学习java,就讲java的使用)
2)它提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
3)mybatis与hibernate的对比?
mybatis提供一种“半自动化”的ORM实现。
这里的“半自动化”,是相对Hibernate等提供了全面的数据库封装机制的“全自动化”ORM实现而言,“全自动”ORM实现了POJO和数据库表之间的映射,以及 SQL 的自动生成和执行。
而mybatis的着力点,则在于POJO与SQL之间的映射关系
2.结构目录详情:
3.设置配置文件如下:
<?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> <!-- 此处的alias是指的别名,对应实体类的别名;在“type”中最好加入全路径 --> <typeAliases> <!-- 别名方式1,一个一个的配置 type中放置的是类的全路径,alias中放置的是类别名--> <typeAlias alias="City" type="mybatis.City"/> <!-- 别名方式2,自动扫描,将JAVA类的类名作为类的类别名 <package name="com.wenyin.mybatis.beans"/> --> </typeAliases> <!-- 环境配置,连接数据库需要的ip、用户名、密码等 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/City" /> <property name="username" value="root"/> <property name="password" value="admin"/> </dataSource> </environment> </environments> <mappers> <!-- 告知映射文件方式1,一个一个的配置,配置时使用全路径--> <mapper resource="mybatis/CityMapper.xml"/> <!-- 告知映射文件方式2,自动扫描包内的Mapper接口与配置文件 <package name="com/wenyin/mybatis/mapper"/> --> </mappers> </configuration>
4.建立对应的实体类:
package mybatis; public class City { public int ID; public String Name; public String CountryCode; public String District; public int Population; public int getID() { return ID; } public void setID(int iD) { ID = iD; } public String getName() { return Name; } public void setName(String name) { Name = name; } public String getCountryCode() { return CountryCode; } public void setCountryCode(String countryCode) { CountryCode = countryCode; } public String getDistrict() { return District; } public void setDistrict(String district) { District = district; } public int getPopulation() { return Population; } public void setPopulation(int population) { Population = population; } @Override public String toString() { return "World [ID=" + ID + ", Name=" + Name + ", CountryCode=" + CountryCode + ", District=" + District + ", Population=" + Population + "]"; } }
5.配置CityMapper.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"> <!-- namespace对应Cofiguration中的resource,但是后缀名不用加 --> <mapper namespace="mybatis.CityMapper"> <!-- --> <select id="selectCityByCountryCode" parameterType="String" resultType="City"> select * from city where CountryCode = #{CountryCode} </select> </mapper>
6.测试类进行测试:
package mybatis; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MybatisDemo { public static void main(String[] args) throws IOException { //mybatis的配置文件 String resource = "mybatis/Configuration.xml"; //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件) Reader conf = Resources.getResourceAsReader(resource); //构建sqlSession的工厂 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(conf); //创建能执行映射文件中sql的sqlSession SqlSession session = sessionFactory.openSession(); /** * 映射sql的标识字符串, * mybatis.CityMapper是CityMapper.xml文件中mapper标签的namespace属性的值, * selectCityByCountryCode是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL */ String statement = "mybatis.CityMapper.selectCityByCountryCode";//映射sql的标识字符串 //执行查询返回一个唯一City对象的sql City wo = session.selectOne(statement, "ANT"); System.out.println(wo); } }
=====================================================================================================
使用接口:
新建一个接口类,CityInterface
package inter; import mybatis.City; public interface CityInterface { public abstract City selectCityByCountryCode(String CountryCode); }
此时需要修改CityMapper.xml中的namespace的值,namespace的值必须为对应的接口类的全路径
<mapper namespace="inter.CityInterface"> <!-- --> <select id="selectCityByCountryCode" parameterType="String" resultType="City"> select * from city where CountryCode = #{CountryCode} </select> </mapper>
修改测试类:
package mybatis; import inter.CityInterface; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MybatisDemo { public static void main(String[] args) throws IOException { //mybatis的配置文件 String resource = "mybatis/Configuration.xml"; //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件) Reader conf = Resources.getResourceAsReader(resource); //构建sqlSession的工厂 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(conf); //创建能执行映射文件中sql的sqlSession SqlSession session = sessionFactory.openSession(); CityInterface cityInter = session.getMapper(CityInterface.class); City city = cityInter.selectCityByCountryCode("ANT"); System.out.println(city); } }
========================================================================================
实现数据的增删改查:
前面已经讲到用接口的方式编程。如果不一致就会出错,这一章主要在上一讲基于接口编程的基础上完成如下事情:
1. 用 mybatis 查询数据,包括列表
2. 用 mybatis 增加数据
3. 用 mybatis 更新数据.
4. 用 mybatis 删除数据.
查询数据,前面已经讲过简单的,主要看查询出列表,也就是返回list, 在我们这个例子中也就是 List<City> , 这种方式返回数据,需要在CityMapper.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的:
<?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"> <!-- namespace对应Cofiguration中的resource,但是后缀名不用加 --> <mapper namespace="inter.CityInterface"> <!-- 制定返回值类型为map,其中jdbcType对应的是数据库中字段类型,从数据库中取出数据时,自动封装成相应的类型 否则取出的都是String型 --> <resultMap type="City" id="resultListCity"> <id column="ID" property="ID" jdbcType="INTEGER"/> <result column="Name" property="Name" jdbcType="CHAR"/> <result column="CountryCode" property="CountryCode" jdbcType="CHAR"/> <result column="District" property="District" jdbcType="CHAR"/> <result column="Population" property="Population" jdbcType="INTEGER"/> </resultMap> <select id="selectCityByCountryCode" parameterType="String" resultMap="resultListCity"> select * from city where CountryCode = #{CountryCode} </select> </mapper>
接口中增加方法返回类型是List<City>的方法:
package inter; import java.util.List; import mybatis.City; public interface CityInterface { public abstract List<City> selectCityByCountryCode(String CountryCode); }
修改测试类如下:
package mybatis; import inter.CityInterface; import java.io.IOException; import java.io.Reader; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MybatisDemo { public static void main(String[] args) throws IOException { //mybatis的配置文件 String resource = "mybatis/Configuration.xml"; //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件) Reader conf = Resources.getResourceAsReader(resource); //构建sqlSession的工厂 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(conf); //创建能执行映射文件中sql的sqlSession SqlSession session = sessionFactory.openSession(); CityInterface cityInter = session.getMapper(CityInterface.class); List<City> city = cityInter.selectCityByCountryCode("AFG"); // System.out.println(city.get(0)); // System.out.println(city.get(1)); // System.out.println(city.get(2)); for(City c : city){ System.out.println(c); } } }