Mybatis
指的是支持普通sql查询,存储过程和高级映射的优秀持久层框架。消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。
使用方法:
1.加入相关的jar包
2.创建一个实体类
package com.zhiyou100.ydb.bean; public class User { private int id; private String name; private int age; //创建对应的set get 方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //创建构造方法 public User(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } public User(String name, int age) { super(); this.name = name; this.age = age; } public User() { super(); } //重写toString方法 @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
3.添加Mybatis的配置文件 conf.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> <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>
4.修改配置文件
5.定义操作users表的sql映射文件 UserMapper.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.xml文件 --> <mapper namespace="com.zhiyou100.ydb.mapper.UserMapper"> <!-- 编写根据id查询的sql语句 根据id查询用户。id:标识该标签。 parameterType:参数类型。可以写 也可以省略 resultType:返回结果的类型。 #{id}:类似于EL表达式。 解析id的值 --> <select id="getUser" parameterType="int" resultType="com.zhiyou100.ydb.bean.User"> select * from users where id=#{id} </select> </mapper>
6.在conf.xml文件中引入UserMapper.xml文件
<mappers> <mapper resource="com/zhiyou100/ydb/mapper/UserMapper.xml"/> </mappers>
7.编写测试代码
package com.zhiyou100.ydb.test; import static org.junit.jupiter.api.Assertions.*; 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; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import com.zhiyou100.ydb.bean.User; class UserTest { static SqlSession session=null; final String str="com.zhiyou100.ydb.mapper.UserMapper"; @BeforeAll static void setUpBeforeClass() throws Exception { //解析配置文件 Reader reader = Resources.getResourceAsReader("conf.xml"); //获取session对象,表示Connection 用于操作数据库 SqlSessionFactory sessionFactory =new SqlSessionFactoryBuilder().build(reader); session = sessionFactory.openSession(); } @Test void SelectById() { User user = session.selectOne(str+".getUser",1); System.out.println(user); } @AfterAll static void tearDownAfterClass() throws Exception { session.commit();//提交数据,事务管理 } }
8.查询的条件不在实体类中时,可以将条件封装在map中,参数就可以写成map类型
<!-- 查询min-max区间内的User信息 参数可以使用map类型 --> <select id="getUser1" parameterType="map" resultType="com.zhiyou100.ydb.bean.User" > select * from users where age between #{min} and #{max} </select>
8的测试代码
@Test void SelectByage() { Map<String, Integer> map = new HashMap<>(); map.put("min", 10); map.put("max", 20); List<User> list = session.selectList(str+".getUser1", map); System.out.println(list); }
注意:如果xml中出现特殊字符可以使用转义字符 或者 例子:
<select id="getUser1" parameterType="map" resultType="com.zhiyou100.ydb.bean.User" > select * from users where age >= #{min} and age&lu= #{max}
<!-- 或者 -->
<![CDATA[select * from users where age >= #{min} and age <= #{max}]]> </select>
优化:(1)
1.建立User.properties 文件
2.将conf.xml 文件中的有关数据库信息取出,放入到User.properties 文件中
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
3.在conf.xml文件中引入User.properties 文件
<?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 resource="User.properties"></properties> <!----------------引入User.properties 文件-----------------> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <!-- value值 按照${}格式编写 --> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <mappers> <mapper resource="com/zhiyou100/ydb/mapper/UserMapper.xml"/> </mappers> </configuration>
优化:(2)
为实体类起别名
1.将如下代码加入到conf.xml文件中
2.意思是将 type 中的值 改名为 alias 中的值
<typeAliases> <typeAlias type="com.zhiyou100.ydb.bean.User" alias="User"/> </typeAliases>
为同包下的所有所有的实体类起别名 使用实体类时可以直接写实体类名
<typeAliases> <package name="com.zhiyou100.ydb.bean"/> </typeAliases>
注意:起别名不建议使用,建议还是在映射文件中使用全类名
优化:(3)
日志
加入日志jar包
建立log4j.properties文件 注意:名字一定要写log4j
将如下代码放入到log4j.properties文件中
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
运行结果如下: