一、Mybatis架构
JAR包下载地址
1、 mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
6、 Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
7、 Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
二、入门程序
1.classPath下进行sqlMapConfig.xml文件的配置(SqlMapConfig.xml是mybatis核心配置文件)
1 xml version="1.0" encoding="UTF-8" ?> 2 DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 7 8 <properties resource="db.properties"> 9 10 11 properties> 12 13 <settings> 14 15 <setting name="lazyLoadingEnabled" value="true" /> 16 17 <setting name="aggressiveLazyLoading" value="false" /> 18 settings> 19 20 21 <typeAliases> 22 23 24 25 26 <package name="cn.itcast.mybatis.po" /> 27 typeAliases> 28 29 30 <environments default="development"> 31 <environment id="development"> 32 33 <transactionManager type="JDBC" /> 34 35 <dataSource type="POOLED"> 36 <property name="driver" value="${jdbc.driver}" /> 37 <property name="url" value="${jdbc.url}" /> 38 <property name="username" value="${jdbc.username}" /> 39 <property name="password" value="${jdbc.password}" /> 40 dataSource> 41 environment> 42 environments> 43 44 <mappers> 45 <mapper resource="sqlmap/User.xml" /> 46 47 48 49 50 52 53 54 56 <package name="cn.itcast.mybatis.mapper" /> 57 58 mappers> 59 60 configuration>
2.定义po类(User.java)
1 package cn.itcast.mybatis.po; 2 3 import java.util.Date; 4 import java.util.List; 5 6 public class User { 7 8 //属性名和数据库表的字段对应 9 private int id; 10 private String username;// 用户姓名 11 private String sex;// 性别 12 private Date birthday;// 生日 13 private String address;// 地址 14 //用户创建的订单列表 15 private ListordersList; 16 17 public List getOrdersList() { 18 return ordersList; 19 } 20 public void setOrdersList(List ordersList) { 21 this.ordersList = ordersList; 22 } 23 public int getId() { 24 return id; 25 } 26 public void setId(int id) { 27 this.id = id; 28 } 29 public String getUsername() { 30 return username; 31 } 32 public void setUsername(String username) { 33 this.username = username; 34 } 35 public String getSex() { 36 return sex; 37 } 38 public void setSex(String sex) { 39 this.sex = sex; 40 } 41 public Date getBirthday() { 42 return birthday; 43 } 44 public void setBirthday(Date birthday) { 45 this.birthday = birthday; 46 } 47 public String getAddress() { 48 return address; 49 } 50 public void setAddress(String address) { 51 this.address = address; 52 } 53 @Override 54 public String toString() { 55 return "User [id=" + id + ", username=" + username + ", sex=" + sex 56 + ", birthday=" + birthday + ", address=" + address + "]"; 57 } 58 59 60 }
3.创建mapper映射文件(User.xml)
1 xml version="1.0" encoding="UTF-8" ?> 2 DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 6 7 <mapper namespace="test"> 8 9 10 11 14 <select id="findUserById" parameterType="int" 15 resultType="cn.itcast.mybatis.po.User"> 16 select * from user where id=#{id} 17 select> 18 19 21 <select id="findUserByName" parameterType="java.lang.String" 22 resultType="cn.itcast.mybatis.po.User"> 23 select * from user where username like '%${value}%' 24 select> 25 26 <insert id="insertUser" 27 parameterType="cn.itcast.mybatis.po.User"> 28 31 <selectKey keyProperty="id" order="AFTER" 32 resultType="java.lang.Integer"> 33 SELECT LAST_INSERT_ID() 34 selectKey> 35 insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address}) 36 insert> 37 38 <delete id="deleteUser" parameterType="int"> 39 delete from user where id=#{id} 40 delete> 41 42 <update id="updateUser" parameterType="cn.itcast.mybatis.po.User"> 43 update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id = #{id} 44 update> 45 mapper>
4.在sqlMapConfig.xml加载映射文件,前面xml文件中已经加载
5.测试程序
1 package cn.itcast.mybatis.first; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.Date; 6 7 import org.apache.ibatis.io.Resources; 8 import org.apache.ibatis.session.SqlSession; 9 import org.apache.ibatis.session.SqlSessionFactory; 10 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 11 12 import cn.itcast.mybatis.po.User; 13 14 public class MybatisFirst { 15 public static void main(String[] args) throws IOException { 16 // mybatis配置文件 17 String resource = "sqlMapConfig.xml"; 18 // 得到配置文件流 19 InputStream inputStream = Resources.getResourceAsStream(resource); 20 // 创建会话工厂,传入mybatis文件的配置信息 21 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 22 // 通过工厂得到Sqlsession 23 SqlSession session = sqlSessionFactory.openSession(); 24 25 // 通过sqlsession操作数据库 26 27 // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id 28 // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数 29 // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象 30 // selectOne查询出一条记录 31 32 /* 33 * User user = session.selectOne("test.findUserById", 10); 34 * System.out.println(user); 35 * 36 * ListuserList = session.selectList("test.findUserByName", "张"); 37 * System.out.println(userList); 38 */ 39 40 User user = new User(); 41 user.setId(1); 42 user.setSex("2"); 43 user.setAddress("江苏南京"); 44 user.setUsername("王爱军"); 45 user.setBirthday(new Date()); 46 session.update("test.updateUser", user); 47 session.commit(); 48 // 释放资源 49 session.close(); 50 // System.out.println(user.getId()); 51 52 } 53 }
tips:
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
tips:mysql自增主键返回
1 4 <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> 5 select LAST_INSERT_ID() 6 selectKey> 7 insert into user(username,birthday,sex,address) 8 values(#{username},#{birthday},#{sex},#{address}); 9 insert> 10