mybatis1_MyBatis框架概述:
1. mybatis核心配置文件:
mybatis-config.xml
<?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>
<!--properties配置属性的元素,用于将内部的配置外在化,即通过外部配置来替换内部定义的属性; -->
<!--<properties resource="db.properties"></properties> -->
<!-- settings元素主要用于改变MyBatis运行时的行为,例如开启延迟加载等
mapUnderscoreToCamelCase:是否开启自动驼峰命名规则,默认值是false;
cacheEnabled:开启缓存,默认值是false;
lazyLoadingEnabled: 延迟加载,默认值是false;
-->
<settings>
<!-- 控制台打印SQL语句 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<!--typeAliases元素给Java对象配置一个简短的名字即 配置别名 ;
package子元素:name属性用于指定被定义别名的包,该包中所有的类都被指定别名
typeAlias子元素:
type属性:被定义别名的类的完全限定名,也就是包名+类名
alias属性:自定义别名的值
如果没有指定alias,MyBatis默认会将类名首字母改为小写作为别名
别名不区分大小写,使用时注意重复-->
<typeAliases>
<typeAlias type="com.mybatis.entity.Student" alias="student"/>
</typeAliases>
<!--environments用于对环境进行配置,实际上也是数据源的配置,可以配置多个数据源,即多种数据库 -->
<environments default="development">
<!--environment可以定义多个,id属性用于定义环境的ID值,包含事务管理和数据源的配置信息 -->
<environment id="development">
<!-- transactionManager元素配置事务管理,type属性用于指定事务管理的方式,包括JDBC、MANAGED
JDBC:直接使用JDBC的提交和回滚设置
MANAGED:让容器管理事务,比如spring容器-->
<transactionManager type="JDBC"></transactionManager>
<!--dataSource元素配置数据源,type属性指定使用哪种数据源,包括UNPOOLED、POOLED、JNDI
UNPOOLED:每次请求时都需打开和关闭连接
POOLED:利用数据库连接池,第三方组件
JNDI:应用服务器内置
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--mappers元素用于指定映射文件的位置 -->
<mappers>
<!-- 通过类路径指定 -->
<mapper resource="com/mybatis/mapper/StudentMapper.xml"/>
<!-- 通过本地路径指定 -->
<!-- <mapper url="D:/..."/> -->
<!-- 通过接口指定 ,注意:接口与映射文件的名称要保持一致,并且在同一目录-->
<!-- <mapper class="接口的完全限定名"/> -->
<!-- 通过包名指定,可以理解为批量引入 -->
<!-- <package name="包名"/> -->
</mappers>
</configuration>
2. mybatis核心xml配置文件:
StudentMapper.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属性是为了指定唯一命名空间,通常设置成"包名+映射文件名"的形式 -->
<mapper namespace="com.mybatis.mapper.StudentMapper">
<!-- select元素用于映射查询语句,也可以理解为读取数据库中的数据
id:唯一标识符,经常与namespace组合起来使用,如果不唯一,MyBatis会报异常;
parameterType: 传入SQL语句的参数类型(完全限定名或者别名);
resultType:SQL语句执行后返回的类型(完全限定名或者别名);
resultMap: 对resultMap元素进行引用;注意:返回类型时使用resultMap或resultType
timeout: 设置超时参数,单位是秒,如果超时将报异常
-->
<!-- insert元素用于映射插入语句,执行完SQL语句会返回一个表示插入记录数的整数,特有属性如下:
keyProperty:它只针对插入和修改操作,将添加和修改执行SQL语句的返回值赋值给Java对象的某一个属性(主键对应的属性);
keyColumn:它只针对插入和修改操作,设置表的主键位于第几列,当第一列不是主键时需要配置;
useGeneratedKeys:它只针对插入和修改操作,MyBatis使用JDBC的getGeneratedKeys()获取主键,默认是false;
-->
<!-- update元素用于映射修改语句,基本属性与select元素一样,执行完SQL语句会返回一个表示插入记录数的整数,特有属性与insert元素一致 -->
<!-- delete元素用于映射删除语句,基本属性与select元素一样,执行完SQL语句会返回一个表示插入记录数的整数 -->
<!-- sql元素可以更加灵活地定义可重用的SQL代码片段,然后在其他元素中引用该片段-->
<!-- resultMap元素 -->
<sql id="table">id,stuNum,name</sql>
<!-- 相当于JDBC中的预编译 -->
<select id="selectAllStudents" resultType="student" >
<!-- select * from student -->
<!-- include元素的refid属性引用了自定义的代码片段,它的值就是sql元素的id值 -->
select <include refid="table"></include> from student
</select>
<!-- 查询id的学生信息 -->
<select id="selectOneStudent" resultType="student">
<!--${value} -->
select * from student where id=#{id}
</select>
<!-- 查询id大于1的学生 -->
<select id="selectStudents" resultType="student">
select * from student where id> #{id}
</select>
<!-- 根据name模糊查询学生信息 -->
<select id="selectStudentss" resultType="student">
select * from student where name like concat('%',#{name},'%')
</select>
<!-- 添加学生 -->
<insert id="addStudent" parameterType="student" useGeneratedKeys="true" keyProperty="id">
insert into student (stuNum,name) values (#{stuNum},#{name})
</insert>
<!-- 删除学生 -->
<delete id="deleteStudent" parameterType="java.lang.Integer">
delete from student where id=#{id}
</delete>
<!-- 修改学生 -->
<update id="updateStudent" parameterType="student">
update student set stuNum=#{stuNum},name=#{name} where id=#{id}
</update>
</mapper>
UserMapper.xml
<mapper namespace="com.mybatis.mapper.UserMapper">
<resultMap type="user" id="usermap">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="address" column="address"/>
<!-- 嵌套结果集查询 -->
<collection property="orders" ofType="orders">
<id property="id" column="oid"/>
<result property="number" column="number"/>
</collection>
</resultMap>
<select id="findUserById" resultMap="usermap">
<!-- 嵌套结果集查询 -->
select u.*,o.id oid,o.number number from user u,orders o
where u.id=o.uid and u.id=#{id}
</select>
</mapper>
对学生进行增删改查(测试类)(第一种方式)
public class TestStudent {
public static void main(String[] args) {
selectAllStudents();
//selectOneStudent();
//selectStudents();
//selectStudentss();
//addStudent();
//deleteStudent();
//updateStudent();
//test();
}
/*
* 根据id查询学生
*/
public static void selectOneStudent() {
SqlSession session=null;
try {
session = MybatisUtil.getSqlSession();
//执行SQL语句,selectOne()第一个参数的值是映射文件中mapper元素的namespace值+select元素id值
Student student = session.selectOne("morning.selectOneStudent",3);
System.out.println(student);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();
}
}
/*
* 修改学生
*/
public static void updateStudent() {
SqlSession session=null;
try {
session = MybatisUtil.getSqlSession();
//执行SQL语句,
Student student = session.selectOne("morning.selectOneStudent",3);
student.setName("大山");
int result = session.update("morning.updateStudent", student);
if(result>0){
System.out.println("修改成功");
}
session.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();
}
}
/*
* 删除学生
*/
public static void deleteStudent() {
SqlSession session=null;
try {
session = MybatisUtil.getSqlSession();
//执行SQL语句,
int result = session.delete("morning.deleteStudent", 13);
if(result>0){
System.out.println("删除成功");
}
session.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();
}
}
/*
* 添加学生
*/
public static void addStudent() {
SqlSession session=null;
try {
session = MybatisUtil.getSqlSession();
//执行SQL语句,selectList()第一个参数的值是映射文件中mapper元素的namespace值+select元素id值
Student student=new Student("12", "小强");
int result = session.insert("morning.addStudent",student);
if(result>0){
System.out.println("添加成功");
}
session.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();
}
}
/*
* 根据name模糊查询学生信息
*/
public static void selectStudentss() {
SqlSession session=null;
try {
session = MybatisUtil.getSqlSession();
//执行SQL语句,selectList()第一个参数的值是映射文件中mapper元素的namespace值+select元素id值
List<Student> list = session.selectList("morning.selectStudentss","小");
for (Student student : list) {
System.out.println(student);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();
}
}
/*
* 查询id>1的学生信息
*/
public static void selectStudents() {
SqlSession session=null;
try {
session = MybatisUtil.getSqlSession();
//执行SQL语句,selectList()第一个参数的值是映射文件中mapper元素的namespace值+select元素id值
List<Student> list = session.selectList("morning.selectStudents",1);
for (Student student : list) {
System.out.println(student);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();
}
}
/*
* 查询所有学生
*/
public static void selectAllStudents() {
SqlSession session=null;
try {
session = MybatisUtil.getSqlSession();
//执行
List<Student> list = session.selectList("com.mybatis.mapper.StudentMapper.selectAllStudents");
for (Student student : list) {
System.out.println(student);
}
} catch (Exception e) {
// TODO Auto-generated catch block0
e.printStackTrace();
}finally{
session.close();
}
}
}
mybatis的主要结构
public class MybatisUtil {
private static SqlSessionFactory sessionFactory;
static {
try {
//1.加载或读取mybatis配置文件 Configuration类
InputStream input =
Resources.getResourceAsStream("mybatis-config.xml");
//2.使用SqlSessionFactoryBuilder创建SQLSessionFactory实例
sessionFactory = new SqlSessionFactoryBuilder().build(input);
input.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession() {
//3.产生SqlSession对象
return sessionFactory.openSession();
}
mybatis2_MyBatis的CRUD操作:
通过创建一个接口,映射文件没有变化
学生接口
public interface StudentMapper {
/*
* 映射器接口与映射文件的注意事项:
* 1、Mapper接口的全限定名为映射文件的namespace的值;
* 2、Mapper接口的方法名称和映射文件中定义的每个sql的id相同;
* 3、Mapper接口的方法参数和映射文件中定义每个sql的parameterType类型相同;
* 4、Mapper接口的方法返回的单个对象类型和映射文件中定义的每个sql的resultType类型相同;
*/
public List<Student> selectAllStudents();
public boolean deleteStudent(Integer id);
public boolean addStudent(Student student);
public boolean updateStudent(Student student);
public Student selectOneStudent(Integer id);
}
使用GetMapper方法实现增删改查(第二种方式:执行session.getMapper(*.class)方法获取代理对象)
public class TestStudentByGetMapper {
public static void main(String[] args) {
//selectAllStudents();
selectStudentById();
//deleteStudent(4);
//addStudent();
//updateStudent();
}
public static void selectStudentById() {
SqlSession session=null;
try {
session = MybatisUtil.getSqlSession();
StudentMapper mapper = session.getMapper(com.mybatis.mapper.StudentMapper.class);
Student student = mapper.selectOneStudent(8);
System.out.println(student);
} catch (Exception e) {
e.printStackTrace();
}finally{
session.close();
}
}
public static void updateStudent() {
SqlSession session=null;
try {
session = MybatisUtil.getSqlSession();
//执行SQL语句,
Student student = session.selectOne("com.mybatis.mapper.StudentMapper.selectOneStudent",8);
student.setName("大山");
StudentMapper mapper = session.getMapper(com.mybatis.mapper.StudentMapper.class);
boolean result = mapper.updateStudent(student);
if(result){
System.out.println("修改成功");
}
session.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();
}
}
public static void addStudent() {
SqlSession session=null;
try {
session = MybatisUtil.getSqlSession();
//执行session.getMapper(*.class)方法获取代理对象
StudentMapper mapper = session.getMapper(com.mybatis.mapper.StudentMapper.class);
Student student=new Student("0007","小蕾");
boolean result = mapper.addStudent(student);
if(result){
System.out.println("添加成功");
}
session.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();
}
}
public static void deleteStudent(Integer id) {
SqlSession session=null;
try {
session = MybatisUtil.getSqlSession();
//执行session.getMapper(*.class)方法获取代理对象
StudentMapper mapper = session.getMapper(com.mybatis.mapper.StudentMapper.class);
boolean result = mapper.deleteStudent(id);
if(result){
System.out.println("删除成功");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();
}
}
public static void selectAllStudents() {
SqlSession session=null;
try {
session = MybatisUtil.getSqlSession();
//执行session.getMapper(*.class)方法获取代理对象
StudentMapper mapper = session.getMapper(com.mybatis.mapper.StudentMapper.class);
List<Student> list =mapper.selectAllStudents();
for (Student student : list) {
System.out.println(student);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();
}
}
补充:resultMap元素
<!-- resultMap元素:定义映射规则,级联,
当实体类中的属性与数据库表中的字段不一致时,可以使用resultMap元素进行处理
id:唯一标识符
type: 映射的POJO(完全限定名)-->
<resultMap type="com.mybatis.entity.Student" id="resultMap">
<id property="id" column="id" />
<result property="t_stuNum" column="stuNum"/>
<result property="name" column="name"/>
</resultMap>