一、Mybatis介绍
使用IDEA建maven工程,在pox.xml文件里下载相关依赖。
在pox.xml配置文件中加载lombok依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> </dependency>
<?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>
<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/mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
</configuration>
2.2、定义表所对应的实体类
//lombok依赖,自动封装get、set方法 @Data @AllArgsConstructor @NoArgsConstructor public class User { private int id; private String name; private int age; //get,set 方法 }
2.3定
<?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"> <mapper namespace="com.ykq.mybatis_test.test1.userMapper"> <select id="getUser" parameterType="int" resultType="com.ykq.mybatis_test.test1.User"> select * from users where id=#{id} </select> </mapper>
2.4 、
<mappers> <mapper resource="com/ykq/mybatis_test/test1/userMapper.xml"/> </mappers>
2.5、
public class Test { public static void main(String[] args) throws IOException { String resource = "conf.xml"; //加载 mybatis 的配置文件(它也加载关联的映射文件) Reader reader = Resources.getResourceAsReader(resource); //构建 sqlSession 的工厂 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); //创建能执行映射文件中 sql 的 sqlSession SqlSession session = sessionFactory.openSession(); //映射 sql 的标识字符串 String statement = "com.atguigu.mybatis.bean.userMapper"+".selectUser"; //执行查询返回一个唯一 user 对象的 sql User user = session.selectOne(statement, 1); System.out.println(user); } }
3、
Map传递参数,直接在sql中取出key即可!
对象传递参数,直接在sql中取对象的属性即可!
只有一个基本类型参数的情况下,可以直接在sql中取到!
多个参数用Map,或者注解!
模糊查询怎么写?
1.Java代码执行的时候,传递通配符% %
List<user> userList = mapper. getuserLike("%李%");
2.在sql拼接中使用通配符!
select * from mybatis.user where name like %"#{value] "%""
<insert id="insertUser" parameterType="com.ykq.ibatis.bean.User"> insert into users(name, age) values(#{name}, #{age}); </insert> <delete id="deleteUser" parameterType="int"> delete from users where id=#{id} </delete> <update id="updateUser" parameterType="com.ykq.ibatis.bean.User"> update users set name=#{name},age=#{age} where id=#{id} </update> <select id="selectUser" parameterType="int" resultType="com.ykq.ibatis.bean.User"> select * from users where id=#{id} </select> <select id="selectAllUsers" resultType="com.ykq.ibatis.bean.User"> select * from users </select>
<mappers> <mapper resource="com/ykq/mybatis_test/test1/userMapper.xml"/> </mappers>
通过调用dao层方法
/** * 查询所有 * @return */ List<User> selectAllUser(); //添加 int insertUser(User user); //修改 int updateUser(User user); //删除 int deleteUser(int id);
<mapper namespace="com.fyx.dao.UserDao"> <select id="selectAllUser" parameterType="int" resultType="com.fyx.entity.User"> select * from user; </select> <insert id="insertUser"> insert into user values(#{id},#{username},#{password}); </insert> <update id="updateUser"> update user set username=#{username},password=#{password} where id=#{id}; </update> <delete id="deleteUser"> delete from user where id=#{id}; </delete> </mapper>
测试
public class UserTest { public static void main(String[] args) throws IOException { //加载mybatis配置文件 Reader asReader = Resources.getResourceAsReader("mybatis.xml"); //构建工厂 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(asReader); //创建能执行映射文件中华sql的sqlSession SqlSession sqlSession = sessionFactory.openSession(); //提高反射获取dao查询方法 UserDao userDao = sqlSession.getMapper(UserDao.class); List<User> users = userDao.selectAllUser(); System.out.println(users); int i = userDao.insertUser(new User(3,"1112","1125")); System.out.println(i); int i1 = userDao.updateUser(new User(2, "hahaha", "55555")); System.out.println(i1); int i2 = userDao.deleteUser(123128); System.out.println(i2); sqlSession.commit();//提交事务 } }
4、mybatis的一些优化
(1)把数据源信息抽取到properties文件中(跟以前使用JDBC一样,连接将数据库信息存放在properties文件中)
第一步:创建properties文件内容:
第二步:在配置文件中引入该properties文件
4.2添加日志信息--打印sql语句
(1)先引入日志jar包
(2)创建日志的配置文件 log4j.properties
log4j.rootLogger=DEBUG, Console #Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.logger.java.sql.ResultSet=INFO log4j.logger.org.apache=INFO log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG
(3)测试
4.3为实体类起别名
(1)在mybatis配置文件中设置别名
(2)在映射文件文件中使用别名
5、
(2)使用resultMap来创建属性与字段的映射关系
6、mybatis联表查询
(1)多对一(表与表之间的关系------->外键【逻辑外键】)
CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20) ); //teacher class 一对多 CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VARCHAR(20), teacher_id INT -- 外键 ); ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id); INSERT INTO teacher(t_name) VALUES('LS1'); INSERT INTO teacher(t_name) VALUES('LS2'); INSERT INTO class(c_name, teacher_id) VALUES('bj_a', 1); INSERT INTO class(c_name, teacher_id) VALUES('bj_b', 2);
(2)java实体类如何维持这种关系。
Teacher {tid, tname} Class {cid,cname,Teacher teacher}---->class 只包含老师id号。 多对一 可以在多的实体中添加一的实体类对象。
1.创建实体类
2.写映射文件
通过两次查询得到相应的结果
一对多
CREATE TABLE student( s_id INT PRIMARY KEY AUTO_INCREMENT, s_name VARCHAR(20), class_id INT ); INSERT INTO student(s_name, class_id) VALUES('xs_A', 1); INSERT INTO student(s_name, class_id) VALUES('xs_B', 1); INSERT INTO student(s_name, class_id) VALUES('xs_C', 1); INSERT INTO student(s_name, class_id) VALUES('xs_D', 2); INSERT INTO student(s_name, class_id) VALUES('xs_E', 2); INSERT INTO student(s_name, class_id) VALUES('xs_F', 2);
要求 根据班级id查询班级信息以及该班级下所有的学生信息。
1.创建实体类
xml 碰到特殊字符如何处理:
(1)可以使用转移字符;
出现异常处理:
(1)
使用单元测试@Test
在pox.xml配置文件加载依赖
(2)数据库连接时区问题
(3)异常:映射文件未绑定到配置文件中.